summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKim Kibum <kb0929.kim@samsung.com>2012-04-29 17:01:58 +0900
committerKim Kibum <kb0929.kim@samsung.com>2012-04-29 17:01:58 +0900
commitb5a98c405476f655e265993997afb9e8772f47e5 (patch)
treed8e5a27d44644e695939bab7368949f1160bcd35
parent16c0e855d5d0cdd31886fe57e867732625aa17f8 (diff)
downloadsync-agent-2.0alpha.tar.gz
sync-agent-2.0alpha.tar.bz2
sync-agent-2.0alpha.zip
-rwxr-xr-xCMakeLists.txt22
-rwxr-xr-xdebian/changelog7
-rwxr-xr-xdebian/compat1
-rwxr-xr-xdebian/control29
-rwxr-xr-xdebian/control.slp7
-rwxr-xr-xdebian/dirs2
-rwxr-xr-xdebian/libsync-agent-framework-dev.install2
-rwxr-xr-xdebian/libsync-agent-framework-dev.postinst4
-rwxr-xr-xdebian/libsync-agent-framework.install1
-rwxr-xr-xdebian/rules104
-rwxr-xr-xdebian/unit_test.sh32
-rw-r--r--framework/.cproject250
-rw-r--r--framework/.project78
-rwxr-xr-xframework/CMakeLists.src23
-rwxr-xr-xframework/CMakeLists.sub67
-rwxr-xr-xframework/CMakeLists.txt119
-rwxr-xr-xframework/include/Account/Account_Error.h61
-rwxr-xr-xframework/include/Account/Account_Mgr.h106
-rwxr-xr-xframework/include/Account/Account_Util.h85
-rwxr-xr-xframework/include/DataAdapter/DACI_Agent.h839
-rwxr-xr-xframework/include/DataAdapter/DACI_Agent_Handler_Manager.h788
-rwxr-xr-xframework/include/DataAdapter/DACI_Agent_Mgr.h108
-rwxr-xr-xframework/include/DataAdapter/DACI_ChangeLog.h126
-rwxr-xr-xframework/include/DataAdapter/DACI_Common.h359
-rwxr-xr-xframework/include/DataAdapter/DACI_Luid.h71
-rwxr-xr-xframework/include/DataAdapter/DACI_Service.h302
-rwxr-xr-xframework/include/DataAdapter/EXT_DACI_Converter.h118
-rwxr-xr-xframework/include/DataAdapter/EXT_DACI_Errors.h81
-rwxr-xr-xframework/include/Device/EXT_DCI_Common.h75
-rwxr-xr-xframework/include/Device/EXT_DCI_DevExecutor.h79
-rwxr-xr-xframework/include/Device/EXT_DCI_DevInfo.h95
-rwxr-xr-xframework/include/Device/EXT_DCI_Errors.h55
-rw-r--r--framework/include/EngineController/engine_controller.h132
-rw-r--r--framework/include/EngineController/engine_controller_define.h107
-rw-r--r--framework/include/EngineController/engine_controller_internal.h85
-rw-r--r--framework/include/EngineController/engine_controller_message.h142
-rw-r--r--framework/include/EngineController/fundamental_type.h151
-rw-r--r--framework/include/EngineController/graph_edge_pool.h53
-rw-r--r--framework/include/EngineController/hash_set.h56
-rw-r--r--framework/include/EngineController/param.h74
-rw-r--r--framework/include/EngineController/param_spec.h251
-rw-r--r--framework/include/EngineController/param_spec_internal.h125
-rw-r--r--framework/include/EngineController/param_value.h83
-rw-r--r--framework/include/EngineController/queuing_rule_spec.h85
-rw-r--r--framework/include/EngineController/queuing_rule_spec_internal.h116
-rw-r--r--framework/include/EngineController/queuing_rule_spec_pool.h65
-rw-r--r--framework/include/EngineController/task.h146
-rw-r--r--framework/include/EngineController/task_cancel_info.h84
-rw-r--r--framework/include/EngineController/task_error.h65
-rw-r--r--framework/include/EngineController/task_info_pool.h77
-rw-r--r--framework/include/EngineController/task_message.h76
-rw-r--r--framework/include/EngineController/task_pool.h61
-rw-r--r--framework/include/EngineController/task_process.h229
-rw-r--r--framework/include/EngineController/task_spec.h261
-rw-r--r--framework/include/EngineController/task_spec_internal.h147
-rw-r--r--framework/include/EngineController/thread_pool.h59
-rwxr-xr-xframework/include/Event/Event_Config.h81
-rwxr-xr-xframework/include/Event/Event_Data_Accessor.h103
-rwxr-xr-xframework/include/Event/Event_Error.h62
-rwxr-xr-xframework/include/Event/Event_Handler.h148
-rwxr-xr-xframework/include/Event/Event_Spec.h80
-rwxr-xr-xframework/include/Event/Event_UI_API.h121
-rw-r--r--framework/include/Event/Event_Util.h49
-rw-r--r--framework/include/FSAPI/FSAPI_operation.h216
-rw-r--r--framework/include/FSAPI/FSAPI_util.h47
-rwxr-xr-xframework/include/Initialization/initialize.h74
-rwxr-xr-xframework/include/Initialization/initialize_error.h72
-rwxr-xr-xframework/include/Initialization/initialize_parser.h47
-rwxr-xr-xframework/include/NetworkAccess/EXT_NA_NetworkStatus.h67
-rw-r--r--framework/include/NetworkAccess/IN_NA_FW_Callbacks.h60
-rwxr-xr-xframework/include/NetworkAccess/IN_NA_Session_Manager.h247
-rw-r--r--framework/include/NetworkAccess/NACI.h341
-rwxr-xr-xframework/include/NetworkAccess/NACI_Common.h54
-rwxr-xr-xframework/include/NetworkAccess/NACI_Errors.h72
-rwxr-xr-xframework/include/NetworkAccess/NA_External.h53
-rwxr-xr-xframework/include/NetworkAssistant/protocol_binder/protocol_binder.h242
-rwxr-xr-xframework/include/NetworkAssistant/protocol_binder/protocol_binder_common.h47
-rwxr-xr-xframework/include/NetworkAssistant/protocol_binder/protocol_binder_definition.h161
-rwxr-xr-xframework/include/NetworkAssistant/protocol_binder/protocol_binder_error.h84
-rwxr-xr-xframework/include/NetworkAssistant/protocol_binder/protocol_binder_internal.h104
-rwxr-xr-xframework/include/NetworkAssistant/protocol_binder/protocol_binder_util.h321
-rwxr-xr-xframework/include/NetworkAssistant/protocol_binder/protocol_binder_util_internal.h151
-rwxr-xr-xframework/include/PlatformMonitor/EXT_PMCI.h162
-rwxr-xr-xframework/include/PlatformMonitor/EXT_PMCI_Common.h47
-rwxr-xr-xframework/include/PlatformMonitor/EXT_PMCI_Errors.h52
-rwxr-xr-xframework/include/PlatformMonitor/EXT_PMCI_Noti.h53
-rwxr-xr-xframework/include/PlatformMonitor/EXT_PMCI_Struct.h130
-rw-r--r--framework/include/PlugIn/DataConverter_Resource.h65
-rw-r--r--framework/include/PlugIn/PlatformMonitor_Resource.h57
-rwxr-xr-xframework/include/PlugIn/PlugIn_Account.h101
-rwxr-xr-xframework/include/PlugIn/PlugIn_DataConnector.h206
-rwxr-xr-xframework/include/PlugIn/PlugIn_DataConverter.h96
-rwxr-xr-xframework/include/PlugIn/PlugIn_DeviceInfo.h84
-rwxr-xr-xframework/include/PlugIn/PlugIn_Error.h51
-rwxr-xr-xframework/include/PlugIn/PlugIn_Interface/Account_Interface.h126
-rwxr-xr-xframework/include/PlugIn/PlugIn_Interface/DataConnector_Interface.h367
-rwxr-xr-xframework/include/PlugIn/PlugIn_Interface/DataConnector_Resource.h63
-rw-r--r--framework/include/PlugIn/PlugIn_Interface/DataConverter_Interface.h140
-rw-r--r--framework/include/PlugIn/PlugIn_Interface/DeviceInfo_Interface.h109
-rw-r--r--framework/include/PlugIn/PlugIn_Interface/NetworkAccess_Interface.h172
-rw-r--r--framework/include/PlugIn/PlugIn_Interface/PlatformMonitor_Interface.h185
-rwxr-xr-xframework/include/PlugIn/PlugIn_Mgr.h76
-rwxr-xr-xframework/include/PlugIn/PlugIn_NetworkAccess.h108
-rwxr-xr-xframework/include/PlugIn/PlugIn_PlatformMonitor.h158
-rwxr-xr-xframework/include/PlugIn/PlugIn_Struct.h49
-rwxr-xr-xframework/include/SyncAgent_Info.h64
-rw-r--r--framework/include/Utility/fw_alloc.h108
-rw-r--r--framework/include/Utility/fw_alloc_internal.h82
-rw-r--r--framework/include/Utility/fw_assert.h96
-rw-r--r--framework/include/Utility/fw_async_queue.h112
-rw-r--r--framework/include/Utility/fw_cache.h129
-rw-r--r--framework/include/Utility/fw_common.h71
-rw-r--r--framework/include/Utility/fw_compress.h78
-rw-r--r--framework/include/Utility/fw_list.h70
-rw-r--r--framework/include/Utility/fw_log.h152
-rw-r--r--framework/include/Utility/fw_mainloop.h49
-rw-r--r--framework/include/Utility/fw_ref.h110
-rw-r--r--framework/include/Utility/fw_sequential_id_provider.h156
-rw-r--r--framework/include/Utility/fw_sequential_id_provider_internal.h175
-rw-r--r--framework/include/Utility/fw_thread.h74
-rw-r--r--framework/include/Utility/fw_time.h63
-rw-r--r--framework/include/Utility/fw_timer.h71
-rwxr-xr-xframework/include/agent-framework/Account/Account_Error.h61
-rwxr-xr-xframework/include/agent-framework/DACI/DACI_Agent_Handler_Manager.h767
-rwxr-xr-xframework/include/agent-framework/DACI/DACI_Common.h359
-rwxr-xr-xframework/include/agent-framework/DACI/EXT_DACI_Errors.h81
-rwxr-xr-xframework/include/agent-framework/Device/EXT_DCI_Common.h75
-rwxr-xr-xframework/include/agent-framework/Device/EXT_DCI_DevExecutor.h79
-rwxr-xr-xframework/include/agent-framework/Device/EXT_DCI_DevInfo.h95
-rwxr-xr-xframework/include/agent-framework/Device/EXT_DCI_Errors.h55
-rw-r--r--framework/include/agent-framework/FSAPI/FSAPI_operation.h216
-rwxr-xr-xframework/include/agent-framework/NetworkAccess/EXT_NA_NetworkStatus.h67
-rwxr-xr-xframework/include/agent-framework/PlatformMonitor/EXT_PMCI_Struct.h130
-rwxr-xr-xframework/include/agent-framework/PlugIn/Account_Interface.h126
-rwxr-xr-xframework/include/agent-framework/PlugIn/DataConnector_Interface.h367
-rwxr-xr-xframework/include/agent-framework/PlugIn/DataConnector_Resource.h63
-rw-r--r--framework/include/agent-framework/PlugIn/DataConverter_Interface.h140
-rw-r--r--framework/include/agent-framework/PlugIn/DataConverter_Resource.h65
-rw-r--r--framework/include/agent-framework/PlugIn/DeviceInfo_Interface.h109
-rw-r--r--framework/include/agent-framework/PlugIn/NetworkAccess_Interface.h172
-rw-r--r--framework/include/agent-framework/PlugIn/PlatformMonitor_Interface.h185
-rw-r--r--framework/include/agent-framework/PlugIn/PlatformMonitor_Resource.h57
-rw-r--r--framework/include/agent-framework/Utility/fw_async_queue.h112
-rw-r--r--framework/include/agent-framework/Utility/fw_compress.h78
-rw-r--r--framework/include/agent-framework/Utility/fw_log.h152
-rwxr-xr-xframework/include/agent-framework/securityAssistant/EXT_SA_Encryption_Decryption.h94
-rwxr-xr-xframework/include/fw_define.h47
-rwxr-xr-xframework/include/securityAssistant/EXT_SA_Encryption_Decryption.h94
-rwxr-xr-xframework/include/securityAssistant/IN_SA_Cryptograhic_Hash_Function.h46
-rwxr-xr-xframework/include/securityAssistant/IN_SA_MD5.h73
-rwxr-xr-xframework/src/Account/Account_Mgr.c279
-rwxr-xr-xframework/src/Account/Account_Util.c144
-rwxr-xr-xframework/src/DataAdapter/DACI_Agent.c3138
-rwxr-xr-xframework/src/DataAdapter/DACI_Agent_Handler_Manager.c1181
-rwxr-xr-xframework/src/DataAdapter/DACI_Agent_Mgr.c571
-rwxr-xr-xframework/src/DataAdapter/DACI_ChangeLog.c641
-rwxr-xr-xframework/src/DataAdapter/DACI_Common.c142
-rwxr-xr-xframework/src/DataAdapter/DACI_Luid.c131
-rwxr-xr-xframework/src/DataAdapter/DACI_Service.c945
-rwxr-xr-xframework/src/DataAdapter/EXT_DACI_Converter.c191
-rwxr-xr-xframework/src/Device/EXT_DCI_DevExecutor.c87
-rwxr-xr-xframework/src/Device/EXT_DCI_DevInfo.c125
-rwxr-xr-xframework/src/EngineController/engine_controller.c680
-rwxr-xr-xframework/src/EngineController/engine_controller_message.c235
-rwxr-xr-xframework/src/EngineController/graph_edge_pool.c110
-rwxr-xr-xframework/src/EngineController/hash_set.c107
-rwxr-xr-xframework/src/EngineController/param.c74
-rwxr-xr-xframework/src/EngineController/param_spec.c560
-rwxr-xr-xframework/src/EngineController/param_value.c112
-rwxr-xr-xframework/src/EngineController/queuing_rule_spec.c647
-rwxr-xr-xframework/src/EngineController/queuing_rule_spec_pool.c141
-rwxr-xr-xframework/src/EngineController/task.c1033
-rwxr-xr-xframework/src/EngineController/task_cancel_info.c284
-rwxr-xr-xframework/src/EngineController/task_error.c64
-rwxr-xr-xframework/src/EngineController/task_info_pool.c194
-rwxr-xr-xframework/src/EngineController/task_message.c114
-rwxr-xr-xframework/src/EngineController/task_pool.c121
-rwxr-xr-xframework/src/EngineController/task_process.c88
-rwxr-xr-xframework/src/EngineController/task_spec.c1043
-rwxr-xr-xframework/src/EngineController/thread_pool.c169
-rwxr-xr-xframework/src/Event/Event_Config.c351
-rwxr-xr-xframework/src/Event/Event_Data_Accessor.c181
-rwxr-xr-xframework/src/Event/Event_Handler.c403
-rwxr-xr-xframework/src/Event/Event_UI_API.c348
-rw-r--r--framework/src/Event/Event_Util.c63
-rw-r--r--framework/src/FSAPI/FSAPI_operation.c692
-rw-r--r--framework/src/FSAPI/FSAPI_util.c61
-rwxr-xr-xframework/src/Initialization/initialize.c162
-rwxr-xr-xframework/src/Initialization/initialize_parser.c511
-rw-r--r--framework/src/NetworkAccess/IN_NA_FW_Callbacks.c119
-rwxr-xr-xframework/src/NetworkAccess/IN_NA_Session_Manager.c948
-rw-r--r--framework/src/NetworkAccess/NACI.c740
-rwxr-xr-xframework/src/NetworkAssistant/protocol_binder/protocol_binder.c1116
-rwxr-xr-xframework/src/NetworkAssistant/protocol_binder/protocol_binder_util.c824
-rwxr-xr-xframework/src/PlatformMonitor/EXT_PMCI.c388
-rwxr-xr-xframework/src/PlugIn/PlugIn_Account.c163
-rwxr-xr-xframework/src/PlugIn/PlugIn_DataConnector.c482
-rwxr-xr-xframework/src/PlugIn/PlugIn_DataConverter.c181
-rwxr-xr-xframework/src/PlugIn/PlugIn_DeviceInfo.c148
-rwxr-xr-xframework/src/PlugIn/PlugIn_Mgr.c60
-rwxr-xr-xframework/src/PlugIn/PlugIn_NetworkAccess.c241
-rwxr-xr-xframework/src/PlugIn/PlugIn_PlatformMonitor.c297
-rwxr-xr-xframework/src/Utility/fw_alloc.c352
-rwxr-xr-xframework/src/Utility/fw_async_queue.c111
-rwxr-xr-xframework/src/Utility/fw_cache.c251
-rwxr-xr-xframework/src/Utility/fw_compress.c170
-rw-r--r--framework/src/Utility/fw_list.c84
-rwxr-xr-xframework/src/Utility/fw_log.c148
-rwxr-xr-xframework/src/Utility/fw_mainloop.c128
-rwxr-xr-xframework/src/Utility/fw_ref.c94
-rwxr-xr-xframework/src/Utility/fw_sequential_id_provider.c1111
-rwxr-xr-xframework/src/Utility/fw_thread.c86
-rwxr-xr-xframework/src/Utility/fw_time.c71
-rwxr-xr-xframework/src/Utility/fw_timer.c175
-rwxr-xr-xframework/src/securityAssistant/EXT_SA_Encryption_Decryption.c147
-rwxr-xr-xframework/src/securityAssistant/IN_SA_Cryptograhic_Hash_Function.c158
-rwxr-xr-xframework/src/securityAssistant/IN_SA_MD5.c233
-rwxr-xr-xframework/test/include/suites/unit_test_fw_alloc_suite.h15
-rwxr-xr-xframework/test/include/suites/unit_test_fw_log_suite.h15
-rwxr-xr-xframework/test/include/suites/unit_test_fw_sequential_id_provider_suite.h15
-rwxr-xr-xframework/test/include/suites/unit_test_protocol_binder_suite.h15
-rwxr-xr-xframework/test/include/suites/unit_test_sample_suite.h15
-rwxr-xr-xframework/test/include/unit_test_common.h16
-rwxr-xr-xframework/test/include/unit_test_run.h22
-rwxr-xr-xframework/test/include/unit_test_suites.h28
-rwxr-xr-xframework/test/src/fw_test_main.c14
-rwxr-xr-xframework/test/src/suites/unit_test_fw_alloc_suite.c105
-rwxr-xr-xframework/test/src/suites/unit_test_fw_log_suite.c49
-rwxr-xr-xframework/test/src/suites/unit_test_fw_sequential_id_provider_suite.c427
-rwxr-xr-xframework/test/src/suites/unit_test_protocol_binder.c253
-rwxr-xr-xframework/test/src/suites/unit_test_sample_suite.c55
-rwxr-xr-xframework/test/src/unit_test_run.c121
-rwxr-xr-xfw-plugin/CMakeLists.txt11
-rwxr-xr-xfw-plugin/account-plugIn/.cproject31
-rwxr-xr-xfw-plugin/account-plugIn/.project78
-rwxr-xr-xfw-plugin/account-plugIn/CMakeLists.src1
-rwxr-xr-xfw-plugin/account-plugIn/CMakeLists.sub38
-rwxr-xr-xfw-plugin/account-plugIn/CMakeLists.txt33
-rwxr-xr-xfw-plugin/account-plugIn/include/Account_Info.h51
-rwxr-xr-xfw-plugin/account-plugIn/src/PlugIn_Interface.c426
-rwxr-xr-xfw-plugin/calendar-plugIn/.cproject31
-rwxr-xr-xfw-plugin/calendar-plugIn/.project78
-rwxr-xr-xfw-plugin/calendar-plugIn/CMakeLists.src1
-rwxr-xr-xfw-plugin/calendar-plugIn/CMakeLists.sub37
-rwxr-xr-xfw-plugin/calendar-plugIn/CMakeLists.txt33
-rwxr-xr-xfw-plugin/calendar-plugIn/include/EXT_DataStore_Info_Calendar.h72
-rwxr-xr-xfw-plugin/calendar-plugIn/include/Extern_Info.h44
-rwxr-xr-xfw-plugin/calendar-plugIn/include/IN_DataStore_Info_Calendar.h80
-rwxr-xr-xfw-plugin/calendar-plugIn/include/Item_Change_Info.h43
-rwxr-xr-xfw-plugin/calendar-plugIn/src/Item_Change_Info.c54
-rwxr-xr-xfw-plugin/calendar-plugIn/src/PlugIn_Interface.c1208
-rwxr-xr-xfw-plugin/contact-plugIn/.cproject31
-rwxr-xr-xfw-plugin/contact-plugIn/.project78
-rwxr-xr-xfw-plugin/contact-plugIn/CMakeLists.src1
-rwxr-xr-xfw-plugin/contact-plugIn/CMakeLists.sub37
-rwxr-xr-xfw-plugin/contact-plugIn/CMakeLists.txt33
-rwxr-xr-xfw-plugin/contact-plugIn/include/EXT_DataStore_Info_Contact.h80
-rwxr-xr-xfw-plugin/contact-plugIn/include/Extern_Info.h44
-rwxr-xr-xfw-plugin/contact-plugIn/include/IN_DataStore_Info_Contact.h99
-rwxr-xr-xfw-plugin/contact-plugIn/include/Item_Change_Info.h43
-rwxr-xr-xfw-plugin/contact-plugIn/src/Item_Change_Info.c69
-rwxr-xr-xfw-plugin/contact-plugIn/src/PlugIn_Interface.c1328
-rwxr-xr-xfw-plugin/http-plugIn/.cproject293
-rwxr-xr-xfw-plugin/http-plugIn/.project145
-rwxr-xr-xfw-plugin/http-plugIn/CMakeLists.src1
-rwxr-xr-xfw-plugin/http-plugIn/CMakeLists.sub37
-rwxr-xr-xfw-plugin/http-plugIn/CMakeLists.txt33
-rwxr-xr-xfw-plugin/http-plugIn/include/NA_External.h44
-rwxr-xr-xfw-plugin/http-plugIn/include/http_status.h135
-rwxr-xr-xfw-plugin/http-plugIn/src/PlugIn_Interface.c859
-rwxr-xr-xfw-plugin/memo-plugIn/.cproject31
-rwxr-xr-xfw-plugin/memo-plugIn/.project78
-rwxr-xr-xfw-plugin/memo-plugIn/CMakeLists.src1
-rwxr-xr-xfw-plugin/memo-plugIn/CMakeLists.sub37
-rwxr-xr-xfw-plugin/memo-plugIn/CMakeLists.txt33
-rwxr-xr-xfw-plugin/memo-plugIn/include/Extern_Info.h44
-rwxr-xr-xfw-plugin/memo-plugIn/include/Item_Change_Info.h43
-rwxr-xr-xfw-plugin/memo-plugIn/src/Item_Change_Info.c54
-rwxr-xr-xfw-plugin/memo-plugIn/src/PlugIn_Interface.c744
-rwxr-xr-xfw-plugin/plain-text-plugIn/.cproject31
-rwxr-xr-xfw-plugin/plain-text-plugIn/.project78
-rwxr-xr-xfw-plugin/plain-text-plugIn/CMakeLists.src1
-rwxr-xr-xfw-plugin/plain-text-plugIn/CMakeLists.sub37
-rwxr-xr-xfw-plugin/plain-text-plugIn/CMakeLists.txt33
-rwxr-xr-xfw-plugin/plain-text-plugIn/include/IN_DataStore_Info_Plain_Text.h50
-rwxr-xr-xfw-plugin/plain-text-plugIn/src/PlugIn_Interface.c244
-rwxr-xr-xfw-plugin/slp-device-plugIn/.cproject376
-rwxr-xr-xfw-plugin/slp-device-plugIn/.project145
-rwxr-xr-xfw-plugin/slp-device-plugIn/CMakeLists.src1
-rwxr-xr-xfw-plugin/slp-device-plugIn/CMakeLists.sub37
-rwxr-xr-xfw-plugin/slp-device-plugIn/CMakeLists.txt32
-rwxr-xr-xfw-plugin/slp-device-plugIn/include/PlugIn_DevExe_Error.h66
-rwxr-xr-xfw-plugin/slp-device-plugIn/include/slp_device_info.h57
-rwxr-xr-xfw-plugin/slp-device-plugIn/include/slp_ref.h54
-rwxr-xr-xfw-plugin/slp-device-plugIn/src/PlugIn_Interface_DevExe.c130
-rwxr-xr-xfw-plugin/slp-device-plugIn/src/PlugIn_Interface_DevInfo.c362
-rwxr-xr-xfw-plugin/slp-device-plugIn/src/slp_device_info.c288
-rwxr-xr-xfw-plugin/slp-sysnoti-plugIn/.cproject293
-rwxr-xr-xfw-plugin/slp-sysnoti-plugIn/.project145
-rwxr-xr-xfw-plugin/slp-sysnoti-plugIn/CMakeLists.src1
-rwxr-xr-xfw-plugin/slp-sysnoti-plugIn/CMakeLists.sub37
-rwxr-xr-xfw-plugin/slp-sysnoti-plugIn/CMakeLists.txt32
-rwxr-xr-xfw-plugin/slp-sysnoti-plugIn/include/SLP_Alarm.h51
-rw-r--r--fw-plugin/slp-sysnoti-plugIn/include/SLP_CallBack.h70
-rwxr-xr-xfw-plugin/slp-sysnoti-plugIn/include/SLP_ConnManager.h61
-rwxr-xr-xfw-plugin/slp-sysnoti-plugIn/include/SLP_SAN.h52
-rwxr-xr-xfw-plugin/slp-sysnoti-plugIn/src/PlugIn_Interface.c319
-rwxr-xr-xfw-plugin/slp-sysnoti-plugIn/src/SLP_Alarm.c449
-rw-r--r--fw-plugin/slp-sysnoti-plugIn/src/SLP_CallBack.c234
-rwxr-xr-xfw-plugin/slp-sysnoti-plugIn/src/SLP_ConnManager.c390
-rwxr-xr-xfw-plugin/slp-sysnoti-plugIn/src/SLP_SAN.c394
-rwxr-xr-xfw-plugin/vcalendar-plugIn/.cproject31
-rwxr-xr-xfw-plugin/vcalendar-plugIn/.project78
-rwxr-xr-xfw-plugin/vcalendar-plugIn/CMakeLists.src1
-rwxr-xr-xfw-plugin/vcalendar-plugIn/CMakeLists.sub37
-rwxr-xr-xfw-plugin/vcalendar-plugIn/CMakeLists.txt33
-rwxr-xr-xfw-plugin/vcalendar-plugIn/include/IN_DataStore_Info_Vcalendar.h248
-rwxr-xr-xfw-plugin/vcalendar-plugIn/include/encoding_util.h255
-rwxr-xr-xfw-plugin/vcalendar-plugIn/src/PlugIn_Interface.c516
-rwxr-xr-xfw-plugin/vcalendar-plugIn/src/encoding_util.c775
-rwxr-xr-xfw-plugin/vcard-plugIn/.cproject31
-rwxr-xr-xfw-plugin/vcard-plugIn/.project78
-rwxr-xr-xfw-plugin/vcard-plugIn/CMakeLists.src1
-rwxr-xr-xfw-plugin/vcard-plugIn/CMakeLists.sub37
-rwxr-xr-xfw-plugin/vcard-plugIn/CMakeLists.txt33
-rwxr-xr-xfw-plugin/vcard-plugIn/include/IN_DataStore_Info_Vcard.h174
-rwxr-xr-xfw-plugin/vcard-plugIn/include/PlugIn_Spec.h83
-rwxr-xr-xfw-plugin/vcard-plugIn/include/encoding_util.h255
-rwxr-xr-xfw-plugin/vcard-plugIn/src/PlugIn_Interface.c546
-rwxr-xr-xfw-plugin/vcard-plugIn/src/encoding_util.c758
-rwxr-xr-xpackaging/sync-agent-framework.spec88
-rwxr-xr-xpkg_build.sh4
-rwxr-xr-xpkg_clean.sh28
-rwxr-xr-xpkg_install.sh6
-rwxr-xr-xpkg_uninstall.sh6
-rwxr-xr-xsync-agent-framework.pc.in19
336 files changed, 60002 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100755
index 0000000..178bd9d
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,22 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+PROJECT(sync-agent-framework)
+
+SET(CMAKE_SKIP_BUILD_RPATH TRUE)
+#SET(VERSION_MAJOR 1)
+#SET(VERSION "${VERSION_MAJOR}.0.0")a
+
+MACRO(get_version _file _ver _ver_maj)
+ FILE(STRINGS ${_file} __log LIMIT_COUNT 1 REGEX "(.*)")
+ STRING(REGEX REPLACE ".*\\(\([0-9]+:\)*\([0-9a-zA-Z.]*\).*\\).*" "\\2" __ver ${__log})
+ STRING(REGEX REPLACE "^\([0-9]+\)\\..*" "\\1" __ver_maj ${__ver})
+ SET(${_ver} ${__ver})
+ SET(${_ver_maj} ${__ver_maj})
+ENDMACRO(get_version)
+get_version(debian/changelog VERSION VERSION_MAJOR)
+
+ADD_SUBDIRECTORY(framework)
+ADD_SUBDIRECTORY(fw-plugin)
+
+CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig)
+
diff --git a/debian/changelog b/debian/changelog
new file mode 100755
index 0000000..4e09cea
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,7 @@
+libsync-agent-framework (0.1.9) unstable; urgency=low
+
+ * pkg-init upload
+ * Git: shared/pkgs/s/sync-agent-framework-open
+ * Tag: libsync-agent-framework_0.1.9
+
+ -- Junhyuk Lee <junhyuk7.lee@samsung.com> Mon, 12 Mar 2012 12:32:13 +0900
diff --git a/debian/compat b/debian/compat
new file mode 100755
index 0000000..7ed6ff8
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+5
diff --git a/debian/control b/debian/control
new file mode 100755
index 0000000..ed300da
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,29 @@
+Source: libsync-agent-framework
+Section: embedded
+Priority: optional
+Maintainer: Joohark Park <juhaki.park@samsung.com>, Junhyuk Lee <junhyuk7.lee@samsung.com>, Sunbong Ha<sunbong.ha@samsung.com>
+Uploaders: Joohark Park <juhaki.park@samsung.com>, Junhyuk Lee <junhyuk7.lee@samsung.com>, Sunbong Ha<sunbong.ha@samsung.com>
+Build-Depends: debhelper (>= 5), libslp-calendar-dev, libslp-memo-dev, libcontacts-service-dev, libaccounts-svc-dev, drm-service-dev, libvconf-dev, uuid-dev, dlog-dev, libglib2.0-dev, libsqlite3-dev, libsoup2.4-dev, check, libxml2-dev, libslp-alarm-dev, libgcrypt11, libgcrypt11-dev, libwbxml2-dev, libslp-pm-dev, libslp-tapi-dev, libslp-sysman-dev, libslp-msg-service-dev
+Standards-Version: 0.1.1
+
+Package: libsync-agent-framework
+Section: embedded
+Architecture: any
+Priority: optional
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: Integrated Framework Library Package
+
+Package: libsync-agent-framework-dev
+Section: embedded
+Architecture: any
+Priority: optional
+Depends: ${shlibs:Depends}, ${misc:Depends}, libsync-agent-framework (= ${Source-Version})
+Description: Integrated Framework Library Package (dev)
+
+Package: libsync-agent-framework-dbg
+Section: embedded
+Architecture: any
+Priority: optional
+Depends: ${misc:Depends}, libsync-agent-framework (= ${Source-Version})
+Description: Integrated Framework Library Package (dbg)
+
diff --git a/debian/control.slp b/debian/control.slp
new file mode 100755
index 0000000..fba21bb
--- /dev/null
+++ b/debian/control.slp
@@ -0,0 +1,7 @@
+#Sat May 15 19:14:26 KST 2010
+Version=1.0.0
+IdealScreen=480x800,46x71
+Vendor=slp
+Privileges=
+AppInstallPath=/usr
+UserUninstall=yes
diff --git a/debian/dirs b/debian/dirs
new file mode 100755
index 0000000..4418816
--- /dev/null
+++ b/debian/dirs
@@ -0,0 +1,2 @@
+usr/lib
+usr/include
diff --git a/debian/libsync-agent-framework-dev.install b/debian/libsync-agent-framework-dev.install
new file mode 100755
index 0000000..5bb2016
--- /dev/null
+++ b/debian/libsync-agent-framework-dev.install
@@ -0,0 +1,2 @@
+/usr/lib/pkgconfig/*
+/usr/include/*
diff --git a/debian/libsync-agent-framework-dev.postinst b/debian/libsync-agent-framework-dev.postinst
new file mode 100755
index 0000000..08d231a
--- /dev/null
+++ b/debian/libsync-agent-framework-dev.postinst
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+rm -rf /usr/include/agent-framework/agent-framework
+
diff --git a/debian/libsync-agent-framework.install b/debian/libsync-agent-framework.install
new file mode 100755
index 0000000..c5a962b
--- /dev/null
+++ b/debian/libsync-agent-framework.install
@@ -0,0 +1 @@
+/usr/lib/*.*
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..63fe4ed
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,104 @@
+#!/usr/bin/make -f
+
+## DO NOT MODIFY THIS AREA : BEGIN
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+# $(PKGDIR) is a package build directory to create a final .deb package .
+include debian/control.slp
+
+PKGDIR = debian/PKG
+ifneq (,$(filter ide,$(DEB_BUILD_OPTIONS)))
+DESTDIR = .
+else
+DESTDIR = ..
+endif
+CONTROLFILE = debian/control.slp
+CONTROLFILE_SRC = debian/control
+
+BUILD_TYPE=Debug
+# BUILD_TYPE=Release
+
+#UNIT_TEST_ENABLE=TRUE
+UNIT_TEST_ENABLE=FALSE
+
+CFLAGS = -Wall -g
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+ CFLAGS += -O0
+else
+ CFLAGS += -O2
+endif
+
+build: pre-build configure
+ # Add here commands to compile the package.
+ $(MAKE)
+
+
+configure:
+ cmake . -DCMAKE_INSTALL_PREFIX=${AppInstallPath} -DCMAKE_PROJECT=${Source} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DUNIT_TEST_ENABLE=${UNIT_TEST_ENABLE}
+ rm -rf CMakeFiles/CompilerIdC*
+# sed 's/^Package:.*$$/Package: $(Package)/' $(CONTROLFILE_SRC) > $(CONTROLFILE_SRC).tmp ; mv -f $(CONTROLFILE_SRC).tmp $(CONTROLFILE_SRC)
+
+clean:
+ # Add here commands to clean up before the build process.
+ # debian clean
+ -$(MAKE) clean
+
+ -find . -name "CMakeFiles" -exec rm -rf {} \;
+ -find . -name "CMakeCache.txt" -exec rm -rf {} \;
+ -find . -name "Makefile" -exec rm -rf {} \;
+ -find . -name "cmake_install.cmake" -exec rm -rf {} \;
+ -find . -name "install_manifest.txt" -exec rm -rf {} \;
+ -find . -name "*.pc" -exec rm -rf {} \;
+ -find . -name "*.so" -exec rm -rf {} \;
+
+ -rm -rf $(PKGDIR)
+
+ dh_clean
+
+install: build pre-install
+ rm -rf $(PKGDIR)
+ mkdir $(PKGDIR)
+
+ # Add here commands to install the package into $(PKGDIR).
+ $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install
+
+ #execute unit test
+ #debian/unit_test.sh ./debian/tmp/usr/bin/fw-test
+
+# Build architecture-dependent files here.
+binary: install pre-binary
+ dh_testdir
+ dh_testroot
+ dh_installchangelogs
+ dh_installdocs
+ dh_installexamples
+ dh_install --sourcedir=debian/tmp
+ dh_link
+ dh_strip --dbg-package=libsync-agent-framework-dbg
+ dh_compress
+ dh_fixperms
+ dh_makeshlibs
+ dh_installdeb
+ dh_shlibdeps
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+
+
+
+.PHONY: build clean install binary
+## DO NOT MODIFY THIS AREA : END
+
+## DO NOT MODIFY OR DELETE TARGET.
+pre-build:
+ # Add here commands to execute before the build process.
+
+pre-install:
+ # Add here commands to execute before installing the binaries into $(PKGDIR).
+
+pre-binary:
+ # Add here commands to execute before creating a package.
+
diff --git a/debian/unit_test.sh b/debian/unit_test.sh
new file mode 100755
index 0000000..c2bc14f
--- /dev/null
+++ b/debian/unit_test.sh
@@ -0,0 +1,32 @@
+#!/bin/sh
+
+FW_TEST_BIN="$1"
+echo "$FW_TEST_BIN"
+
+echo ""
+echo "*********************************************************************************"
+echo " executing framework unit test binary..."
+echo "*********************************************************************************"
+echo ""
+
+if [ ! -e "$FW_TEST_BIN" ]
+then
+ echo " fw-test binary missing. (check debian package is in unit test mode)"
+else
+ echo ""
+ echo ""
+ echo "*********************************************************************************"
+ echo " framework unit test START..."
+ echo "*********************************************************************************"
+ echo ""
+
+ $FW_TEST_BIN
+
+ echo ""
+ echo ""
+ echo "*********************************************************************************"
+ echo " framework unit test FINISH..."
+ echo "*********************************************************************************"
+ echo ""
+fi
+
diff --git a/framework/.cproject b/framework/.cproject
new file mode 100644
index 0000000..1283e87
--- /dev/null
+++ b/framework/.cproject
@@ -0,0 +1,250 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?>
+
+<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="0.1671524454">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1671524454" moduleId="org.eclipse.cdt.core.settings" name="Default">
+ <externalSettings/>
+ <extensions>
+ <extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.pathentry">
+ <pathentry kind="src" path=""/>
+ <pathentry kind="src" path="src"/>
+ <pathentry kind="src" path="include"/>
+ <pathentry kind="out" path=""/>
+ <pathentry include="/scratchbox/users/yangjoo/targets/aquila-simulator/usr/include" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/home/yangjoo/workspace/syncagent-service/neo-sync-agent/include" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/compilers/i686-unknown-linux-gnu-gcc4.4.1-glibc2.10.1/i686-unknown-linux-gnu/include/c++/4.4.1" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/home/yangjoo/workspace/syncagent-service/neo-sync-agent/include/scheduler" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/home/yangjoo/workspace/syncagent-service/neo-sync-agent/include/libsyncml" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/home/yangjoo/workspace/syncagent-service/neo-sync-agent/include/libsyncml/objects" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/home/yangjoo/workspace/syncagent-service/neo-sync-agent/include/libsyncml/data_sync_api" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/home/yangjoo/workspace/syncagent-service/neo-sync-agent/include/libsyncml/parser" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/home/yangjoo/workspace/syncagent-service/neo-sync-agent/include/libsyncml/transports" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/home/yangjoo/workspace/syncagent-service/neo-sync-agent/include/vContactConverter" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/home/yangjoo/workspace/syncagent-service/neo-sync-agent/include/syncEngine" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/targets/aquila-simulator/usr/include/calendar" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/targets/aquila-simulator/usr/include/contacts-svc" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/targets/aquila-simulator/usr/include/glib-2.0" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/targets/aquila-simulator/usr/lib/glib-2.0/include" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/targets/aquila-simulator/usr/include/db-util" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/targets/aquila-simulator/usr/include/dbus-1.0" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/targets/aquila-simulator/usr/lib/dbus-1.0/include" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/targets/aquila-simulator/usr/include/dlog" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/targets/aquila-simulator/usr/include/email-service" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/targets/aquila-simulator/usr/include/libsoup-2.4" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/targets/aquila-simulator/usr/include/libxml2" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/targets/aquila-simulator/usr/include/uuid" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/targets/aquila-simulator/usr/include/vconf" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/targets/aquila-simulator/usr/include/gconf/2" kind="inc" path="" system="true"/>
+ <pathentry include="/scratchbox/users/yangjoo/targets/aquila-simulator/usr/include/vobject" kind="inc" path="" system="true"/>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactName="oma-agent" buildProperties="" description="" id="0.1671524454" name="Default" parent="org.eclipse.cdt.build.core.prefbase.cfg">
+ <folderInfo id="0.1671524454." name="/" resourcePath="">
+ <toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.366283031" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
+ <targetPlatform id="org.eclipse.cdt.build.core.prefbase.toolchain.366283031.1358324534" name=""/>
+ <builder id="org.eclipse.cdt.build.core.settings.default.builder.1843868830" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder">
+ <outputEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name=""/>
+ </outputEntries>
+ </builder>
+ <tool id="org.eclipse.cdt.build.core.settings.holder.libs.2026823596" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
+ <tool id="org.eclipse.cdt.build.core.settings.holder.1711536435" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
+ <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.2133506232" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
+ </tool>
+ <tool id="org.eclipse.cdt.build.core.settings.holder.1082244690" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
+ <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.4390031" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
+ </tool>
+ <tool id="org.eclipse.cdt.build.core.settings.holder.800204699" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
+ <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1968825451" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
+ </tool>
+ </toolChain>
+ </folderInfo>
+ <sourceEntries>
+ <entry excluding="framework" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
+ </sourceEntries>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <scannerConfigBuildInfo instanceId="0.1671524454">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
+ </cconfiguration>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <project id="oma-agent.null.1241367822" name="oma-agent"/>
+ </storageModule>
+</cproject>
diff --git a/framework/.project b/framework/.project
new file mode 100644
index 0000000..5368133
--- /dev/null
+++ b/framework/.project
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>agnt-fw-001-open</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>com.samsung.slp2.SboxBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>com.samsung.slp2.SboxBuilder.needConfigure</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;com.samsung.limo.SboxGCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.append_environment</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.arguments</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.command</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.auto</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.clean</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.inc</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.environment</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>com.samsung.slp2.cnature</nature>
+ </natures>
+</projectDescription>
diff --git a/framework/CMakeLists.src b/framework/CMakeLists.src
new file mode 100755
index 0000000..f28f887
--- /dev/null
+++ b/framework/CMakeLists.src
@@ -0,0 +1,23 @@
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRCS)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src/Initialization SRCS)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src/Account SRCS)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src/DataAdapter SRCS)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src/Device SRCS)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src/PlugIn SRCS)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src/Event SRCS)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src/Utility SRCS)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src/NetworkAccess SRCS)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src/EngineController SRCS)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src/scheduler SRCS)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src/PlatformMonitor SRCS)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src/securityAssistant SRCS)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src/NetworkAssistant SRCS)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src/NetworkAssistant/protocol_binder SRCS)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src/FSAPI SRCS)
+
+
+if (UNIT_TEST_ENABLE)
+ AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/test/src TEST_SRCS)
+ AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/test/src/suites TEST_SRCS)
+endif (UNIT_TEST_ENABLE)
+
diff --git a/framework/CMakeLists.sub b/framework/CMakeLists.sub
new file mode 100755
index 0000000..9768649
--- /dev/null
+++ b/framework/CMakeLists.sub
@@ -0,0 +1,67 @@
+#################################################################################
+# THIS FILE IS CREATED AUTOMATICALLY. DO NOT DELETE OR MODIFY THIS FILE.
+#################################################################################
+
+INCLUDE(CMakeLists.src)
+
+## PROJECT NAME
+PROJECT(sync-agent-framework C)
+
+## PACKAGE CONFIG
+SET(SLP_PKGCONFIG_LIST "glib-2.0 sqlite3 libsoup-2.4 vconf uuid drm-service libxml-2.0 libwbxml2 calendar pmapi")
+
+if (UNIT_TEST_ENABLE)
+ SET(SLP_PKGCONFIG_LIST "${SLP_PKGCONFIG_LIST} check")
+endif (UNIT_TEST_ENABLE)
+
+if (PLATFORM MATCHES "SLP")
+ SET(SLP_PKGCONFIG_LIST "${SLP_PKGCONFIG_LIST} dlog")
+endif (PLATFORM MATCHES "SLP")
+
+## INCLUDES
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/Initialization)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/Account)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/PlugIn)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/Event)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/DataAdapter)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/Device)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/Utility)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/NetworkAccess)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/scheduler)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/PlatformMonitor)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/securityAssistant)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/NetworkAssistant)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/NetworkAssistant/protocol_binder)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/FSAPI)
+
+
+if (UNIT_TEST_ENABLE)
+ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/test/include)
+endif (UNIT_TEST_ENABLE)
+
+
+## DEFINITIONS
+ADD_DEFINITIONS("-DAPP_DIR=\"${CMAKE_INSTALL_PREFIX}\"")
+if (PLATFORM MATCHES "SLP")
+ ADD_DEFINITIONS("-DSLP_PLATFORM")
+endif (PLATFORM MATCHES "SLP")
+
+## LIBRARY PATH
+SET(SLP_LD_PATH_FLAGS "")
+
+## LIBRARY
+SET(SLP_LD_FLAGS "")
+
+## DEBUG
+SET(SLP_DEBUG_FLAGS "-g")
+
+## OPTIMIZATION
+SET(SLP_OPT_FLAGS "-O0")
+
+## COMPILER FLAGS
+SET(SLP_COMPILER_FLAGS "-ldl -lpthread -lgcrypt -lm")
+
+## LINKER FLAGS
+SET(SLP_LINKER_FLAGS "-ldl -lpthread -lgcrypt -lgpg-error -lm")
+
diff --git a/framework/CMakeLists.txt b/framework/CMakeLists.txt
new file mode 100755
index 0000000..210f1a4
--- /dev/null
+++ b/framework/CMakeLists.txt
@@ -0,0 +1,119 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+
+SET(PLATFORM "SLP")
+SET(FW_TEST "fw-test")
+
+# INCLUDE SUB CMAKELIST FILE
+INCLUDE(CMakeLists.sub)
+
+SET(RESOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/res")
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs_framework REQUIRED ${SLP_PKGCONFIG_LIST})
+
+FOREACH(flag ${pkgs_framework_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+SET(CMAKE_CXX_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+
+ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS})
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_framework_LDFLAGS} ${SLP_LD_PATH_FLAGS} ${SLP_LD_FLAGS} ${SLP_LINKER_FLAGS})
+INSTALL(TARGETS ${PROJECT_NAME} DESTINATION lib)
+
+if (UNIT_TEST_ENABLE)
+ ADD_EXECUTABLE(${FW_TEST} ${TEST_SRCS} ${SRCS})
+ TARGET_LINK_LIBRARIES(${FW_TEST} ${pkgs_framework_LDFLAGS} ${SLP_LD_PATH_FLAGS} ${SLP_LD_FLAGS} ${SLP_LINKER_FLAGS})
+ INSTALL(TARGETS ${FW_TEST} DESTINATION bin)
+endif (UNIT_TEST_ENABLE)
+
+#INSTALL(DIRECTORY ${RESOURCE_DIR}/data DESTINATION share)
+
+#added by KTS for install to the system
+#CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY)
+#INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig)
+
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/SyncAgent_Info.h DESTINATION include/agent-framework/)
+
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Initialization/initialize_error.h DESTINATION include/agent-framework/Initialization/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Initialization/initialize.h DESTINATION include/agent-framework/Initialization/)
+
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/DataAdapter/EXT_DACI_Errors.h DESTINATION include/agent-framework/DACI/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/DataAdapter/DACI_Common.h DESTINATION include/agent-framework/DACI/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/DataAdapter/DACI_Agent_Handler_Manager.h DESTINATION include/agent-framework/DACI/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/DataAdapter/EXT_DACI_Converter.h DESTINATION include/agent-framework/DACI/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/DataAdapter/DACI_Service.h DESTINATION include/agent-framework/DACI/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/DataAdapter/DACI_Luid.h DESTINATION include/agent-framework/DACI/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/DataAdapter/DACI_ChangeLog.h DESTINATION include/agent-framework/DACI/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/DataAdapter/DACI_Agent_Mgr.h DESTINATION include/agent-framework/DACI/)
+
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/NetworkAccess/NACI_Common.h DESTINATION include/agent-framework/NetworkAccess/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/NetworkAccess/NACI_Errors.h DESTINATION include/agent-framework/NetworkAccess/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/NetworkAccess/NACI.h DESTINATION include/agent-framework/NetworkAccess/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/NetworkAccess/NA_External.h DESTINATION include/agent-framework/NetworkAccess/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/NetworkAccess/EXT_NA_NetworkStatus.h DESTINATION include/agent-framework/NetworkAccess/)
+
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Event/Event_Error.h DESTINATION include/agent-framework/Event/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Event/Event_UI_API.h DESTINATION include/agent-framework/Event/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Event/Event_Data_Accessor.h DESTINATION include/agent-framework/Event/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Event/Event_Handler.h DESTINATION include/agent-framework/Event/)
+
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Account/Account_Error.h DESTINATION include/agent-framework/Account/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Account/Account_Mgr.h DESTINATION include/agent-framework/Account/)
+
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/EngineController/fundamental_type.h DESTINATION include/agent-framework/EngineController/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/EngineController/engine_controller_define.h DESTINATION include/agent-framework/EngineController/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/EngineController/engine_controller.h DESTINATION include/agent-framework/EngineController/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/EngineController/task_spec.h DESTINATION include/agent-framework/EngineController/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/EngineController/queuing_rule_spec.h DESTINATION include/agent-framework/EngineController/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/EngineController/param_spec.h DESTINATION include/agent-framework/EngineController/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/EngineController/param_value.h DESTINATION include/agent-framework/EngineController/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/EngineController/param.h DESTINATION include/agent-framework/EngineController/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/EngineController/task_process.h DESTINATION include/agent-framework/EngineController/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/EngineController/task_error.h DESTINATION include/agent-framework/EngineController/)
+
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Utility/fw_alloc.h DESTINATION include/agent-framework/Utility/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Utility/fw_log.h DESTINATION include/agent-framework/Utility/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Utility/fw_assert.h DESTINATION include/agent-framework/Utility/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Utility/fw_ref.h DESTINATION include/agent-framework/Utility/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Utility/fw_compress.h DESTINATION include/agent-framework/Utility/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Utility/fw_cache.h DESTINATION include/agent-framework/Utility/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Utility/fw_time.h DESTINATION include/agent-framework/Utility/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Utility/fw_sequential_id_provider.h DESTINATION include/agent-framework/Utility/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Utility/fw_async_queue.h DESTINATION include/agent-framework/Utility/)
+
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/PlatformMonitor/EXT_PMCI_Common.h DESTINATION include/agent-framework/PlatformMonitor/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/PlatformMonitor/EXT_PMCI_Errors.h DESTINATION include/agent-framework/PlatformMonitor/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/PlatformMonitor/EXT_PMCI_Noti.h DESTINATION include/agent-framework/PlatformMonitor/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/PlatformMonitor/EXT_PMCI.h DESTINATION include/agent-framework/PlatformMonitor/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/PlatformMonitor/EXT_PMCI_Struct.h DESTINATION include/agent-framework/PlatformMonitor/)
+
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/securityAssistant/EXT_SA_Encryption_Decryption.h DESTINATION include/agent-framework/securityAssistant/)
+
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/NetworkAssistant/protocol_binder/protocol_binder_common.h DESTINATION include/agent-framework/NetworkAssistant/protocol_binder/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/NetworkAssistant/protocol_binder/protocol_binder_definition.h DESTINATION include/agent-framework/NetworkAssistant/protocol_binder/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/NetworkAssistant/protocol_binder/protocol_binder_error.h DESTINATION include/agent-framework/NetworkAssistant/protocol_binder/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/NetworkAssistant/protocol_binder/protocol_binder_util.h DESTINATION include/agent-framework/NetworkAssistant/protocol_binder/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/NetworkAssistant/protocol_binder/protocol_binder.h DESTINATION include/agent-framework/NetworkAssistant/protocol_binder/)
+
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Device/EXT_DCI_Common.h DESTINATION include/agent-framework/Device/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Device/EXT_DCI_Errors.h DESTINATION include/agent-framework/Device/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Device/EXT_DCI_DevInfo.h DESTINATION include/agent-framework/Device/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/Device/EXT_DCI_DevExecutor.h DESTINATION include/agent-framework/Device/)
+
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/FSAPI/FSAPI_operation.h DESTINATION include/agent-framework/FSAPI/)
+
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/PlugIn/PlugIn_Interface/Account_Interface.h DESTINATION include/agent-framework/PlugIn/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/PlugIn/PlugIn_Interface/DataConnector_Interface.h DESTINATION include/agent-framework/PlugIn/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/PlugIn/PlugIn_Interface/DataConnector_Resource.h DESTINATION include/agent-framework/PlugIn/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/PlugIn/PlugIn_Interface/DataConverter_Interface.h DESTINATION include/agent-framework/PlugIn/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/PlugIn/DataConverter_Resource.h DESTINATION include/agent-framework/PlugIn/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/PlugIn/PlugIn_Interface/DeviceInfo_Interface.h DESTINATION include/agent-framework/PlugIn/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/PlugIn/PlugIn_Interface/NetworkAccess_Interface.h DESTINATION include/agent-framework/PlugIn/)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/PlugIn/PlugIn_Interface/PlatformMonitor_Interface.h DESTINATION include/agent-framework/PlugIn/)
+
+
+# INCLUDE LAYOUT DIRECTORY
+# ADD_SUBDIRECTORY(layout)
+#ADD_SUBDIRECTORY(res/locale)
diff --git a/framework/include/Account/Account_Error.h b/framework/include/Account/Account_Error.h
new file mode 100755
index 0000000..3bf87e6
--- /dev/null
+++ b/framework/include/Account/Account_Error.h
@@ -0,0 +1,61 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef ACCOUNT_ERROR_H_
+#define ACCOUNT_ERROR_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file Account_Error.h
+ * @brief Definition of framework error codes for Account module
+ */
+
+/**
+ * @brief Enumerations of error codes for Account module
+ */
+ typedef enum {
+ ACCOUNT_SUCCESS, /**< when Account Operation is succeed */
+ ACCOUNT_FAIL, /**< when Account Operation is failed */
+ ACCOUNT_EMPTY, /**< when Account is not exist */
+ ACCOUNT_CHANGED /**< when Account storage changed */
+ } ACCOUNT_ERROR;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* ACCOUNT_ERROR_H_ */
diff --git a/framework/include/Account/Account_Mgr.h b/framework/include/Account/Account_Mgr.h
new file mode 100755
index 0000000..3d88a02
--- /dev/null
+++ b/framework/include/Account/Account_Mgr.h
@@ -0,0 +1,106 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef ACCOUNT_MGR_H_
+#define ACCOUNT_MGR_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include "Account_Error.h"
+
+/**
+ * @file Account_Mgr.h
+ * @brief Support to use framework Account module
+ */
+
+/*
+ * @brief Register a new account to SyncAgent
+ * @param[in] email email
+ * @param[in] password password
+ * @param[in] serverIP serverIP
+ * @param[in] domain domain
+ * @param[in] isEnableSSL isEnableSSL
+ * @param[in] create_mode create_mode
+ * @param[in] access_name access name
+ * @return Operating result
+ * @retval SyncAgent account ID success
+ * @retval -1 failed
+ */
+ int addAccount(char *email, char *password, char *serverIP, char *domain, int isEnableSSL, int create_mode, char *access_name);
+
+/*
+ * @brief Delete the account from SyncAgent
+ * @param[in] accountID id of SyncAgent
+ * @return Operating result
+ * @retval 1 success
+ * @retval 0 failed
+ */
+ int deleteAccount(int accountID);
+
+/**
+ * @brief Mapping service's all account to F/W account
+ * @remarks Services which are provided as a DataConnector plug-In.
+ * @return ACCOUNT_SUCCESS on success, otherwise a error value.
+ * @retval ACCOUNT_SUCCESS Successful
+ * @retval ACCOUNT_FAIL Parsing the initialization config file failed
+ * @retval ACCOUNT_CHANGED service account repository changed
+ * @post Mapped service's all existed account id with F/W account id
+ */
+ ACCOUNT_ERROR construct_AccountTbl_From_Service();
+
+/**
+ * @brief Get fw account id list per service type.
+ * @param[in] content_type content type (Contact, Calendar, Memo ... )
+ * @param [out] count count of fw account id which have content type service account id.
+ * @return list of fw account id on success, otherwise null pointer
+ */
+ int *get_Account_ID_List(int content_type, int *count);
+
+/**
+ * @brief Get Account Information
+ * @remarks Account Information type is defined in account plugIn.
+ * @param[in] fw_account_id account id
+ * @param[in] content_type service type
+ * @return Account Information* defined in account plugIn on success, otherwise null pointer
+ * @pre account plugIn loaded
+ */
+ void *get_Account_Info(int fw_account_id, int content_type);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* ACCOUNT_MGR_H_ */
diff --git a/framework/include/Account/Account_Util.h b/framework/include/Account/Account_Util.h
new file mode 100755
index 0000000..867bc55
--- /dev/null
+++ b/framework/include/Account/Account_Util.h
@@ -0,0 +1,85 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef SYNCACCOUNTMGR_H_
+#define SYNCACCOUNTMGR_H_
+
+#include "Account_Error.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*
+ * @brief Checking whether the account is exist
+ * @param[in] accountID id of Framework account database
+ * @return Checking result
+ * @retval 1 exist
+ * @retval 0 not exist
+ */
+ int isExistAccountID(int accountID);
+
+ void addAccount_Platform(int fw_account_id, char *email, char *password, int create_mode);
+
+ void delAccount_Platform(int fw_account_id);
+
+ int *getAccountIDList_Service(int service_type, int *cnt);
+
+ int getAccountID_Service(int service_type, int account_id);
+
+ int getAccountID_FW(int service_type, int service_account_id, int index);
+
+/*
+ * @brief Get a list of account ID
+ * @param[out] count The current number of registered accounts
+ * @return Operating result
+ * @retval a list of account ID Registered accounts exist
+ * @retval NULL Not registered account
+ */
+ int *getAccountList(int *count);
+
+/*
+ * @brief Get a email address of account
+ * @param[in] accountID id of SyncAgent
+ * @return Operating result
+ * @retval email address success
+ * @retval 0 not exist
+ */
+ char *getEmailAddress(int accountID);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* SYNCACCOUNTMGR_H_ */
diff --git a/framework/include/DataAdapter/DACI_Agent.h b/framework/include/DataAdapter/DACI_Agent.h
new file mode 100755
index 0000000..122bc6d
--- /dev/null
+++ b/framework/include/DataAdapter/DACI_Agent.h
@@ -0,0 +1,839 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef DACI_AGENT_H_
+#define DACI_AGENT_H_
+
+#include "DACI_Common.h"
+
+/*
+ * =============================================================================================================================
+ * Database Open & Close & Delete Account Data
+ * =============================================================================================================================
+ */
+
+/*
+* @brief start Agent database transaction
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+* @return operation result
+* @retval DACI_SUCCESS success
+* @retval DACI_ERR_TRANSACTION_FAILED fail
+*/
+DACI_RETURN begin_transaction(DACI_HANDLER *daci_handler);
+
+/*
+* @brief finish Agent database transaction
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+* @param[in] transaction commit or rollback transaction
+* @return operation result
+* @retval DACI_SUCCESS success
+* @retval DACI_ERR_TRANSACTION_FAILED fail
+*/
+DACI_RETURN end_transaction(DACI_HANDLER *daci_handler, DACI_TRANSACTION transaction);
+
+/*
+ * @brief set agent db file path
+ * @param[in] file_path agent db file path
+ */
+void set_agentdb_file_path(char *file_path);
+
+/*
+ * @brief open Agent database
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_OPEN_FAILED fail
+ */
+DACI_RETURN open_agent(DACI_HANDLER **daci_handler);
+
+/*
+ * @brief close Agent database
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_CLOSE_FAILED fail
+ */
+DACI_RETURN close_Agent(DACI_HANDLER *daci_handler);
+
+/*
+ * @brief create Agent database
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_CLOSE_FAILED fail
+ */
+DACI_RETURN create_AgentDefaultTable(DACI_HANDLER *daci_handler);
+
+/*
+ * =============================================================================================================================
+ * account_tb
+ * =============================================================================================================================
+ */
+/*
+ * @brief insert account into account_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] account account info
+ * @return operation result
+ * @retval accountId success
+ * @retval -1 fail
+ */
+int add_account(DACI_HANDLER *daci_handler, daci_account *account);
+
+/*
+ * @brief delete account data from Agent database
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN delete_account(DACI_HANDLER *daci_handler, int accountId);
+
+/*
+ * @brief set emailAddress to account_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] emailAddress new emailAddress
+ * @param[in] accessName access module name
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN set_accountEmailAddress(DACI_HANDLER *daci_handler, int accountId, char *emailAddress, char *accessName);
+
+/*
+ * @brief set password to account_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] password new password
+ * @param[in] accessName access module name
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN set_accountPassword(DACI_HANDLER *daci_handler, int accountId, char *password, char *accessName);
+
+/*
+ * @brief get all accountId from account_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[out] count count of accountId
+ * @return operation result
+ * @retval array of ccountId success
+ * @retval NULL fail
+ */
+int *get_accountAccountIdList(DACI_HANDLER *daci_handler, int *count);
+
+/*
+ * @brief get emailAddress from account_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @return operation result
+ * @retval emailAddress success
+ * @retval NULL fail
+ */
+char *get_accountEmailAddress(DACI_HANDLER *daci_handler, int accountId);
+
+/*
+ * @brief get password from account_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @return operation result
+ * @retval password success
+ * @retval NULL fail
+ */
+char *get_accountPassword(DACI_HANDLER *daci_handler, int accountId);
+
+/*
+ * @brief checking whether the accountId exist in account_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @return checking result
+ * @retval true exist
+ * @retval false not exist
+ */
+int isExist_account(DACI_HANDLER *daci_handler, int accountId);
+
+char *get_accessName(DACI_HANDLER *daci_handler, int accountId);
+
+int *get_accountIdListByAccessName(DACI_HANDLER *daci_handler, char *access_name, int *accountId_count);
+
+/*
+ * @brief get account count
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @return checking result
+ * @retval true exist
+ * @retval false not exist
+ */
+int get_accountCount(DACI_HANDLER *daci_handler);
+
+/*
+ * =============================================================================================================================
+ * folder_tbl
+ * =============================================================================================================================
+ */
+/*
+ * @brief insert folder into folder_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] folder array of folder info
+ * @param[in] count count of folder info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN add_folder(DACI_HANDLER *daci_handler, daci_folder *folder, int count);
+
+DACI_RETURN delete_folderByFolderId(DACI_HANDLER *daci_handler, char *folderId);
+
+/*
+ * @brief get folderId from folder_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] accountId itemTypeId
+ * @param[in] serviceId serviceId
+ * @param[in] folderTypeId folderTypeId
+ * @return operation result
+ * @retval folderId success
+ * @retval NULL fail
+ */
+char *get_folderFolderIdByServiceId(DACI_HANDLER *daci_handler, int accountId, int itemTypeId, char *serviceId, int folderTypeId);
+
+/*
+ * @brief get folderId from folder_tbl by folderTypeId
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] folderTypeId folderTypeId
+ * @return operation result
+ * @retval folderId success
+ * @retval NULL fail
+ */
+daci_id_list *get_folderFolderIdByFolderTypeId(DACI_HANDLER *daci_handler, int accountId, int itemTypeId, int folderTypeId);
+
+/*
+ * @brief get serviceId from folder_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] folderId folderId
+ * @return operation result
+ * @retval serviceId success
+ * @retval NULL fail
+ */
+char *get_folderServiceId(DACI_HANDLER *daci_handler, char *folderId);
+
+daci_id_list *get_folderFolderIdListByItemTypeId(DACI_HANDLER *daci_handler, int accountId, int itemTypeId);
+
+/*
+ * @brief get item from folder_tbl
+ * belonging to different account of folder get folder with the same service_id
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] folderId folderId
+ * @param[in] count count of item info
+ * @return operation result
+ * @retval array of folder info success
+ * @retval NULL fail
+ */
+daci_folder *get_folderMappingServiceId(DACI_HANDLER *daci_handler, int accountId, char *folderId, int *count);
+
+/*
+ * @brief checking whether the folderId exist in folder_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] folderId folderId
+ * @return checking result
+ * @retval true exist
+ * @retval false not exist
+ */
+int isExist_folder(DACI_HANDLER *daci_handler, int accountId, char *folderId);
+
+/*
+ * =============================================================================================================================
+ * item_tbl
+ * =============================================================================================================================
+ */
+/*
+ * @brief insert item into item_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] item array of item info
+ * @param[in] count count of item info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN add_item(DACI_HANDLER *daci_handler, daci_item *item, int count);
+
+/*
+ * @brief delete item from item_tbl by itemId
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] itemId itemId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN delete_itemByItemId(DACI_HANDLER *daci_handler, char *itemId);
+
+/*
+ * @brief delete item from item_tbl by accountId and itemTypeId
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] itemTypeId itemTypeId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN delete_itemByItemTypeId(DACI_HANDLER *daci_handler, int accountId, int itemTypeId);
+
+/*
+ * @brief get itemId from item_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] serviceId serviceId
+ * @param[in] itemTypeId itemTypeId
+ * @return operation result
+ * @retval itemId success
+ * @retval NULL fail
+ */
+char *get_itemItemId(DACI_HANDLER *daci_handler, int accountId, char *serviceId, int itemTypeId);
+
+/*
+ * @brief get serviceId from item_tbl
+ * @param[in] accountId accountId
+ * @param[in] itemId itemId
+ * @return operation result
+ * @retval serviceId success
+ * @retval NULL fail
+ */
+char *get_itemServiceId(DACI_HANDLER *daci_handler, char *itemId);
+
+/*
+ * @brief get item from item_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] itemId itemId
+ * @return operation result
+ * @retval item info success
+ * @retval NULL fail
+ */
+daci_item *get_item(DACI_HANDLER *daci_handler, char *itemId);
+
+/*
+ * @brief get all id in folder from item_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] folderId folderId
+ * @param[in] columnName columnName (COLUMN_NAME_ITEM_ID or COLUMN_NAME_SERVICE_ID)
+ * @return operation result
+ * @retval array of item id success
+ * @retval NULL fail
+ */
+daci_id_list *get_itemIdList(DACI_HANDLER *daci_handler, char *folderId, DACI_COLUMN_NAME columnName);
+
+daci_item *get_itemByAccountId(DACI_HANDLER *daci_handler, int accountId, int itemTypeId, int *count);
+
+/*
+ * @brief get item data from item_tbl and account_item_changelog_tbl
+ * Among the items that belong to the itemTypeId, Search for item info belong to the changelog
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] itemTypeId itemTypeId
+ * @param[in] count count of item data
+ * @return operation result
+ * @retval array of item data success
+ * @retval NULL fail
+ */
+daci_item_info *get_itemInfoByItemTypeId(DACI_HANDLER *daci_handler, int accountId, int itemTypeId, int *count);
+
+/*
+ * @brief get item from item_tbl
+ * belonging to different account of item get item with the same service_id
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] itemId itemId
+ * @param[in] count count of item info
+ * @return operation result
+ * @retval array of item info success
+ * @retval NULL fail
+ */
+daci_item *get_itemMappingServiceId(DACI_HANDLER *daci_handler, int accountId, char *itemId, int *count);
+
+daci_id_list *get_itemIdListByDataStoreId(DACI_HANDLER *daci_handler, int data_store_id);
+
+daci_id_list *get_itemIdListByDataStoreIdwithAccountId(DACI_HANDLER *daci_handler, int account_id, int data_store_id);
+
+daci_id_list *get_ItemIdListByOperationId(DACI_HANDLER *daci_handler, int account_id, int data_store_id, int operation_id);
+
+/*
+ * @brief checking whether the itemId exist in item_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] itemId itemId
+ * @return checking result
+ * @retval true exist
+ * @retval false not exist
+ */
+int isExist_item(DACI_HANDLER *daci_handler, char *itemId);
+
+/*
+ * =============================================================================================================================
+ * config_tbl
+ * =============================================================================================================================
+ */
+/*
+ * @brief insert config into config_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] config config info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN add_config(DACI_HANDLER *daci_handler, daci_config *config);
+
+/*
+ * @brief delete config from config_tbl by key
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] configId configId
+ * @param[in] key key
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN delete_configByKey(DACI_HANDLER *daci_handler, int configId, char *key);
+
+/*
+ * @brief get config info from config_tbl by accountId
+ * get all the config in account
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] configId configId
+ * @param[in] count count of config info
+ * @return operation result
+ * @retval array of config info success
+ * @retval NULL fail
+ */
+daci_config *get_configByConfigId(DACI_HANDLER *daci_handler, int configId, int *count);
+
+/*
+ * @brief get config info from config_tbl by key
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] config config info (accountId, key)
+ * @param[out] config config info (accountId, key, value, type)
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN get_configByKey(DACI_HANDLER *daci_handler, daci_config *config);
+
+/*
+ * @brief checking whether account of the config exist in config_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] configId configId
+ * @param[in] key key
+ * @return checking result
+ * @retval true exist
+ * @retval false not exist
+ */
+int isExist_config(DACI_HANDLER *daci_handler, int configId, char *key);
+
+/*
+ * @brief insert or update config into config_tbl
+ * checking whether the config exist in config_tbl
+ * If it does not exist, insert config into config_tbl
+ * If it existed, update config into config_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] config config info
+ * @param[in] count count of config info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN update_config(DACI_HANDLER *daci_handler, daci_config *config, int count);
+
+DACI_RETURN set_configValue(DACI_HANDLER *daci_handler, daci_config *config);
+
+/*
+ * =============================================================================================================================
+ * account_item_changelog_tbl
+ * =============================================================================================================================
+ */
+/*
+ * @brief insert itemChangelog into account_item_changelog_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] itemChangelog array of itemChangelog info
+ * @param[in] count count of itemChangelog info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN add_itemChangelog(DACI_HANDLER *daci_handler, int accountId, daci_item_changelog *itemChangelog, int count);
+
+/*
+ * @brief delete itemChangelog from account_item_changelog_tbl by itemId
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] itemId itemId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN delete_itemChangelogByItemId(DACI_HANDLER *daci_handler, int accountId, char *itemId);
+
+/*
+ * @brief delete itemChangelog from account_item_changelog_tbl by itemId list
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] itemIdList array of itemId
+ * @param[in] count count of itemId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN delete_itemChangelogByItemIdList(DACI_HANDLER *daci_handler, int accountId, char **itemIdList, int count);
+
+/*
+ * @brief delete itemChangelog from account_item_changelog_tbl by itemTypeId
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] itemTypeId itemTypeId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN delete_itemChangelogByItemTypeId(DACI_HANDLER *daci_handler, int accountId, int itemTypeId);
+
+/*
+ * @brief set operationId and syncStatus to account_item_changelog_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] itemChangelog itemChangelog info (operationId, syncStatus, accessName, itemId)
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN set_itemChangelogOperationId(DACI_HANDLER *daci_handler, int accountId, daci_item_changelog *itemChangelog);
+
+/*
+ * @brief set syncStatus to account_item_changelog_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] itemChangelog itemChangelog info (syncStatus, accessName, itemId)
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN set_itemChangelogSyncStatus(DACI_HANDLER *daci_handler, int accountId, daci_item_changelog *itemChangelog);
+
+/*
+ * @brief set SYNC_WAIT to account_item_changelog_tbl
+ * Among the items that match to the itemTypeId and belong to the folder
+ * If it existed in account_item_changelog_tbl, set SYNC_WAIT to account_item_changelog_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] folderIdList array of folderId
+ * @param[in] folderIdCount count of folderId
+ * @param[in] itemTypeIdList array of itemTypeId
+ * @param[in] itemTypeIdCount count of itemTypeId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN set_itemChangelogWaitStatus(DACI_HANDLER *daci_handler, int accountId, char **folderIdList, int folderIdCount, int *itemTypeIdList, int itemTypeIdCount);
+
+/*
+ * @brief get itemChangelog info from account_item_changelog_tbl by itemId
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] itemChangelog itemChangelog info (itemId)
+ * @param[out] itemChangelog itemChangelog info (itemId, operationId, syncStatus, accessName)
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN get_itemChangelogByItemId(DACI_HANDLER *daci_handler, int accountId, daci_item_changelog *itemChangelog);
+
+/*
+ * @brief checking whether the itemId exist in account_item_changelog_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] itemId itemId
+ * @return checking result
+ * @retval true exist
+ * @retval false not exist
+ */
+int isExist_itemChangelog(DACI_HANDLER *daci_handler, int accountId, char *itemId);
+
+/*
+ * =============================================================================================================================
+ * last_anchor_tbl
+ * =============================================================================================================================
+ */
+/*
+ * @brief insert anchor into last_anchor_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] lastAnchor lastAnchor info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN add_lastAnchor(DACI_HANDLER *daci_handler, daci_last_anchor *lastAnchor);
+
+/*
+ * @brief delete anchor from last_anchor_tbl by accountId
+ * delete all the anchor in account
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN delete_lastAnchorByAccountId(DACI_HANDLER *daci_handler, int accountId);
+
+/*
+ * @brief delete anchor from last_anchor_tbl by itemTypeId
+ * delete all the anchor in account and itemTypeId
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] itemTypeId itemTypeId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN delete_lastAnchorByItemTypeId(DACI_HANDLER *daci_handler, int accountId, int itemTypeId);
+
+/*
+ * @brief set last_anchor_server and last_anchor_client to last_anchor_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] lastAnchor lastAnchor info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN set_lastAnchor(DACI_HANDLER *daci_handler, daci_last_anchor *lastAnchor);
+
+/*
+ * @brief get all lastAnchor in account from last_anchor_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[out] count count of lastAnchor info
+ * @return operation result
+ * @retval array of lastAnchor info success
+ * @retval NULL fail
+ */
+daci_last_anchor *get_lastAnchorByAccountId(DACI_HANDLER *daci_handler, int accountId, int *count);
+
+/*
+ * @brief get last_anchor_server and last_anchor_client from last_anchor_tbl by itemTypeId
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] itemTypeId itemTypeId
+ * @param[out] count count of lastAnchor info
+ * @return operation result
+ * @retval lastAnchor info success
+ * @retval NULL fail
+ */
+daci_last_anchor *get_lastAnchorByItemTypeId(DACI_HANDLER *daci_handler, int accountId, int itemTypeId, int *count);
+
+/*
+ * @brief checking whether itemType of the anchor exist in last_anchor_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] itemTypeId itemTypeId
+ * @return checking result
+ * @retval true exist
+ * @retval false not exist
+ */
+int isExist_lastAnchor(DACI_HANDLER *daci_handler, int accountId, int itemTypeId);
+
+/*
+ * =============================================================================================================================
+ * mapping_tbl
+ * =============================================================================================================================
+ */
+/*
+ * @brief insert mapping into mapping_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] mapping mapping info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN add_mapping(DACI_HANDLER *daci_handler, daci_mapping *mapping);
+
+/*
+ * @brief delete mapping from mapping_tbl by accountId
+ * delete all the mapping in account
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN delete_mappingByAccountId(DACI_HANDLER *daci_handler, int accountId);
+
+/*
+ * @brief delete mapping from mapping_tbl by luid
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+* @param[in] luid luid
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN delete_mappingByLuid(DACI_HANDLER *daci_handler, int accountId, char *luid);
+
+/*
+ * @brief get all mapping info from mapping_tbl by accountId
+ * get all the mapping info in account
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[out] count count of mapping info
+ * @return operation result
+ * @retval array of mapping info success
+ * @retval NULL fail
+ */
+daci_mapping *get_mappingByAccountId(DACI_HANDLER *daci_handler, int accountId, int *count);
+
+/*
+ * @brief get luid from mapping_tbl by guid
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] luid luid
+ * @return operation result
+ * @retval guid guid
+ * @retval NULL fail
+ */
+char *get_mappingGuid(DACI_HANDLER *daci_handler, int accountId, char *luid);
+
+/*
+ * @brief checking whether account exist in mapping_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @return checking result
+ * @retval true exist
+ * @retval false not exist
+ */
+int isExist_mappingByAccountId(DACI_HANDLER *daci_handler, int accountId);
+
+/*
+ * @brief checking whether the account and itemTypeId of the itemTypeId exist in mapping_tbl
+ * @param[in] daci_handler sqlite3 handler pointer about thread
+ * @param[in] accountId accountId
+ * @param[in] luid luid
+ * @return checking result
+ * @retval true exist
+ * @retval false not exist
+ */
+int isExist_mappingByLuid(DACI_HANDLER *daci_handler, int accountId, char *luid);
+
+/*
+ * =============================================================================================================================
+ * id_provider_tbl, id_page_tbl
+ * =============================================================================================================================
+ */
+/*
+ * @brief insert id_provider into id_provider_tbl
+ * @param[in] id_provider id_provider info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN add_id_provider(DACI_HANDLER *daci_handler, daci_id_provider *id_provider);
+
+/*
+ * @brief get id_provider from id_provider_tbl
+ * @param[in] id_provider_code id_provider_code
+ * @param[out] id_provider id_provider info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN get_id_provider(DACI_HANDLER *daci_handler, unsigned int id_provider_code, daci_id_provider **id_provider);
+
+/*
+ * @brief update id_provider in id_provider_tbl
+ * @param[in] id_provider id_provider info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN update_id_provider(DACI_HANDLER *daci_handler, daci_id_provider *id_provider);
+
+/*
+ * @brief insert id_page into id_page_tbl
+ * @param[in] id_page id_page info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN add_id_page(DACI_HANDLER *daci_handler, daci_id_page *id_page, unsigned int page_byte_size);
+
+/*
+ * @brief delete id_page from id_page_tbl by page_index
+ * @param[in] id_provider_code id_provider_code
+ * @param[in] page_index page_index
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN delete_id_page(DACI_HANDLER *daci_handler, unsigned int id_provider_code, unsigned int page_index);
+
+/*
+ * @brief insert id_page into id_page_tbl
+ * @param[in] id_provider_code id_provider_code
+ * @param[in] page_index page_index
+ * @param[out] page_bit page_bit
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN get_id_page(DACI_HANDLER *daci_handler, unsigned int id_provider_code, unsigned int page_index, char **page_bit);
+
+/*
+ * @brief insert id_page into id_page_tbl
+ * @param[in] id_page id_page info
+ * @param[in] page_byte_size
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN update_id_page(DACI_HANDLER *daci_handler, daci_id_page *id_page, unsigned int page_byte_size);
+
+/*
+ * =============================================================================================================================
+ * Testing
+ * =============================================================================================================================
+ */
+void drop_table(DACI_HANDLER *daci_handler, int *accountIdList, int accountCount);
+
+/*
+ * For ID_Provider todo i should remove this rutine!!!!
+ */
+char *get_daci_file_path();
+
+#endif /* DACI_AGENT_H_ */
diff --git a/framework/include/DataAdapter/DACI_Agent_Handler_Manager.h b/framework/include/DataAdapter/DACI_Agent_Handler_Manager.h
new file mode 100755
index 0000000..599d7cd
--- /dev/null
+++ b/framework/include/DataAdapter/DACI_Agent_Handler_Manager.h
@@ -0,0 +1,788 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ * Heeyoung Hwang <heeyoung1008.hwang@samsung.com>
+ */
+
+#ifndef DACI_AGENT_HANDLER_MANAGER_H_
+#define DACI_AGENT_HANDLER_MANAGER_H_
+
+#include "DACI_Common.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file DACI_Agent_Handler_Manager.h
+ * @brief Interface list to use framework Common DataBase
+ */
+
+/**
+ * @brief Structure of managing database connection
+ */
+ typedef struct {
+ GHashTable *daci_handlerTable; /**< agent db handler hash table */
+ pthread_mutex_t *daci_handlerTable_mutex;
+ /**< mutex for agent db handler hash table */
+ } daci_handler_mgr;
+
+/*
+ * @brief alloc the agent db handler manager
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_DB_HANDLER_MGR fail
+ */
+ DACI_RETURN DACI_Alloc_AgentDB_Handler_Mgr();
+
+/*
+ * @brief free the agent db handler manager
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_DB_HANDLER_MGR fail
+ */
+ DACI_RETURN DACI_Free_AgentDB_Handler_Mgr();
+
+/*
+ * @brief delete all accounts data from Email-Service, Contacts-Service database, Calendar-Service database, Agent database
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERRORS fail
+ */
+ DACI_RETURN DACI_Clear_All_Database_Account();
+
+/*
+ * @brief delete one account data from Email-Service, Contacts-Service database, Calendar-Service database, Agent database
+ * @param[in] accountId account id of SyncAgent
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_DELETE_LAST_ACCOUNT success ( delete last account )
+ * @retval DACI_ERRORS fail
+ */
+ DACI_RETURN DACI_Delete_All_Database_Account(int accountId);
+
+/*
+ * @brief open Agent database
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_OPEN_FAILED fail
+ */
+ DACI_RETURN DACI_Open_Agent();
+
+/*
+ * @brief close Agent database
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_CLOSE_FAILED fail
+ */
+ DACI_RETURN DACI_Close_Agent();
+
+/*
+ * @brief create Agent database
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_CLOSE_FAILED fail
+ */
+ DACI_RETURN DACI_Create_Agent_Default_Table();
+
+/*
+* @brief start Agent database transaction
+* @return operation result
+* @retval DACI_SUCCESS success
+* @retval DACI_ERR_TRANSACTION_FAILED fail
+*/
+ DACI_RETURN DACI_Begin_Transaction();
+
+/*
+* @brief finish Agent database transaction
+* @param[in] transaction commit or rollback transaction
+* @return operation result
+* @retval DACI_SUCCESS success
+* @retval DACI_ERR_TRANSACTION_FAILED fail
+*/
+ DACI_RETURN DACI_End_Transaction(DACI_TRANSACTION transaction);
+
+/*
+ * @brief insert account into account_tbl
+ * @param[in] account account info
+ * @return operation result
+ * @retval accountId success
+ * @retval -1 fail
+ */
+ int DACI_Add_Account(daci_account *account);
+
+/*
+ * @brief delete account data from Agent database
+ * @param[in] accountId accountId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Delete_Account(int accountId);
+
+/*
+ * @brief set emailAddress to account_tbl
+ * @param[in] accountId accountId
+ * @param[in] emailAddress new emailAddress
+ * @param[in] accessName access module name
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Set_Account_Email_Address(int accountId, char *emailAddress, char *accessName);
+
+/*
+ * @brief set password to account_tbl
+ * @param[in] accountId accountId
+ * @param[in] password new password
+ * @param[in] accessName access module name
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Set_Account_Password(int accountId, char *password, char *accessName);
+
+/*
+ * @brief get all accountId from account_tbl
+ * @param[out] count count of accountId
+ * @return operation result
+ * @retval array of ccountId success
+ * @retval 0 fail
+ */
+ int *DACI_Get_Account_Account_Id_List(int *count);
+
+/*
+ * @brief get emailAddress from account_tbl
+ * @param[in] accountId accountId
+ * @return operation result
+ * @retval emailAddress success
+ * @retval 0 fail
+ */
+ char *DACI_Get_Account_Email_Address(int accountId);
+
+/*
+ * @brief get password from account_tbl
+ * @param[in] accountId accountId
+ * @return operation result
+ * @retval password success
+ * @retval 0 fail
+ */
+ char *DACI_Get_Account_Password(int accountId);
+
+/*
+ * @brief checking whether the accountId exist in account_tbl
+ * @param[in] accountId accountId
+ * @return checking result
+ * @retval 1 exist
+ * @retval 0 (or error value) not exist
+ */
+ int DACI_IsExist_Account(int accountId);
+
+/*
+ * @brief get access name from account_tbl
+ * @remarks caller should free return value
+ * @param[in] accountId accountId
+ * @return operation result
+ * @retval access name success
+ * @retval null pointer fail or not existed account id
+ */
+ char *DACI_Get_Access_Name(int accountId);
+
+/*
+ * @brief get account id list from account_tbl by access name
+ * @remarks caller should free return value
+ * @param[in] access_name accountId
+ * @param[out] accountId_count account id count
+ * @return operation result
+ * @retval account id list success
+ * @retval null pointer fail or not existed account id
+ */
+ int *DACI_Get_Account_Id_List_By_Access_Name(char *access_name, int *accountId_count);
+
+/*
+ * @brief insert folder into folder_tbl
+ * @param[in] folder array of folder info
+ * @param[out] count count of folder info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Add_Folder(daci_folder *folder, int count);
+
+/*
+ * @brief delete folder from folder_tbl by folderId
+ * @param[in] folderId folderId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Delete_Folder_By_Folder_Id(char *folderId);
+
+/*
+ * @brief get folderId from folder_tbl
+ * @param[in] accountId accountId
+ * @param[in] itemTypeId itemTypeId
+ * @param[in] serviceId serviceId
+ * @param[in] folderTypeId folderTypeId
+ * @return operation result
+ * @retval folderId success
+ * @retval 0 fail
+ */
+ char *DACI_Get_Folder_Folder_Id_By_Service_Id(int accountId, int itemTypeId, char *serviceId, int folderTypeId);
+
+/*
+ * @brief get folderId from folder_tbl by folderTypeId
+ * @param[in] accountId accountId
+ * @param[in] itemTypeId itemTypeId
+ * @param[in] folderTypeId folderTypeId
+ * @return operation result
+ * @retval folderId success
+ * @retval 0 fail
+ */
+ daci_id_list *DACI_Get_Folder_Folder_Id_By_Folder_Type_Id(int accountId, int itemTypeId, int folderTypeId);
+
+/*
+ * @brief get serviceId from folder_tbl
+ * @param[in] folderId folderId
+ * @return operation result
+ * @retval serviceId success
+ * @retval 0 fail
+ */
+ char *DACI_Get_Folder_Service_Id(char *folderId);
+
+/*
+ * @brief get all folder_id_list from folder_tbl by data_store_id
+ * get all the folders in account and data store
+ * @param[in] account_id account_id
+ * @param[in] itemTypeId itemTypeId
+ * @return operation result
+ * @retval array of folder_id success
+ * @retval 0 fail
+ */
+ daci_id_list *DACI_Get_Folder_Folder_Id_List_By_Item_Type_Id(int account_id, int itemTypeId);
+
+/*
+ * @brief get item from folder_tbl
+ * belonging to different account of folder get folder with the same service_id
+ * @param[in] accountId accountId
+ * @param[in] folderId folderId
+ * @param[in] count count of item info
+ * @return operation result
+ * @retval array of folder info success
+ * @retval 0 fail
+ */
+ daci_folder *DACI_Get_Folder_Mapping_Service_Id(int accountId, char *folderId, int *count);
+
+/*
+ * @brief insert item into item_tbl
+ * @param[in] item array of item info
+ * @param[in] count count of item info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Add_Item(daci_item *item, int count);
+
+/*
+ * @brief delete item from item_tbl by itemId
+ * @param[in] itemId itemId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Delete_Item_By_Item_Id(char *itemId);
+
+/*
+ * @brief delete item from item_tbl by accountId and itemTypeId
+ * @param[in] accountId accountId
+ * @param[in] itemTypeId itemTypeId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Delete_Item_By_Item_Type_Id(int accountId, int itemTypeId);
+
+/*
+ * @brief get itemId from item_tbl
+ * @param[in] accountId accountId
+ * @param[in] serviceId serviceId
+ * @param[in] itemTypeId itemTypeId
+ * @return operation result
+ * @retval itemId success
+ * @retval 0 fail
+ */
+ char *DACI_Get_Item_Item_Id(int accountId, char *serviceId, int itemTypeId);
+
+/*
+ * @brief get serviceId from item_tbl
+ * @param[in] itemId itemId
+ * @return operation result
+ * @retval serviceId success
+ * @retval 0 fail
+ */
+ char *DACI_Get_Item_Service_Id(char *itemId);
+
+/*
+ * @brief get item information from item_tbl
+ * @param[in] itemId itemId
+ * @return operation result
+ * @retval item info success
+ * @retval 0 fail
+ */
+ daci_item *DACI_Get_Item(char *itemId);
+
+/*
+ * @brief get all id in folder from item_tbl
+ * @param[in] folderId folderId
+ * @param[in] columnName columnName (COLUMN_NAME_ITEM_ID or COLUMN_NAME_SERVICE_ID)
+ * @return operation result
+ * @retval array of item id success
+ * @retval 0 fail
+ */
+ daci_id_list *DACI_Get_Item_Id_List(char *folderId, DACI_COLUMN_NAME columnName);
+
+/*
+ * @brief get item from item_tbl by accountId
+ * get all the items in account
+ * @param[in] accountId accountId
+ * @param[in] itemTypeId itemTypeId
+ * @param[in] count count of item info
+ * @return operation result
+ * @retval array of item info success
+ * @retval 0 fail
+ */
+ daci_item *DACI_Get_item_By_Account_Id(int accountId, int itemTypeId, int *count);
+
+/*
+ * @brief get item data from item_tbl and account_item_changelog_tbl
+ * Among the items that belong to the itemTypeId, Search for item info belong to the changelog
+ * @param[in] accountId accountId
+ * @param[in] itemTypeId itemTypeId
+ * @param[in] count count of item data
+ * @return operation result
+ * @retval array of item data success
+ * @retval 0 fail
+ */
+ daci_item_info *DACI_Get_Item_Info_By_Item_Type_Id(int accountId, int itemTypeId, int *count);
+
+/*
+ * @brief get item from item_tbl
+ * belonging to different account of item get item with the same service_id
+ * @param[in] accountId accountId
+ * @param[in] itemId itemId
+ * @param[in] count count of item info
+ * @return operation result
+ * @retval array of item info success
+ * @retval 0 fail
+ */
+ daci_item *DACI_Get_item_Mapping_Service_Id(int accountId, char *itemId, int *count);
+
+/*
+ * @brief get all id from item_tbl
+ * @param[in] data_store_id data_store_id
+ * @return operation result
+ * @retval array of item id success
+ * @retval 0 fail
+ */
+ daci_id_list *DACI_Get_Item_Id_List_By_Data_Store_Id(int data_store_id);
+
+/*
+ * @brief get item id list
+ * @param[in] account_id F/W account id
+ * @param[in] data_store_id data_store_id
+ * @return operation result
+ * @retval array of item id success
+ * @retval 0 fail or not exist
+ */
+ daci_id_list *DACI_Get_Item_Id_List_By_Data_Store_Id_with_AccountID(int account_id, int data_store_id);
+
+/*
+ * @brief get item id list from item_tbl and account_item_changelog_tbl
+ * Among the items that belong to the data_store_id, Search for item info belong to the changelog by operation_id
+ * @param[in] account_id account_id
+ * @param[in] data_store_id data_store_id
+ * @param[in] operation_id operation_id
+ * @return operation result
+ * @retval array of item id success
+ * @retval 0 fail
+ */
+ daci_id_list *DACI_Get_Item_Id_List_By_Operation_Id(int account_id, int data_store_id, int operation_id);
+
+/*
+ * @brief checking whether the itemId exist in item_tbl
+ * @param[in] itemId itemId
+ * @return checking result
+ * @retval 1 exist
+ * @retval 0(or error value) not exist
+ */
+ int DACI_IsExist_Item(char *itemId);
+
+/*
+ * @brief insert config into config_tbl
+ * @param[in] config config info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Add_Config(daci_config *config);
+
+/*
+ * @brief delete config from config_tbl by key
+ * @param[in] configId configId
+ * @param[in] key key
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Delete_Config_By_Key(int configId, char *key);
+
+/*
+ * @brief get config info from config_tbl by accountId
+ * get all the config in account
+ * @param[in] configId configId
+ * @param[in] count count of config info
+ * @return operation result
+ * @retval array of config info success
+ * @retval 0 fail
+ */
+ daci_config *DACI_Get_Config_By_Config_Id(int configId, int *count);
+
+/*
+ * @brief get config info from config_tbl by key
+ * @param[in] config config info (configId, key)
+ * @param[out] config config info (configId, key, value, type)
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Get_Config_By_Key(daci_config *config);
+
+/*
+ * @brief checking whether config of the config exist in config_tbl
+ * @param[in] configId configId
+ * @param[in] key key
+ * @return checking result
+ * @retval 1 exist
+ * @retval 0(or error value) not exist
+ */
+ int DACI_IsExist_Config(int configId, char *key);
+
+/*
+ * @brief insert or update config into config_tbl
+ * checking whether the config exist in config_tbl
+ * If it does not exist, insert config into config_tbl
+ * If it existed, update config into config_tbl
+ * @param[in] config config info
+ * @param[in] count count of config info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Update_Config(daci_config *config, int count);
+
+/*
+ * @brief insert itemChangelog into account_item_changelog_tbl
+ * @param[in] accountId accountId
+ * @param[in] itemChangelog array of itemChangelog info
+ * @param[in] count count of itemChangelog info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Add_Item_Changelog(int accountId, daci_item_changelog *itemChangelog, int count);
+
+/*
+ * @brief delete itemChangelog from account_item_changelog_tbl by itemId
+ * @param[in] accountId accountId
+ * @param[in] itemId itemId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Delete_Item_Changelog_By_Item_Id(int accountId, char *itemId);
+
+/*
+ * @brief delete itemChangelog from account_item_changelog_tbl by itemId list
+ * @param[in] accountId accountId
+ * @param[in] itemIdList array of itemId
+ * @param[in] count count of itemId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Delete_Item_Changelog_By_Item_Id_List(int accountId, char **itemIdList, int count);
+
+/*
+ * @brief delete itemChangelog from account_item_changelog_tbl by itemTypeId
+ * @param[in] accountId accountId
+ * @param[in] itemTypeId itemTypeId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Delete_Item_Changelog_By_Item_Type_Id(int accountId, int itemTypeId);
+
+/*
+ * @brief set operationId and syncStatus to account_item_changelog_tbl
+ * @param[in] accountId accountId
+ * @param[in] itemChangelog itemChangelog info (operationId, syncStatus, accessName, itemId)
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Set_Item_Changelog_Operation_Id(int accountId, daci_item_changelog *itemChangelog);
+
+/*
+ * @brief set syncStatus to account_item_changelog_tbl
+ * @param[in] accountId accountId
+ * @param[in] itemChangelog itemChangelog info (syncStatus, accessName, itemId)
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Set_Item_Changelog_Sync_Status(int accountId, daci_item_changelog *itemChangelog);
+
+/*
+ * @brief set SYNC_WAIT to account_item_changelog_tbl
+ * Among the items that match to the itemTypeId and belong to the folder
+ * If it existed in account_item_changelog_tbl, set SYNC_WAIT to account_item_changelog_tbl
+ * @param[in] accountId accountId
+ * @param[in] folderIdList array of folderId
+ * @param[in] folderIdCount count of folderId
+ * @param[in] itemTypeIdList array of itemTypeId
+ * @param[in] itemTypeIdCount count of itemTypeId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Set_Item_Changelog_Wait_Status(int accountId, char **folderIdList, int folderIdCount, int *itemTypeIdList, int itemTypeIdCount);
+
+/*
+ * @brief get itemChangelog info from account_item_changelog_tbl by itemId
+ * @param[in] accountId accountId
+ * @param[in] itemChangelog itemChangelog info (itemId)
+ * @param[out] itemChangelog itemChangelog info (itemId, operationId, syncStatus, accessName)
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Get_Item_Changelog_By_Item_Id(int accountId, daci_item_changelog *itemChangelog);
+
+/*
+ * @brief checking whether the itemId exist in account_item_changelog_tbl
+ * @param[in] accountId accountId
+ * @param[in] itemId itemId
+ * @return checking result
+ * @retval 1 exist
+ * @retval 0(or error value) not exist
+ */
+ int DACI_IsExist_Item_Changelog(int accountId, char *itemId);
+
+/*
+ * @brief insert anchor into last_anchor_tbl
+ * @param[in] lastAnchor lastAnchor info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Add_Last_Anchor(daci_last_anchor *lastAnchor);
+
+/*
+ * @brief set last_anchor_server and last_anchor_client to last_anchor_tbl
+ * @param[in] lastAnchor lastAnchor info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Set_Last_Anchor(daci_last_anchor *lastAnchor);
+
+/*
+ * @brief get last_anchor_server and last_anchor_client from last_anchor_tbl by itemTypeId
+ * @param[in] accountId accountId
+ * @param[in] itemTypeId itemTypeId
+ * @param[out] count count of lastAnchor info
+ * @return operation result
+ * @retval lastAnchor info success
+ * @retval 0 fail
+ */
+ daci_last_anchor *DACI_Get_Last_Anchor_By_Item_Type_Id(int accountId, int itemTypeId, int *count);
+
+/*
+ * @brief insert mapping into mapping_tbl
+ * @param[in] mapping mapping info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Add_Mapping(daci_mapping *mapping);
+
+/*
+ * @brief delete mapping from mapping_tbl by luid
+ * @param[in] accountId accountId
+ * @param[in] luid luid
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Delete_Mapping_By_Luid(int accountId, char *luid);
+
+/*
+ * @brief get all mapping info from mapping_tbl by accountId
+ * get all the mapping info in account
+ * @param[in] accountId accountId
+ * @param[out] count count of mapping info
+ * @return operation result
+ * @retval array of mapping info success
+ * @retval 0 fail
+ */
+ daci_mapping *DACI_Get_Mapping_By_Account_Id(int accountId, int *count);
+
+/*
+ * @brief get luid from mapping_tbl by guid
+ * @param[in] accountId accountId
+* @param[in] luid luid
+ * @return operation result
+ * @retval guid guid
+ * @retval 0 fail
+ */
+ char *DACI_Get_Mapping_Guid(int accountId, char *luid);
+
+/*
+ * @brief checking whether account exist in mapping_tbl
+ * @param[in] accountId accountId
+ * @return checking result
+ * @retval 1 exist
+ * @retval 0(or error value) not exist
+ */
+ int DACI_IsExist_Mapping_By_Account_Id(int accountId);
+
+/*
+ * @brief insert id_provider into id_provider_tbl
+ * @param[in] id_provider id_provider info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Add_ID_Provider(daci_id_provider *id_provider);
+
+/*
+ * @brief get id_provider from id_provider_tbl
+ * @param[in] id_provider_code id_provider_code
+ * @param[out] id_provider id_provider info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Get_ID_Provider(unsigned int id_provider_code, daci_id_provider **id_provider);
+
+/*
+ * @brief update id_provider in id_provider_tbl
+ * @param[in] id_provider id_provider info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Update_ID_Provider(daci_id_provider *id_provider);
+
+/*
+ * @brief insert id_page into id_page_tbl
+ * @param[in] id_page id_page info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Add_ID_Page(daci_id_page *id_page, unsigned int page_byte_size);
+
+/*
+ * @brief delete id_page from id_page_tbl by page_index
+ * @param[in] id_provider_code id_provider_code
+ * @param[in] page_index page_index
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Delete_ID_Page(unsigned int id_provider_code, unsigned int page_index);
+
+/*
+ * @brief insert id_page into id_page_tbl
+ * @param[in] id_provider_code id_provider_code
+ * @param[in] page_index page_index
+ * @param[out] page_bit page_bit
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Get_ID_Page(unsigned int id_provider_code, unsigned int page_index, char **page_bit);
+
+/*
+ * @brief insert id_page into id_page_tbl
+ * @param[in] id_page id_page info
+ * @param[in] page_byte_size page_bit's byte size
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Update_ID_Page(daci_id_page *id_page, unsigned int page_byte_size);
+
+/*
+ * @brief add the handler pointer to handler hash table
+ * @param[in] key unique key to distinguish handler pointer
+ * @param[in] pHandler db handler pointer
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_DB_HANDLER_MGR fail
+ */
+ DACI_RETURN add_agentHandler(unsigned int key, DACI_HANDLER *pHandler);
+
+/*
+ * @brief add the handler pointer to handler hash table
+ * @param[in] key unique key to distinguish handler pointer
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_DB_HANDLER_MGR fail
+ */
+ DACI_RETURN remove_agentHandler(unsigned int key);
+
+/*
+ * @brief add the handler pointer to handler hash table
+ * @param[in] key unique key to distinguish handler pointer
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_DB_HANDLER_MGR fail
+ */
+ DACI_HANDLER *get_agentHandler(unsigned int key);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* DACI_AGENT_HANDLER_MANAGER_H_ */
diff --git a/framework/include/DataAdapter/DACI_Agent_Mgr.h b/framework/include/DataAdapter/DACI_Agent_Mgr.h
new file mode 100755
index 0000000..adb9101
--- /dev/null
+++ b/framework/include/DataAdapter/DACI_Agent_Mgr.h
@@ -0,0 +1,108 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ * Heeyoung Hwang <heeyoung1008.hwang@samsung.com>
+ */
+
+#ifndef DACI_AGENT_MGR_H_
+#define DACI_AGENT_MGR_H_
+
+#include "EXT_DACI_Errors.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file DACI_Agent_Mgr.h
+ * @brief Support to sync F/W item, folder change log table with service storage
+ */
+
+/**
+ * @brief Enumerations of change operation code
+ */
+ typedef enum {
+ CHANGE_OPERATION_ADD = 301, /**< means add */
+ CHANGE_OPERATION_UPDATE = 302,
+ /**< means update */
+ CHANGE_OPERATION_DELETE = 303,
+ /**< means delete */
+ } CHANAGE_OPERATION;
+
+/**
+ * @brief construct F/W item, change log table from Service storage
+ * @remarks F/W maintain change point of service storage change, this function use the change point.
+ * @param[in] fw_account_id F/W account ID
+ * @param[in] service_type service type - service data connector pluIn's ID described in F/W config file
+ * @return DACI_SUCCESS on success, otherwise a error value.
+ */
+ DACI_RETURN construct_ItemTbl_From_Service(int fw_account_id, int service_type);
+
+/**
+ * @brief construct all account's F/W folder table from Service storage
+ * @param[in] service_type service type - service data connector pluIn's ID described in F/W config file
+ * @return DACI_SUCCESS on success, otherwise a error value.
+ */
+ DACI_RETURN construct_FolderTbl_From_Service(int service_type);
+
+/**
+ * @brief refresh F/W only item table from Service storage
+ * @remarks delete all F/W item, change log table and construct item table from item in current Service storage.
+ * @param[in] fw_account_id F/W account ID
+ * @param[in] service_type service type - service data connector pluIn's ID described in F/W config file
+ * @return DACI_SUCCESS on success, otherwise a error value.
+ */
+ DACI_RETURN refresh_Item_Tbl_From_Service(int fw_account_id, int service_type);
+
+/**
+ * @brief refresh F/W item, changeLog table from Service storage
+ * @remarks delete all F/W item, change log table and construct item, change log table from item in current Service storage.
+ * @param[in] fw_account_id F/W account ID
+ * @param[in] service_type service type - service data connector pluIn's ID described in F/W config file
+ * @return DACI_SUCCESS on success, otherwise a error value.
+ */
+ DACI_RETURN refresh_ChangeLog_Tbl_From_Service(int fw_account_id, int service_type);
+
+/**
+ * @brief set service change point as flag
+ * @remarks this change point used when construct item, change log table
+ * @param[in] fw_account_id F/W account ID
+ * @param[in] service_type service type - service data connector pluIn's ID described in F/W config file
+ * @return DACI_SUCCESS on success, otherwise a error value.
+ */
+ DACI_RETURN set_ChangePoint_Service(int fw_account_id, int service_type);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* DACI_AGENT_MGR_H_ */
diff --git a/framework/include/DataAdapter/DACI_ChangeLog.h b/framework/include/DataAdapter/DACI_ChangeLog.h
new file mode 100755
index 0000000..f8cd153
--- /dev/null
+++ b/framework/include/DataAdapter/DACI_ChangeLog.h
@@ -0,0 +1,126 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ * Heeyoung Hwang <heeyoung1008.hwang@samsung.com>
+ */
+
+#ifndef DACI_CHANGELOG_H_
+#define DACI_CHANGELOG_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file DACI_ChangeLog.h
+ * @brief Support to process changed service item, effect to F/W item, change log table.
+ */
+
+/**
+ * @brief handling added item to service storage, update F/W item & change log table
+ * @remarks This function is called when the new item is added to the service storage. data connector plugIn developer use this function.
+ * @param[in] service_accountID service account id
+ * @param[in] index possible mapping one service account with multiple F/W account, so need index of F/W account.
+ * @param[in] service_itemID added service item id
+ * @param[in] itemType service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] service_folderID service folder id
+ * @param[in] folderType folder type defined in data connector plug-In
+ * @return 1 on success, otherwise a negative error value.
+ * @see ChangeLog_Add_Item()
+ */
+ int handle_ADD_ITEM(int service_accountID, int index, char *service_itemID, int itemType, char *service_folderID, int folderType);
+
+/**
+ * @brief handling deleted item from service storage, update F/W item & change log table
+ * @remarks This function is called when the item is deleted from the service storage. data connector plugIn developer use this function.
+ * @param[in] service_accountID service account id
+ * @param[in] index possible mapping one service account with multiple F/W account, so need index of F/W account.
+ * @param[in] service_itemID added service item id
+ * @param[in] itemType service type - service data connector pluIn's ID described in F/W config file
+ * @return 1 on success, otherwise a negative error value.
+ * @see ChangeLog_Delete_Item()
+ */
+ int handle_DEL_ITEM(int service_accountID, int index, char *service_itemID, int itemType);
+
+/**
+ * @brief handling updated item from service storage, update F/W item & change log table
+ * @remarks This function is called when the item is updated from the service storage. data connector plugIn developer use this function.
+ * @param[in] service_accountID service account id
+ * @param[in] index possible mapping one service account with multiple F/W account, so need index of F/W account.
+ * @param[in] service_itemID added service item id
+ * @param[in] itemType service type - service data connector pluIn's ID described in F/W config file
+ * @return 1 on success, otherwise a negative error value.
+ * @see ChangeLog_Update_Item()
+ */
+ int handle_UPDATE_ITEM(int service_accountID, int index, char *service_itemID, int itemType);
+
+/**
+ * @brief handling added item to service storage, update F/W item & change log table
+ * @remarks This function works very similar to @ref handle_ADD_ITEM().
+ * This function is called force by Agent to set item & change log table manually.
+ * @param[in] fw_account_id F/W account id
+ * @param[in] fw_item_id F/W item id
+ * @param[in] service_itemID service item id
+ * @param[in] itemType service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] fw_folder_id F/W folder id
+ * @return 1 on success, otherwise a negative error value.
+ * @see handle_ADD_ITEM()
+ */
+ int ChangeLog_Add_Item(int fw_account_id, char *fw_item_id, char *service_item_id, int itemType, char *fw_folder_id);
+
+/**
+ * @brief handling deleted item from service storage, update F/W item & change log table
+ * @remarks This function works very similar to @ref handle_DEL_ITEM().
+ * @param[in] fw_account_id F/W account id
+ * @param[in] fw_item_id F/W item id
+ * @param[in] itemType service type - service data connector pluIn's ID described in F/W config file
+ * @return 1 on success, otherwise a negative error value.
+ * @see handle_DEL_ITEM()
+ */
+ int ChangeLog_Delete_Item(int fw_account_id, char *fw_item_id, int itemType);
+
+/**
+ * @brief handling updated item from service storage, update F/W item & change log table
+ * @remarks This function works very similar to @ref handle_UPDATE_ITEM().
+ * @param[in] fw_account_id F/W account id
+ * @param[in] fw_item_id F/W item id
+ * @param[in] itemType service type - service data connector pluIn's ID described in F/W config file
+ * @return 1 on success, otherwise a negative error value.
+ * @see handle_UPDATE_ITEM()
+ */
+ int ChangeLog_Update_Item(int fw_account_id, char *fw_item_id, int itemType);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* DACI_CHANGELOG_H_ */
diff --git a/framework/include/DataAdapter/DACI_Common.h b/framework/include/DataAdapter/DACI_Common.h
new file mode 100755
index 0000000..280e067
--- /dev/null
+++ b/framework/include/DataAdapter/DACI_Common.h
@@ -0,0 +1,359 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ * Heeyoung Hwang <heeyoung1008.hwang@samsung.com>
+ */
+
+#ifndef DACI_COMMON_H_
+#define DACI_COMMON_H_
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+#include <malloc.h>
+#include <glib.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <sys/stat.h>
+#include <sqlite3.h>
+
+#include "EXT_DACI_Errors.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file DACI_Common.h
+ * @brief Common factor of Framework common database
+ */
+
+#define MO_HANDLER sqlite3
+
+#define DACI_HANDLER sqlite3
+
+#define DACI_RETRY_COUNT 10
+
+#define DACI_MAX_QUERY_LENGTH 2048
+
+#define DACI_MAX_ACCOUNT 10
+
+#define DACI_FOLDER_TYPE_COUNT 19
+
+#define DACI_ITEM_TYPE_COUNT 6
+
+#define DACI_OPERATION_TYPE_COUNT 3
+
+#define DACI_MEMORY_SET(ptr) memset(ptr, 0x00, sizeof(ptr));
+
+#define DACI_MEMORY_MALLOC(type, size, count) (type)malloc(size*count)
+
+#define DACI_MEMORY_CALLOC(type, size, count) (type)calloc(count, size)
+
+#define DACI_MEMORY_FREE(src) \
+ if (src != NULL) { \
+ free(src); \
+ src = NULL; \
+ } \
+
+#define DACI_STRDUP(src) (src == NULL) ? NULL : strdup(src);
+
+#define DACI_ATOI(src) (src == NULL) ? 0 : atoi(src);
+
+#define DACI_GET_THREAD_ID pthread_self()
+
+/**
+ * @brief rename sqlite3 connection
+ */
+ typedef sqlite3_stmt *daci_stmt;
+
+/**
+ * @brief Enumerations of database peak type
+ */
+ typedef enum {
+ PEAK_TYPE_ON = 601, /**< peak type on */
+ PEAK_TYPE_ON_N_OFF, /**< peak type N off */
+ PEAK_TYPE_OFF /**< peak type off */
+ } DACI_PEAK_TYPE;
+
+/**
+ * @brief Enumerations of database transaction
+ */
+ typedef enum {
+ TRANSACTION_COMMIT, /**< means commit */
+ TRANSACTION_ROLLBACK
+ /**< means rollback */
+ } DACI_TRANSACTION;
+
+/**
+ * @brief Enumerations of common db's table list
+ */
+ typedef enum {
+ TABLE_NAME_ACCOUNT, /**< means account_tbl */
+ TABLE_NAME_FOLDER, /**< means folder_tbl */
+ TABLE_NAME_ITEM, /**< means item_tbl */
+ TABLE_NAME_CONFIG, /**< means config_tbl */
+ TABLE_NAME_ACCOUNT_ITEM_CHANGELOG, /**< means account_item_changelog_tbl */
+ TABLE_NAME_LAST_ANCHOR, /**< means last_anchor_tbl */
+ TABLE_NAME_MAPPING, /**< means mapping_tbl */
+ TABLE_NAME_ID_PROVIDER, /**< means id_provider_tbl */
+ TABLE_NAME_ID_PAGE, /**< means id_page_tbl */
+
+ TABLE_NAME_MAX /**< count of common database's tables */
+ } DACI_TABLE_NAME;
+
+/**
+ * @brief Enumerations of common column
+ */
+ typedef enum {
+ COLUMN_NAME_ACCOUNT_ID, /**< means column, account_id */
+ COLUMN_NAME_ITEM_ID, /**< means column, item_id */
+ COLUMN_NAME_SERVICE_ID, /**< means column, service_id */
+ COLUMN_NAME_ACCESS_NAME, /**< means column, access_name */
+
+ COLUMN_NAME_MAX /**< count of common columns */
+ } DACI_COLUMN_NAME;
+
+/**
+ * @brief Enumerations of structure type concern of DACI
+ */
+ typedef enum {
+ STRUCT_TYPE_ACCOUNT, /**< means structure, daci_account */
+ STRUCT_TYPE_FOLDER, /**< means structure, daci_folder */
+ STRUCT_TYPE_ITEM, /**< means structure, daci_item */
+ STRUCT_TYPE_CONFIG, /**< means structure, daci_config */
+ STRUCT_TYPE_ITEM_CHANGELOG, /**< means structure, daci_item_changelog */
+ STRUCT_TYPE_LAST_ANCHOR, /**< means structure, daci_last_anchor */
+ STRUCT_TYPE_MAPPING, /**< means structure, daci_mapping */
+ STRUCT_TYPE_ITEM_INFO, /**< means structure, daci_item_info */
+ STRUCT_TYPE_ID_LIST, /**< means structure, daci_id_list */
+
+ STRUCT_TYPE_MAX /**< count of enumeration */
+ } DACI_STRUCT_TYPE;
+
+/**
+ * @brief Structure of table - mapped column of account_tbl
+ */
+ typedef struct {
+ int account_id; /**< account_id */
+ char *email_address; /**< email_address */
+ char *password; /**< password */
+ bool enable; /**< enable */
+ char *accessName;
+ /**< name of accessor */
+ } daci_account;
+
+/**
+ * @brief Structure of table - mapped column of folder_tbl
+ */
+ typedef struct {
+ char *folder_id; /**< F/W folder id */
+ int data_store_id;
+ /**< service data connector pluIn's ID described in F/W config file */
+ int account_id; /**< F/W account id */
+ int folder_type_id;
+ /**< data connector plugIn has this folder type id */
+ char *service_id;
+ /**< service folder id */
+ char *parent_folder_id;
+ /**< parent folder id if exist hierarchy */
+ char *access_name;
+ /**< name of accessor */
+ } daci_folder;
+
+/**
+ * @brief Structure of table - mapped column of item_tbl
+ */
+ typedef struct {
+ char *item_id; /**< F/W item id */
+ int data_store_id;
+ /**< service data connector pluIn's ID described in F/W config file */
+ int account_id; /**< F/W account id */
+ char *folder_id; /**< F/W folder id */
+ char *service_id;
+ /**< service item id */
+ char *access_name; /**< name of accessor */
+ } daci_item;
+
+/**
+ * @brief Structure of table - mapped column of config_tbl
+ */
+ typedef struct {
+ int config_id; /**< configuration id, this means account id */
+ char *key; /**< configuration key */
+ char *value; /**< configuration value */
+ char *type; /**< configuration type */
+ char *access_name; /**< name of accessor */
+ } daci_config;
+
+/**
+ * @brief Structure of table - mapped column of account_item_changelog_tbl
+ */
+ typedef struct {
+ char *item_id; /**< F/W item id */
+ int operation_id; /**< operation id - add, delete, update */
+ char *status; /**< user defined status of item */
+ char *access_name; /**< name of accessor */
+ } daci_item_changelog;
+
+/**
+ * @brief Structure of table - mapped column of last_anchor_tbl
+ */
+ typedef struct {
+ int account_id; /**< F/W account id */
+ int data_store_id; /**< service data connector pluIn's ID described in F/W config file */
+ char *last_anchor_server; /**< last anchor that server has */
+ char *last_anchor_client; /**< last anchor that client has */
+ char *access_name; /**< name of accessor */
+ } daci_last_anchor;
+
+/**
+ * @brief Structure of table - mapped column of mapping_tbl
+ */
+ typedef struct {
+ int account_id; /**< F/W account id */
+ int data_store_id; /**< service data connector pluIn's ID described in F/W config file */
+ char *luid; /**< Locally unique identifier */
+ char *guid;
+ /**< Globally unique identifier */
+ char *access_name; /**< name of accessor */
+ } daci_mapping;
+
+/**
+ * @brief Structure of Item information
+ */
+ typedef struct {
+ char *itemId; /**< F/W item id */
+ int itemTypeId; /**< service data connector pluIn's ID described in F/W config file */
+ char *serviceId; /**< service item id */
+ int operationId; /**< operation type - add, delete, update */
+ char *syncStatus; /**< user defined status of item */
+ } daci_item_info;
+
+/**
+ * @brief Structure of Item id's container
+ */
+ typedef struct {
+ int count; /**< count of id */
+ char **id; /**< real id list */
+ } daci_id_list;
+
+/**
+ * @brief Structure of table - mapped column of id_provider_tbl
+ */
+ typedef struct {
+ unsigned int id_provider_code; /**< ID of id provider - this described in F/W configuration file */
+ unsigned int id_capacity; /**< max ID count possible id provider generate - this described in F/W configuration file */
+ unsigned int bit_per_page;
+ /**< most number of bit per one page */
+ unsigned int last_id; /**< current last provided ID */
+ unsigned int free_bit_cnt;
+ /**< the number of IDs that can be issued */
+ } daci_id_provider;
+
+/**
+ * @brief Structure of table - mapped column of id_page_tbl
+ */
+ typedef struct {
+ unsigned int page_index;/**< index of page */
+ unsigned int id_provider_code; /**< ID of id provider - this described in F/W configuration file */
+ char *page_bit; /**< real construction of ID issued */
+ } daci_id_page;
+
+/*
+ * @brief free memory daci_account structure
+ * @param[in] account daci_account structure
+ * @param[in] count structure count
+ */
+ void DACI_Free_Memory_Account(daci_account *account, int count);
+
+/*
+ * @brief free memory daci_folder structure
+ * @param[in] folder daci_folder structure
+ * @param[in] count structure count
+ */
+ void DACI_Free_Memory_Folder(daci_folder *folder, int count);
+
+/*
+ * @brief free memory daci_item structure
+ * @param[in] item daci_item structure
+ * @param[in] count structure count
+ */
+ void DACI_Free_Memory_Item(daci_item *item, int count);
+
+/*
+ * @brief free memory daci_config structure
+ * @param[in] config daci_config structure
+ * @param[in] count structure count
+ */
+ void DACI_Free_Memory_Config(daci_config *config, int count);
+
+/*
+ * @brief free memory daci_item_changelog structure
+ * @param[in] itemChangelog daci_item_changelog structure
+ * @param[in] count structure count
+ */
+ void DACI_Free_Memory_Item_Changelog(daci_item_changelog *itemChangelog, int count);
+
+/*
+ * @brief free memory daci_last_anchor structure
+ * @param[in] lastAnchor daci_last_anchor structure
+ * @param[in] count structure count
+ */
+ void DACI_Free_Memory_Last_Anchor(daci_last_anchor *lastAnchor, int count);
+
+/*
+ * @brief free memory daci_mapping structure
+ * @param[in] mapping daci_mapping structure
+ * @param[in] count structure count
+ */
+ void DACI_Free_Memory_Mapping(daci_mapping *mapping, int count);
+
+/*
+ * @brief free memory daci_item_info structure
+ * @param[in] itemInfo daci_item_info structure
+ * @param[in] count structure count
+ */
+ void DACI_Free_Memory_Item_Info(daci_item_info *itemInfo, int count);
+
+/*
+ * @brief free memory daci_id_list structure
+ * @param[in] idList daci_id_list structure
+ */
+ void DACI_Free_Memory_Id_List(daci_id_list *idList);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* DACI_COMMON_H_ */
diff --git a/framework/include/DataAdapter/DACI_Luid.h b/framework/include/DataAdapter/DACI_Luid.h
new file mode 100755
index 0000000..e68e3d9
--- /dev/null
+++ b/framework/include/DataAdapter/DACI_Luid.h
@@ -0,0 +1,71 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ * Heeyoung Hwang <heeyoung1008.hwang@samsung.com>
+ */
+
+#ifndef DACI_LUID_H_
+#define DACI_LUID_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file DACI_Luid.h
+ * @brief Support to generate unique ID
+ */
+
+/*
+ * @brief Generate new item LUID to use inside agent, when add new item
+ * @remarks Generated Sequence ID ( 1, 2, 3, .... ) to max ID value described in F/W initiation config file <ID-Provider><MaxID>
+ * @param[in] id_provider_code ID's seed value described in F/W initiation config file <ID-Provider><Code>
+ * @param[in] count
+ * @return operation result
+ * @retval generated item_luid list success (new item LUID converted to string)
+ * @retval 0 fail
+ */
+ char **DACI_Generate_Item_Luid(int id_provider_code, int count);
+
+/*
+ * @brief Generate new folder LUID to use inside agent, when add new folder
+ * @return operation result
+ * @retval folder_luid success (new folder LUID converted to string)
+ * @retval 0 fail
+ */
+ char *DACI_Generate_Folder_Luid();
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* DACI_LUID_H_ */
diff --git a/framework/include/DataAdapter/DACI_Service.h b/framework/include/DataAdapter/DACI_Service.h
new file mode 100755
index 0000000..1606308
--- /dev/null
+++ b/framework/include/DataAdapter/DACI_Service.h
@@ -0,0 +1,302 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ * Heeyoung Hwang <heeyoung1008.hwang@samsung.com>
+ */
+
+#ifndef DACI_SERVICE_H_
+#define DACI_SERVICE_H_
+
+#include "DACI_Common.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file DACI_Service.h
+ * @brief Support to use service storage
+ */
+
+/*
+ * @brief open service database
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Service_Open(int content_type);
+
+/*
+ * @brief close service database
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Service_Close(int content_type);
+
+/*
+ * @brief start transaction for service database
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Service_Begin(int content_type);
+
+/*
+ * @brief end transaction for service database
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] is_success 1 : commit, 0 : rollback
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Service_End(int content_type, int is_success);
+
+/*
+ * @brief insert item into service database
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] account_id F/W account_id
+ * @param[in] folder_id F/W folder_id
+ * @param[in] data item info
+ * @param[out] item_id success : service item_id, fail : 0
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Service_Add_Item(int content_type, int account_id, char *folder_id, const void *data, char **item_id);
+
+/*
+ * @brief update item from service database
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] account_id F/W account_id
+ * @param[in] folder_id F/W folder_id
+ * @param[in] item_id F/W item_id
+ * @param[in] data data
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Service_Update_Item(int content_type, int account_id, char *folder_id, char *item_id, const void *data);
+
+/*
+ * @brief delete item from service database
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] account_id F/W account_id
+ * @param[in] folder_id F/W folder_id
+ * @param[in] item_id F/W item_id
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Service_Delete_Item(int content_type, int account_id, char *folder_id, char *item_id);
+
+/*
+ * @brief delete all items from service database
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] account_id F/W account_id
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Service_Delete_All_Items(int content_type, int account_id);
+
+/*
+ * @brief get item from service database
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] account_id F/W account_id
+ * @param[in] folder_id F/W folder_id
+ * @param[in] item_id F/W item_id
+ * @param[out] data success : item info, fail : 0
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Service_Get_Item(int content_type, int account_id, char *folder_id, char *item_id, void **data);
+
+/*
+ * @brief insert folder into service database
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] account_id F/W account_id
+ * @param[in] folder_name folder_name
+ * @param[in] folder_type folder_type
+ * @param[out] folder_id success : folder_id, fail : 0
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Service_Add_Folder(int content_type, int account_id, char *folder_name, int folder_type, char **folder_id);
+
+/*
+ * @brief delete folder from service database
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] account_id F/W account_id
+ * @param[in] folder_id F/W folder_id
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Service_Delete_Folder(int content_type, int account_id, char *folder_id);
+
+/*
+ * @brief get folder from service database
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] account_id F/W account_id
+ * @param[in] folder_id F/W folder_id
+ * @param[out] out_folder_name success : folder name, fail : 0
+ * @param[out] out_folder_type success : folder type, fail : -1
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Service_Get_Folder(int content_type, int account_id, char *folder_id, char **out_folder_name, int *out_folder_type);
+
+/*
+ * @brief execute data into service
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] account_id F/W account_id
+ * @param[in] execute_key execute_key
+ * @param[in] execute_values execute_values
+ * @param[out] result extension result info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Service_Execute(int content_type, int account_ID, const char *execute_key, void *execute_values, void **result);
+
+/*
+ * @brief get item used count
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @return operation result
+ * @retval current item count success
+ * @retval error value fail : minus
+ */
+ int DACI_Service_Get_Used_Item_Count(int content_type);
+
+/*
+ * @brief get item used count for folder
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] account_id F/W account_id
+ * @param[in] folder_id F/W folder_id
+ * @return operation result
+ * @retval current item count success
+ * @retval error value fail : minus
+ */
+ int DACI_Service_Get_Used_Item_Count_For_Folder(int content_type, int account_id, char *folder_id);
+
+/*
+ * @brief write data store items to file
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] account_id F/W account_id
+ * @param[out] file_path written file_path
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail :minus
+ */
+ DACI_RETURN DACI_Service_Write_Items_To_FIle(int content_type, int account_id, char **file_path);
+
+/*
+ * @brief add file wrote item to data store
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] account_id F/W account_id
+ * @param[in] file_path file_path
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail : minus
+ */
+ DACI_RETURN DACI_Service_Add_File_Wrote_Items_To_Datastore(int content_type, int account_id, const char *file_path);
+
+/***************************************** Get Storage MetaInfo ****************************************/
+/*
+ * @brief get max item count per folder
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] folder_type folder type provided plug-in
+ * @return operation result
+ * @retval max item count success
+ * @retval -1 fail
+ */
+ int DACI_Service_Get_MAX_Item_Count(int content_type, int folder_type);
+
+/*
+ * @brief get service data's available field length
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] field_name field_name provided data connector plug-In
+ * @param[in] child_field_name child_field_name provided data connector plug-In
+ * @return operation result
+ * @retval available field length success
+ * @retval -1 fail
+ */
+ int DACI_Service_Get_MAX_Field_Length(int content_type, int field_name, int child_field_name);
+
+/*
+ * @brief get service data's available field count
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] field_name field_name provided data connector plug-In
+ * @param[in] child_field_name child_field_name provided data connector plug-In
+ * @return operation result
+ * @retval available field count success
+ * @retval -1 fail
+ */
+ int DACI_Service_Get_MAX_Field_Count(int content_type, int field_name, int child_field_name);
+
+/*
+ * @brief get service data's available field value's domain
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] field_name field_name provided data connector plug-In
+ * @param[in] child_field_name child_field_name provided data connector plug-In
+ * @param[out] str_val when domain value is string
+ * @param[out] num_val1 when domain value is integer (ex minimum value)
+ * @param[out] num_val2 when domain value is integer (ex maximum value)
+ * @return operation result
+ * @retval 1 success
+ * @retval -1 fail
+ */
+ int DACI_Service_Get_Field_Value(int content_type, int field_name, int child_field_name, char **str_val, int *num_val1, int *num_val2);
+
+/*
+ * @brief get service data's available field count
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] feature feature provided data connector plug-In
+ * @return operation result
+ * @retval 1 support
+ * @retval 0 not support
+ * @retval -1 fail
+ */
+ int DACI_Service_Get_Is_Support_Feature(int content_type, int feature);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* DACI_SERVICE_H_ */
diff --git a/framework/include/DataAdapter/EXT_DACI_Converter.h b/framework/include/DataAdapter/EXT_DACI_Converter.h
new file mode 100755
index 0000000..6664357
--- /dev/null
+++ b/framework/include/DataAdapter/EXT_DACI_Converter.h
@@ -0,0 +1,118 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ * Heeyoung Hwang <heeyoung1008.hwang@samsung.com>
+ */
+
+#ifndef EXT_DACI_CONVERTER_H_
+#define EXT_DACI_CONVERTER_H_
+
+#include "../PlugIn/DataConverter_Resource.h"
+#include "EXT_DACI_Errors.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file EXT_DACI_Converter.h
+ * @brief Support to use service converter module
+ */
+
+/*
+ * @brief allocate internal object for content type
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @return operation result
+ * @retval internal struct pointer success
+ * @retval 0 fail
+ */
+ void *T_DACI_Alloc_Obj(int content_type);
+
+/*
+ * @brief free internal object for content type
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] in_object internal object pointer
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERRORS fail
+ */
+ DACI_RETURN T_DACI_Free_Obj(int content_type, void *in_object);
+
+/*
+ * @brief set value for internal object
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] in_object internal object pointer
+ * @param[in] key key
+ * @param[in] extension_key extension key
+ * @param[in] set_value value
+ * @return operation result
+ * @retval new object pointer success
+ * @retval 0 fail
+ */
+ void *T_DACI_Set_Value_To_Obj(int content_type, void *in_object, int key, char *extension_key, void *set_value);
+
+/*
+ * @brief allocate internal object for content type
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] in_object internal object pointer
+ * @param[in] key key
+ * @param[in] extension_key extension key
+ * @return operation result
+ * @retval value pointer success
+ * @retval 0 fail
+ */
+ void *T_DACI_Get_Value_To_Obj(int content_type, void *in_object, int key, char *extension_key);
+
+/*
+ * @brief get meta infomation of internal object
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @return operation result
+ * @retval value pointer success
+ * @retval 0 fail
+ */
+ Object_Info *T_DACI_Get_Obj_Info(int content_type);
+
+/*
+ * @brief free infomation of internal object
+ * @param[in] content_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] obj_info object info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERRORS fail
+ */
+ DACI_RETURN T_DACI_Free_Obj_Info(int content_type, Object_Info *obj_info);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* EXT_DACI_CONVERTER_H_ */
diff --git a/framework/include/DataAdapter/EXT_DACI_Errors.h b/framework/include/DataAdapter/EXT_DACI_Errors.h
new file mode 100755
index 0000000..c98e131
--- /dev/null
+++ b/framework/include/DataAdapter/EXT_DACI_Errors.h
@@ -0,0 +1,81 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ * Heeyoung Hwang <heeyoung1008.hwang@samsung.com>
+ */
+
+#ifndef EXT_DACI_ERRORS_H_
+#define EXT_DACI_ERRORS_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file EXT_DACI_Errors.h
+ * @brief Definition of framework error codes for DACI
+ */
+
+/**
+ * @brief Enumerations of error codes for DACI
+ */
+ typedef enum _DACI_RETURN {
+ DACI_SUCCESS = 1, /**< successful */
+ DACI_ERRORS = -800, /**< fail */
+ DACI_NOT_FOUND_PLUG_IN = -801, /**< not found data connector or converter plugIn */
+ DACI_ERR_OPEN_FAILED = -802, /**< database open fail */
+ DACI_ERR_CLOSE_FAILED = -803, /**< database close fail */
+ DACI_ERR_TRANSACTION_FAILED = -804, /**< transaction fail */
+ DACI_ERR_CREATE_TABLE_FAILED = -805, /**< create table fail */
+ DACI_ERR_DROP_TABLE_FAILED = -806, /**< drop table fail */
+ DACI_ERR_QUERY_FAILED = -807, /**< process query fail */
+ DACI_ERR_NOT_OPENED = -808, /**< database not opened so fail */
+ DACI_ERR_ACCOUNT_FULL = -809, /**< exist full account */
+ DACI_ERR_DELETE_LAST_ACCOUNT = -810, /**< */
+ DACI_ERR_PRIMARY_KEY_NOT_UNIQUE = -811, /**< already exist primary key */
+ DACI_ERR_DB_HANDLER_MGR = -812, /**< database connection fail - get or create */
+ DACI_ERR_ALREADY_EXIST = -813, /**< */
+ DACI_ERR_INVALID_CONTENT = -814, /**< */
+ DACI_ERR_MEMORY_FULL = -815, /**< memory full */
+ DACI_ERR_SUB_DATA_EXIST = -816, /**< item not empty */
+ DACI_ERR_LOCKED = -817, /**< database lock */
+ DACI_ERR_MORE_DATA = -818, /**< query result has more data, used when iterating */
+ DACI_ERR_NO_DATA = -819, /**< query result not found */
+ DACI_ERR_NOT_SUPPORTED = -820, /**< */
+ DACI_ERR_NOT_EXECUTE = -821, /**< */
+ } DACI_RETURN;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* EXT_DACI_ERRORS_H_ */
diff --git a/framework/include/Device/EXT_DCI_Common.h b/framework/include/Device/EXT_DCI_Common.h
new file mode 100755
index 0000000..f7e7546
--- /dev/null
+++ b/framework/include/Device/EXT_DCI_Common.h
@@ -0,0 +1,75 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef DICI_COMMON_H_
+#define DICI_COMMON_H_
+
+#include "EXT_DCI_Errors.h"
+
+/**
+ * @file EXT_DCI_Common.h
+ * @brief Defines enumerations for device execution
+ */
+
+/**
+ * @brief Enumerations for state of power manager
+ */
+typedef enum {
+ LCD_NORMAL = 0,
+ LCD_DIM,
+ LCD_OFF,
+ SUSPEND,
+ POWER_OFF,
+ SETALL
+} PM_State;
+
+/**
+ * @brief Enumerations for lock state of power manager
+ */
+typedef enum {
+ GOTO_STATE_NOW = 0,
+ STAY_CUR_STATE
+} PM_Lock_State_Flag;
+
+/**
+ * @brief Enumerations for unlock state of power manager
+ */
+typedef enum {
+ SLEEP_MARGIN = 0,
+ RESET_TIMER,
+ KEEP_TIMER
+} PM_Unlock_State_Flag;
+
+#endif /* DICI_COMMON_H_ */
diff --git a/framework/include/Device/EXT_DCI_DevExecutor.h b/framework/include/Device/EXT_DCI_DevExecutor.h
new file mode 100755
index 0000000..1894545
--- /dev/null
+++ b/framework/include/Device/EXT_DCI_DevExecutor.h
@@ -0,0 +1,79 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ * SeongWon Shim <seongwon.shim@samsung.com>
+ */
+
+#ifndef EXT_DCI_DEVEXECUTOR_H_
+#define EXT_DCI_DEVEXECUTOR_H_
+
+#include "EXT_DCI_Common.h"
+
+/**
+ * @file EXT_DCI_DevExecutor.h
+ * @brief Defines device execution APIs
+ */
+
+/**
+ * @brief Lock a particular power-state as the current power-state
+ * @remarks If parameter 'timeout' value is 0, state of power manager is always lock until calling DCI_PM_Unlock_State()
+ * @param[in] device_plugIn_id Device PlugIn ID
+ * @param[in] state LCD_NORMAL, LCD_DIM, LCD_OFF, SUSPEND, POWER_OFF, SETALL
+ * @param[in] flag GOTO_STATE_NOW, STAY_CUR_STATE
+ * @param[in] timeout lock-timeout in milliseconds
+ * @return Operation result
+ * @retval DICI_SUCCESS Successful
+ * @retval DCI_FAIL Operation failed
+ *
+ * @code
+DCI_RETURN res = DCI_PM_Lock_State(1, LCD_OFF , STAY_CUR_STATE, 0);
+ * @endcode
+ */
+DCI_RETURN DCI_PM_Lock_State(int device_plugIn_id, PM_State state, PM_Lock_State_Flag flag, unsigned int timeout);
+
+/**
+ * @brief Unlock the power-state
+ * @param[in] device_plugIn_id Device PlugIn ID
+ * @param[in] state LCD_NORMAL, LCD_DIM, LCD_OFF, SUSPEND, POWER_OFF, SETALL
+ * @param[in] flag SLEEP_MARGIN, RESET_TIMER, KEEP_TIMER
+ * @return Operation result
+ * @retval DICI_SUCCESS Successful
+ * @retval DCI_FAIL Operation failed
+ *
+ * @code
+ DCI_RETURN res = DCI_PM_Unlock_State(1, LCD_OFF , RESET_TIMER);
+ * @endcode
+ */
+DCI_RETURN DCI_PM_Unlock_State(int device_plugIn_id, PM_State state, PM_Unlock_State_Flag flag);
+
+#endif /* EXT_DCI_DEVEXECUTOR_H_ */
diff --git a/framework/include/Device/EXT_DCI_DevInfo.h b/framework/include/Device/EXT_DCI_DevInfo.h
new file mode 100755
index 0000000..132bcbb
--- /dev/null
+++ b/framework/include/Device/EXT_DCI_DevInfo.h
@@ -0,0 +1,95 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef EXT_DCI_H_
+#define EXT_DCI_H_
+
+#include "EXT_DCI_Common.h"
+
+/**
+ * @file EXT_DCI_DevInfo.h
+ * @brief Defines device information APIs
+ */
+
+/**
+ * @brief Load device information on the memory
+ * @remarks Run only once at the beginning of the process
+ * @param[in] device_plugIn_id Device plugIn ID
+ * @return Operation result
+ * @retval DICI_SUCCESS Successful
+ * @retval DCI_FAIL Operation failed
+ *
+ * @code
+DCI_RETURN res = DICI_Init(1);
+ * @endcode
+ */
+DCI_RETURN DCI_Init(int device_plugIn_id);
+
+/**
+ * @brief Get particular device information on the memory
+ * @remarks Device information supported by sync-agent-framework (2012.03.19)
+ * DevID(device id), Man(manufacture), Mod(model id or model number), SwV(software version),
+ * HwV(hardware version), FwV(firmware version), OEM(original equipment manufacturer),
+ * DevTyp(device type), Lang(language), DTDV(DTD version), PDAV(PDA version),
+ * CSCV(CSC version), ModemV(modem version), KernelV(kernal version), OPCO(OPCO information)
+ * @param[in] device_plugIn_id Device plugIn ID
+ * @param[in] info_name Name of device information (see remarks)
+ * @param[out] value Value of device information
+ * @return Operation result
+ * @retval DICI_SUCCESS Successful
+ * @retval DICI_FAIL Operation failed
+ * @pre The application should be called DCI_Init()
+ *
+ * @code
+ char *value;
+ DCI_RETURN res = DICI_Get_DevInfo(1, "DevID", &value);
+ * @endcode
+ */
+DCI_RETURN DCI_Get_DevInfo(int device_plugIn_id, char *info_name, char **value);
+
+/**
+ * @brief Free memory for device information on the memory
+ * @param[in] device_plugIn_id Device plugIn ID
+ * @return Operation result
+ * @retval DICI_SUCCESS Successful
+ * @retval DICI_FAIL Operation failed
+ *
+ * @code
+DCI_RETURN res = DICI_Destroy(1);
+ * @endcode
+ */
+DCI_RETURN DCI_Destroy(int device_plugIn_id);
+
+#endif /* EXT_DCI_H_ */
diff --git a/framework/include/Device/EXT_DCI_Errors.h b/framework/include/Device/EXT_DCI_Errors.h
new file mode 100755
index 0000000..03859b3
--- /dev/null
+++ b/framework/include/Device/EXT_DCI_Errors.h
@@ -0,0 +1,55 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef EXT_DCI_ERRORS_H_
+#define EXT_DCI_ERRORS_H_
+
+/**
+ * @file EXT_DCI_Errors.h
+ * @brief Defines DCI errors
+ */
+
+/**
+ * @brief Enumerations for the DCI errors
+ */
+typedef enum {
+ DCI_SUCCESS = 1,
+ DCI_FAIL = -1,
+
+ DCI_NOT_EXIST_DEVINFO = -2,
+ DCI_DEVINFO_VALUE_IS_NULL = -3,
+} DCI_RETURN;
+
+#endif /* EXT_DCI_ERRORS_H_ */
diff --git a/framework/include/EngineController/engine_controller.h b/framework/include/EngineController/engine_controller.h
new file mode 100644
index 0000000..816cc04
--- /dev/null
+++ b/framework/include/EngineController/engine_controller.h
@@ -0,0 +1,132 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef ENGINE_CONTROLLER_H_
+#define ENGINE_CONTROLLER_H_
+
+#include "engine_controller_define.h"
+#include "task_spec.h"
+#include "queuing_rule_spec.h"
+
+/**
+ * @file engine_controller.h
+ * @brief Provides APIs to support task registration and request
+ */
+
+/**
+ * @brief Callback function which is called when task is finsihed
+ * @param[in] task_error Result of the watching task
+ * @param[in] out_param_cnt Count of out parameter of the watching task
+ * @param[in] out_param_array Array of parameter values of the watching task
+ * @param[in] usr_data User defined data
+ */
+typedef void (*task_finish_callback_func) (task_error_t task_error, ec_uint out_param_cnt, param_t **out_param_array, ec_pointer usr_data);
+
+/**
+ * @brief Callback function which is called when queuing rule spec registration done
+ * @param[in] ec_error Result of the registration
+ * @param[in] registered_id ID of the registered queuing rule spec
+ * @param[in] usr_data User defined data
+ */
+typedef void (*register_finish_callback_func) (engine_controller_error_t ec_error, ec_uint registered_id, ec_pointer usr_data);
+
+/* external interfaces */
+
+/**
+ * @brief Registers user created task spec
+ * @param[in] task_spec_id User defined task spec ID
+ * @param[in] task_spec_name User defined task spec ID
+ * @param[in] pTask_spec User created task spec in task_stpec_t type
+ * @param[in] cal_func ID calculation func
+ */
+void engine_controller_register_task_spec(ec_uint task_spec_id, ec_char *task_spec_name, task_spec_t *pTask_spec, calculate_identifier_func cal_func);
+
+/**
+ * @brief Registers user created asychronousqueuing rule spec
+ * @param[in] pSpec User created queuing rule spec to register
+ * @param[in] finish_callback Callback function to be called on registration done
+ * @param[in] usr_data User data to pass to the callback function
+ */
+void engine_controller_async_register_queuing_rule_spec(queuing_rule_spec_t *pSpec, register_finish_callback_func finish_callback, ec_pointer usr_data);
+
+/**
+ * @brief Registers user created sychronous queuing rule spec
+ * @param[in] pSpec User created queuing rule spec to register
+ * @param[in] ec_error Result of the registration
+ * @param[in] registered_id ID issued as a result of the registration
+ */
+void engine_controller_sync_register_queuing_rule_spec(queuing_rule_spec_t *pSpec, engine_controller_error_t *ec_error, ec_uint *registered_id);
+
+/**
+ * @brief Requests task asynchronously, using task spec/param info and etc
+ * @param[in] task_spec_id User defined task spec ID
+ * @param[in] identifier User defined task identifier
+ * @param[in] cnt_in_param Count of input parameters
+ * @param[in] in_param_index_array Array containing param index
+ * @param[in] in_param_value_type_array Array containing param value type
+ * @param[in] in_param_value_array Array containing param value
+ * @param[in] task_finish_callback Task finish callback
+ * @param[in] simple_task_finish_callback_usr_data User data passed to finish callback
+ * @param[out] request_id Task request ID which Engine Controller issues
+ */
+void engine_controller_async_request_task(ec_uint task_spec_id, ec_uint identifier, ec_int cnt_in_param, ec_int *in_param_index_array, ECValueType * in_param_value_type_array, ec_pointer * in_param_value_array, task_finish_callback_func task_finish_callback, ec_pointer simple_task_finish_callback_usr_data, ec_int *request_id);
+
+/**
+ * @brief
+ * @param[in] task_spec_id User defined task spec ID
+ * @param[in] identifier User defined task identifier
+ * @param[in] cnt_in_param Count of input parameters
+ * @param[in] in_param_index_array Array containing param index
+ * @param[in] in_param_value_type_array Array containing param value type
+ * @param[in] in_param_value_array Array containing param value
+ * @param[out] request_id Task request ID which Engine Controller issues
+ * @param[out] task_error Result of the task
+ * @param[out] out_param_cnt Count of output parameter of the task
+ * @param[out] out_param_array param_t type of array containing output parameter of the task
+ */
+void engine_controller_sync_request_task(ec_uint task_spec_id, ec_uint identifier, ec_int cnt_in_param, ec_int *in_param_index_array, ECValueType * in_param_value_type_array, ec_pointer * in_param_value_array, ec_int *request_id, task_error_t * task_error, ec_uint *out_param_cnt, param_t ***out_param_array);
+
+/**
+ * @brief Cancel task which has given request ID
+ * @param[in] request_id_to_cancel request ID of task to cancel
+ */
+void engine_controller_cancel_task(ec_int request_id_to_cancel);
+
+/**
+ * @brief Cancels all running task
+ */
+void engine_controller_cancel_all_task();
+
+#endif /* ENGINE_CONTROLLER_H_ */
diff --git a/framework/include/EngineController/engine_controller_define.h b/framework/include/EngineController/engine_controller_define.h
new file mode 100644
index 0000000..adc56cc
--- /dev/null
+++ b/framework/include/EngineController/engine_controller_define.h
@@ -0,0 +1,107 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef ENGINE_CONTROLLER_DEFINE_H_
+#define ENGINE_CONTROLLER_DEFINE_H_
+
+#include "fundamental_type.h"
+#include "task_error.h"
+
+/**
+ * @file engine_controller_define.h
+ * @brief Provides definitaion of result enum and data type enum
+ */
+
+/**
+ * @brief Enumeration for type of value used in Engine Controller
+ */
+typedef enum ECValueType_e ECValueType;
+enum ECValueType_e {
+ EC_VALUE_TYPE_UNKNOWN = 0, /**< Unknown type */
+ EC_VALUE_TYPE_BOOLEAN, /**< boolean type */
+ EC_VALUE_TYPE_CHAR, /**< char type */
+ EC_VALUE_TYPE_UCHAR, /**< unsigned char type */
+ EC_VALUE_TYPE_INT, /**< integer type */
+ EC_VALUE_TYPE_UINT, /**< unsigned integer type */
+ EC_VALUE_TYPE_FLOAT, /**< float type */
+ EC_VALUE_TYPE_DOUBLE, /**< double type */
+ EC_VALUE_TYPE_STRUCT /**< structure type */
+};
+
+/**
+ * @brief Callback function which calculates ID
+ * @param[in] data Data to use for calculation
+ * @return Calculated ID in unsigned integer type
+ */
+typedef ec_uint (*calculate_identifier_func) (ec_pointer data);
+
+/**
+ * @brief Enumeration for type of error used in Engine Controller
+ */
+typedef enum engine_controller_error_e engine_controller_error_t;
+enum engine_controller_error_e {
+ ENGINE_CONTROLLER_OK = 0, /**< OK, no error */
+ ENGINE_CONTROLLER_UNKNOWN_ERROR, /**< Unknown error */
+
+ ENGINE_CONTROLLER_INVALID_PARAMETER, /**< When invalid parameters are used */
+
+ ENGINE_CONTROLLER_OUT_OF_MEMORY, /**< When system gets out of memory */
+ ENGINE_CONTROLLER_TASK_PARAMETERS_NOT_CONNECTABLE, /**< When function parameters are not match each other so not connectable */
+ ENGINE_CONTROLLER_INVALID_TASK, /**< When invalid task requested */
+
+ ENGINE_CONTROLLER_INVALID_CHILD_TASK_INDEX, /**< When child task's index is wrong */
+ ENGINE_CONTROLLER_INVALID_PARAM_INDEX = 5, /**< When parameter index is wrong*/
+
+ ENGINE_CONTROLLER_MUST_USE_CONTAINER_TASK, /**< When 'simple' or 'dynamic container' task is used instead of 'dynamic' task */
+ ENGINE_CONTROLLER_MUST_USE_DYNAMIC_CONTAINER_TASK, /**< When 'simple' or 'container' task is used instead of dynamic container task */
+
+ ENGINE_CONTROLLER_CANNOT_FIND_FROM_TASK, /**< When fail to get parameter from task */
+ ENGINE_CONTROLLER_CANNOT_FIND_TO_TASK, /**< When fail to set parameter to task */
+ ENGINE_CONTROLLER_CANNOT_FIND_FROM_PARAM = 10, /**< When fail to get value from parameter */
+ ENGINE_CONTROLLER_CANNOT_FIND_TO_PARAM, /**< When fail to set parameter to parameter */
+
+ ENGINE_CONTROLLER_INVALID_CHILD_PATH, /**< When queuing rule related child has wrong path */
+ ENGINE_CONTROLLER_DUPLICATE_CHILD_PATH, /**< When queuing rule related child has duplicated path */
+
+ ENGINE_CONTROLLER_OUT_OF_FREE_ID, /**< When there is no free ID to issue */
+
+ ENGINE_CONTROLLER_DUPLICATE_QUEUING_RULE_SPEC = 15, /**< When trying to register same queuing rule spec */
+
+ ENGINE_CONTROLLER_DUPLICATE_PROGRESS_BLOCKING_ENTITY, /**< When trying to registe same blocking entitiy in a queuing rule spec */
+
+ ENGINE_CONTROLLER_DUPLICATE_DATA_FLOW_EDGE /**< When trying to set same data flow edge */
+};
+
+#endif /* ENGINE_CONTROLLER_DEFINE_H_ */
diff --git a/framework/include/EngineController/engine_controller_internal.h b/framework/include/EngineController/engine_controller_internal.h
new file mode 100644
index 0000000..52ff1f5
--- /dev/null
+++ b/framework/include/EngineController/engine_controller_internal.h
@@ -0,0 +1,85 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef ENGINE_CONTROLLER_INTERNAL_H_
+#define ENGINE_CONTROLLER_INTERNAL_H_
+
+#include <glib.h>
+#include <pthread.h>
+#include "Utility/fw_async_queue.h"
+#include "thread_pool.h"
+#include "task_info_pool.h"
+#include "queuing_rule_spec_pool.h"
+#include "engine_controller_message.h"
+#include "task_message.h"
+#include "task_pool.h"
+
+typedef struct engine_controller_s engine_controller_t;
+struct engine_controller_s {
+ fw_async_queue_t *pQueue; /* receive operation_message */
+ task_pool_t *pTask_pool; /* managing root tasks */
+ queuing_rule_spec_pool_t *pQueuing_rule_spec_pool;
+
+ pthread_t thread_id;
+ thread_pool_t *pThread_pool;
+};
+
+engine_controller_t *alloc_engine_controller(ec_uint max_thread_count);
+void free_engine_controller(engine_controller_t *pEngine_controller);
+void run_engine_controller(engine_controller_t *pEngine_controller);
+
+typedef struct engine_controller_receiver_s engine_controller_receiver_t;
+struct engine_controller_receiver_s {
+ /* msg id management */
+ ec_int next_msg_id;
+
+ fw_async_queue_t *pQueue; /* receive message */
+ pthread_t thread_id;
+ task_info_pool_t *pTask_info_pool;
+ queuing_rule_spec_pool_t *pQueuing_rule_spec_pool;
+ engine_controller_t *pEngine_controller;
+};
+
+engine_controller_receiver_t *alloc_engine_controller_receiver(engine_controller_t *pEngine_controller);
+void free_engine_controller_receiver(engine_controller_receiver_t *pEngine_controller_receiver);
+void run_engine_controller_receiver(engine_controller_receiver_t *pEngine_controller_receiver);
+
+void send_msg_to_engine_controller_receiver(engine_controller_msg_head_t *msg);
+void send_msg_to_engine_controller(task_message_t *pTask_msg);
+void send_msg_to_engine_controller_with_compare_priority(task_message_t *pTask_msg, compare_task_msg_priority_func ctmp_func, ec_pointer user_data);
+
+bool init_engine_controller(unsigned int max_thread_count);
+
+#endif /* ENGINE_CONTROLLER_INTERNAL_H_ */
diff --git a/framework/include/EngineController/engine_controller_message.h b/framework/include/EngineController/engine_controller_message.h
new file mode 100644
index 0000000..e8f74b0
--- /dev/null
+++ b/framework/include/EngineController/engine_controller_message.h
@@ -0,0 +1,142 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef ENGINE_CONTROLLER_MESSAGE_H_
+#define ENGINE_CONTROLLER_MESSAGE_H_
+
+#include <limits.h>
+
+#include "engine_controller_define.h"
+#include "engine_controller.h"
+#include "param_value.h"
+#include "param_spec.h"
+#include "task_spec.h"
+
+typedef enum engine_controller_msg_type_e {
+ ENGINE_CONTROLLER_UNKNOWN_MSG_TYPE = 0,
+ ENGINE_CONTROLLER_REGISTER_MSG_TYPE,
+ ENGINE_CONTROLLER_UNREGISTER_MSG_TYPE,
+ ENGINE_CONTROLLER_REGISTER_QUEUING_RULE_SPEC_MSG_TYPE,
+ ENGINE_CONTROLLER_REQUEST_MSG_TYPE,
+ ENGINE_CONTROLLER_CANCEL_MSG_TYPE,
+ ENGINE_CONTROLLER_CANCEL_ALL_MSG_TYPE,
+} engine_controller_msg_type_t;
+
+typedef struct engine_controller_msg_head_s engine_controller_msg_head_t;
+struct engine_controller_msg_head_s {
+ engine_controller_msg_type_t msg_type;
+ ec_int msg_id;
+};
+
+typedef struct engine_controller_request_msg_s engine_controller_request_msg_t;
+struct engine_controller_request_msg_s {
+ engine_controller_msg_head_t msg_head;
+
+ ec_uint task_spec_id;
+
+ /* input data */
+ ec_uint identifier;
+ ec_int cnt_in_param;
+ ec_int *in_param_index_array;
+ param_value_t *in_param_value_array;
+
+ /* aynchronous finish callback */
+ task_finish_callback_func task_finish_callback;
+ ec_pointer simple_task_finish_callback_usr_data;
+};
+
+typedef struct engine_controller_cancel_all_msg_s engine_controller_cancel_all_msg_t;
+struct engine_controller_cancel_all_msg_s {
+ engine_controller_msg_head_t msg_head;
+};
+
+typedef struct engine_controller_cancel_msg_s engine_controller_cancel_msg_t;
+struct engine_controller_cancel_msg_s {
+ engine_controller_msg_head_t msg_head;
+
+ ec_uint request_msg_id_to_cancel;
+};
+
+typedef struct engine_controller_register_msg_s engine_controller_register_msg_t;
+struct engine_controller_register_msg_s {
+ engine_controller_msg_head_t msg_head;
+
+ ec_uint task_spec_id;
+ task_spec_t *pTask_spec;
+ calculate_identifier_func id_calc_func;
+};
+
+typedef struct engine_controller_register_queuing_rule_spec_msg_s engine_controller_register_queuing_rule_spec_msg_t;
+struct engine_controller_register_queuing_rule_spec_msg_s {
+ engine_controller_msg_head_t msg_head;
+
+ queuing_rule_spec_t *pSpec;
+
+ /* aynchronous finish callback */
+ register_finish_callback_func register_finish_callback;
+ ec_pointer usr_data;
+};
+
+void engine_controller_msg_set_msg_head(engine_controller_msg_head_t *pMsg_head, engine_controller_msg_type_t msg_type, ec_uint msg_id);
+
+engine_controller_register_msg_t *engine_controller_msg_create_register_msg(ec_uint task_spec_id, task_spec_t *pTask_spec, calculate_identifier_func id_calc_func);
+
+void engine_controller_msg_free_register_msg(engine_controller_register_msg_t *pRegister_msg);
+
+engine_controller_register_queuing_rule_spec_msg_t *engine_controller_msg_create_register_queuing_rule_spec_msg(queuing_rule_spec_t *pSpec, register_finish_callback_func register_finish_callback, ec_pointer usr_data);
+
+void engine_controller_msg_free_register_queuing_rule_spec_msg(engine_controller_register_queuing_rule_spec_msg_t *pMsg);
+
+/* TODO : unregister msg */
+
+engine_controller_request_msg_t *engine_controller_msg_create_request_msg(ec_uint task_spec_id, ec_uint identifier, ec_int cnt_in_param, ec_int *in_param_index_array, ECValueType * in_param_value_type_array, ec_pointer * in_param_value_array, task_finish_callback_func task_finish_callback, ec_pointer simple_task_finish_callback_usr_data);
+
+void engine_controller_msg_free_request_msg(engine_controller_request_msg_t *pMsg);
+
+engine_controller_cancel_all_msg_t *engine_controller_msg_create_cancel_all_msg();
+void engine_controller_msg_free_cancel_all_msg(engine_controller_cancel_all_msg_t *pCancel_all_msg);
+
+engine_controller_cancel_msg_t *engine_controller_msg_create_cancel_msg(ec_uint request_msg_id_to_cancel);
+void engine_controller_msg_free_cancel_msg(engine_controller_cancel_msg_t *pCancel_msg);
+
+ec_boolean engine_controller_msg_check_same_msg_type(engine_controller_msg_head_t *pHead, engine_controller_msg_type_t msg_type);
+ec_boolean engine_controller_msg_is_register_msg(engine_controller_msg_head_t *pHead);
+ec_boolean engine_controller_msg_is_unregister_msg(engine_controller_msg_head_t *pHead);
+ec_boolean engine_controller_msg_is_register_queuing_rule_spec_msg(engine_controller_msg_head_t *pHead);
+ec_boolean engine_controller_msg_is_request_msg(engine_controller_msg_head_t *pHead);
+ec_boolean engine_controller_msg_is_cancel_msg(engine_controller_msg_head_t *pHead);
+ec_boolean engine_controller_msg_is_cancel_all_msg(engine_controller_msg_head_t *pHead);
+
+#endif /* ENGINE_CONTROLLER_MESSAGE_H_ */
diff --git a/framework/include/EngineController/fundamental_type.h b/framework/include/EngineController/fundamental_type.h
new file mode 100644
index 0000000..f4d5ddd
--- /dev/null
+++ b/framework/include/EngineController/fundamental_type.h
@@ -0,0 +1,151 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef FUNDAMENTAL_TYPE_H_
+#define FUNDAMENTAL_TYPE_H_
+
+#include <stdbool.h>
+
+/**
+ * @file fundamental_type.h
+ * @brief Provides data type definition internally used in Engine Controller
+ */
+
+/**
+ * @brief Definition of internal char type used in Engine Controller
+ */
+typedef char ec_char;
+
+/**
+ * @brief Definition of internal short type used in Engine Controller
+ */
+typedef short ec_short;
+
+/**
+ * @brief Definition of internal long type used in Engine Controller
+ */
+typedef long ec_long;
+
+/**
+ * @brief Definition of internal int type used in Engine Controller
+ */
+typedef int ec_int;
+
+/**
+ * @brief Definition of internal boolean type used in Engine Controller
+ */
+typedef ec_int ec_boolean;
+
+/**
+ * @brief Definition of internal unsigned char type used in Engine Controller
+ */
+typedef unsigned char ec_uchar;
+
+/**
+ * @brief Definition of internal unsigned short type used in Engine Controller
+ */
+typedef unsigned short ec_ushort;
+
+/**
+ * @brief Definition of internal unsigned long type used in Engine Controller
+ */
+typedef unsigned long ec_ulong;
+
+/**
+ * @brief Definition of internal unsigned int type used in Engine Controller
+ */
+typedef unsigned int ec_uint;
+
+/**
+ * @brief Definition of internal float type used in Engine Controller
+ */
+typedef float ec_float;
+
+/**
+ * @brief Definition of internal double type used in Engine Controller
+ */
+typedef double ec_double;
+
+/**
+ * @brief Definition of internal void pointer type used in Engine Controller
+ */
+typedef void *ec_pointer;
+
+/**
+ * @brief Definition of internal const void pointer type used in Engine Controller
+ */
+typedef const void *ec_constpointer;
+
+/**
+ * @brief Definition of internal int8 type used in Engine Controller
+ */
+typedef signed char ec_int8;
+
+/**
+ * @brief Definition of internal unsigned int8 type used in Engine Controller
+ */
+typedef unsigned char ec_uint8;
+
+/**
+ * @brief Definition of internal int16 type used in Engine Controller
+ */
+typedef signed short ec_int16;
+
+/**
+ * @brief Definition of internal unsigned int16 type used in Engine Controller
+ */
+typedef unsigned short ec_uint16;
+
+/**
+ * @brief Definition of internal int32 type used in Engine Controller
+ */
+typedef signed int ec_int32;
+
+/**
+ * @brief Definition of internal unsigned int32 type used in Engine Controller
+ */
+typedef unsigned int ec_uint32;
+
+/**
+ * @brief Definition of internal int64 type used in Engine Controller
+ */
+typedef signed long long ec_int64;
+
+/**
+ * @brief Definition of internal unsigned int64 type used in Engine Controller
+ */
+typedef unsigned long long ec_uint64;
+
+#endif /* FUNDAMENTAL_TYPE_H_ */
diff --git a/framework/include/EngineController/graph_edge_pool.h b/framework/include/EngineController/graph_edge_pool.h
new file mode 100644
index 0000000..9e3b633
--- /dev/null
+++ b/framework/include/EngineController/graph_edge_pool.h
@@ -0,0 +1,53 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef GRAPH_EDGE_POOL_H_
+#define GRAPH_EDGE_POOL_H_
+
+#include <glib.h>
+#include "fundamental_type.h"
+
+typedef struct graph_edge_pool_s graph_edge_pool_t;
+
+graph_edge_pool_t *graph_edge_pool_new();
+void graph_edge_pool_free(graph_edge_pool_t *pPool);
+
+/* return add success or not */
+/* if already exist edge added, then return false */
+ec_boolean graph_edge_pool_add_edge(graph_edge_pool_t *pPool, ec_constpointer from_node, ec_constpointer to_node);
+
+GList *graph_edge_pool_query_to_node_list(graph_edge_pool_t *pPool, ec_constpointer from_node);
+
+#endif /* GRAPH_EDGE_POOL_H_ */
diff --git a/framework/include/EngineController/hash_set.h b/framework/include/EngineController/hash_set.h
new file mode 100644
index 0000000..a15aa93
--- /dev/null
+++ b/framework/include/EngineController/hash_set.h
@@ -0,0 +1,56 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef HASH_SET_H_
+#define HASH_SET_H_
+
+#include "fundamental_type.h"
+#include <glib.h>
+
+typedef struct hash_set_s hash_set_t;
+struct hash_set_s {
+ GHashTable *pHashTable;
+};
+
+hash_set_t *hash_set_create();
+void hash_set_free(hash_set_t *pHash_set);
+
+/* return success */
+/* when same element added, it will do nothing and return true */
+ec_boolean hash_set_add(hash_set_t *pHash_set, ec_constpointer pElement);
+
+GList *hash_set_get_element_list(hash_set_t *pHash_set);
+
+#endif /* HASH_SET_H_ */
diff --git a/framework/include/EngineController/param.h b/framework/include/EngineController/param.h
new file mode 100644
index 0000000..454b54a
--- /dev/null
+++ b/framework/include/EngineController/param.h
@@ -0,0 +1,74 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef PARAM_H_
+#define PARAM_H_
+
+#include "param_value.h"
+#include "param_spec.h"
+
+/**
+ * @file param.h
+ * @brief Provides alloc and free of param structure
+ */
+
+/**
+ * @brief Structure for parameter which contains parameter information such as spec and value
+ */
+typedef struct param_s param_t;
+struct param_s {
+ ec_uint read_ref_count; /**< Reference count for read */
+ ec_uint write_ref_count; /**< Reference count for write */
+ param_spec *pParam_spec; /**< Parameter spec */
+ param_value_t param_value; /**< Parameter value */
+};
+
+/**
+ * @brief Alocates and returns param_t type of structure using given param spec and param value
+ * @param[in] read_ref_count Reference count to set for read
+ * @param[in] write_ref_count Reference count to set for write
+ * @param[in] pParam_spec param spec to use
+ * @param[in] pParam_value param value to push in
+ * @return Newly alloced pointer of param_t type of structure
+ */
+param_t *param_alloc_param(ec_uint read_ref_count, ec_uint write_ref_count, param_spec *pParam_spec, param_value_t *pParam_value);
+
+/**
+ * @brief Provides free operation for param_t type of structure
+ * @param[in] pParam param_t type of structure to free
+ */
+void param_free_param(param_t *pParam);
+
+#endif /* PARAM_H_ */
diff --git a/framework/include/EngineController/param_spec.h b/framework/include/EngineController/param_spec.h
new file mode 100644
index 0000000..9f219f9
--- /dev/null
+++ b/framework/include/EngineController/param_spec.h
@@ -0,0 +1,251 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef PARAM_SPEC_H_
+#define PARAM_SPEC_H_
+
+#include "fundamental_type.h"
+#include "engine_controller_define.h"
+
+/**
+ * @file papram_spec.h
+ * @brief Provides parameter spec creation for various data type
+ */
+
+/**
+ * @brief Callback function which copies parameter data in structure type
+ * @param[in] pStruct Parameter data in structure type to copy from
+ * @return Pointer of newly copied structureà
+ */
+typedef ec_pointer(*copy_struct_func_callback) (ec_pointer pStruct);
+
+/**
+ * @brief Callback function which frees parameter data in structure type
+ * @param[in] pStruct Parameter data in structure type to free
+ */
+typedef void (*free_struct_func_callback) (ec_pointer pStruct);
+
+/**
+ * @brief Callback function which validates parameter data in structure type
+ * @param[in] pStruct Parameter data in structure type to validate
+ * @return 1 on validation success case, otherwise 0
+ */
+typedef ec_boolean(*validate_struct_func_callback) (ec_pointer pStruct, ec_pointer usr_data);
+
+/**
+ * @brief Enumerations of flag which indicates sort of parameter
+ */
+typedef enum ECParamFlags_e ECParamFlags;
+enum ECParamFlags_e {
+ EC_PARAM_FLAG_DEFAULT = 0, /**< Default type */
+ EC_PARAM_FLAG_INPUT = 1, /**< Input type */
+ EC_PARAM_FLAG_OUTPUT = 2, /**< Output type */
+ EC_PARAM_FLAG_INPUT_VALIDATE_ON = 4, /**< Input-validate type */
+ EC_PARAM_FLAG_OUTPUT_VALIDATE_ON = 8, /**< Output-validate type */
+ EC_PARAM_FLAG_INPUT_DEFAULT_VALUE_ON = 16 /**< Intput-default-value type */
+};
+
+/**
+ * @brief Structure of parameter spec which contains function parameter spec
+ */
+typedef struct _param_spec param_spec;
+
+/**
+ * @brief Increases reference count of parameter spec
+ * @param[in] pParam_spec Pointer of parameter spec to increase ref count
+ * @return Pointer of parameter spec itself on success, otherwise NULL
+ */
+param_spec *param_spec_ref(param_spec *pParam_spec);
+
+/**
+ * @brief Decreases reference count of parameter spec
+ * @param[in] pParam_spec Pointer of parameter spec to decrease ref count
+ */
+void param_spec_unref(param_spec *pParam_spec);
+
+/**
+ * @brief Allocs and returns boolean type of parameter spec
+ * @param[in] name Name of parameter which user defined
+ * @param[in] is_input On if this parameter to be used as input
+ * @param[in] is_output On if this parameter to be used as output
+ * @param[in] input_default_on On if this parameter to contain default value
+ * @param[in] input_default_value Default value for this parameter to contain
+ * @return Pointer of parameter spec which defined as ordered type
+ */
+param_spec *param_spec_boolean(const ec_char *name, ec_boolean is_input, ec_boolean is_output, ec_boolean input_default_on, ec_boolean input_default_value);
+
+/**
+ * @brief Allocs and returns char type of parameter spec
+ * @param[in] name Name of parameter which user defined
+ * @param[in] is_input On if this parameter to be used as input
+ * @param[in] is_output On if this parameter to be used as output
+ * @param[in] input_validate_on On if want to perform input parameter value validation
+ * @param[in] input_minimum Minimum value of valid input parameter value range
+ * @param[in] input_maximum Maximum value of valid input parameter value range
+ * @param[in] input_default_on On if this parameter to contain default value
+ * @param[in] input_default_value Default value for this parameter to contain
+ * @param[in] output_validate_on On if want to perform output parameter value validation
+ * @param[in] output_minimum Minimum value of valid output parameter value range
+ * @param[in] output_maximum Maximum value of valid output parameter value range
+ * @return Pointer of parameter spec which defined as ordered type
+ */
+param_spec *param_spec_char(const ec_char *name, ec_boolean is_input, ec_boolean is_output, ec_boolean input_validate_on, ec_int8 input_minimum, ec_int8 input_maximum, ec_boolean input_default_on, ec_int8 input_default_value, ec_boolean output_validate_on, ec_int8 output_minimum, ec_int8 output_maximum);
+
+/**
+ * @brief Allocs and returns unsigned char type of parameter spec
+ * @param[in] name Name of parameter which user defined
+ * @param[in] is_input On if this parameter to be used as input
+ * @param[in] is_output On if this parameter to be used as output
+ * @param[in] input_validate_on On if want to perform input parameter value validation
+ * @param[in] input_minimum Minimum value of valid input parameter value range
+ * @param[in] input_maximum Maximum value of valid input parameter value range
+ * @param[in] input_default_on On if this parameter to contain default value
+ * @param[in] input_default_value Default value for this parameter to contain
+ * @param[in] output_validate_on On if want to perform output parameter value validation
+ * @param[in] output_minimum Minimum value of valid output parameter value range
+ * @param[in] output_maximum Maximum value of valid output parameter value range
+ * @return Pointer of parameter spec which defined as ordered type
+ */
+param_spec *param_spec_uchar(const ec_char *name, ec_boolean is_input, ec_boolean is_output, ec_boolean input_validate_on, ec_uint8 input_minimum, ec_uint8 input_maximum, ec_boolean input_default_on, ec_uint8 input_default_value, ec_boolean output_validate_on, ec_uint8 output_minimum, ec_uint8 output_maximum);
+
+/**
+ * @brief Allocs and returns int type of parameter spec
+ * @param[in] name Name of parameter which user defined
+ * @param[in] is_input On if this parameter to be used as input
+ * @param[in] is_output On if this parameter to be used as output
+ * @param[in] input_validate_on On if want to perform input parameter value validation
+ * @param[in] input_minimum Minimum value of valid input parameter value range
+ * @param[in] input_maximum Maximum value of valid input parameter value range
+ * @param[in] input_default_on On if this parameter to contain default value
+ * @param[in] input_default_value Default value for this parameter to contain
+ * @param[in] output_validate_on On if want to perform output parameter value validation
+ * @param[in] output_minimum Minimum value of valid output parameter value range
+ * @param[in] output_maximum Maximum value of valid output parameter value range
+ * @return Pointer of parameter spec which defined as ordered type
+ */
+param_spec *param_spec_int(const ec_char *name, ec_boolean is_input, ec_boolean is_output, ec_boolean input_validate_on, ec_int input_minimum, ec_int input_maximum, ec_boolean input_default_on, ec_int input_default_value, ec_boolean output_validate_on, ec_int output_minimum, ec_int output_maximum);
+
+/**
+ * @brief Allocs and returns unsigned int type of parameter spec
+ * @param[in] name Name of parameter which user defined
+ * @param[in] is_input On if this parameter to be used as input
+ * @param[in] is_output On if this parameter to be used as output
+ * @param[in] input_validate_on On if want to perform input parameter value validation
+ * @param[in] input_minimum Minimum value of valid input parameter value range
+ * @param[in] input_maximum Maximum value of valid input parameter value range
+ * @param[in] input_default_on On if this parameter to contain default value
+ * @param[in] input_default_value Default value for this parameter to contain
+ * @param[in] output_validate_on On if want to perform output parameter value validation
+ * @param[in] output_minimum Minimum value of valid output parameter value range
+ * @param[in] output_maximum Maximum value of valid output parameter value range
+ * @return Pointer of parameter spec which defined as ordered type
+ */
+param_spec *param_spec_uint(const ec_char *name, ec_boolean is_input, ec_boolean is_output, ec_boolean input_validate_on, ec_uint input_minimum, ec_uint input_maximum, ec_boolean input_default_on, ec_uint input_default_value, ec_boolean output_validate_on, ec_uint output_minimum, ec_uint output_maximum);
+
+/**
+ * @brief Allocs and returns float type of parameter spec
+ * @param[in] name Name of parameter which user defined
+ * @param[in] is_input On if this parameter to be used as input
+ * @param[in] is_output On if this parameter to be used as output
+ * @param[in] input_validate_on On if want to perform input parameter value validation
+ * @param[in] input_minimum Minimum value of valid input parameter value range
+ * @param[in] input_maximum Maximum value of valid input parameter value range
+ * @param[in] input_default_on On if this parameter to contain default value
+ * @param[in] input_default_value Default value for this parameter to contain
+ * @param[in] output_validate_on On if want to perform output parameter value validation
+ * @param[in] output_minimum Minimum value of valid output parameter value range
+ * @param[in] output_maximum Maximum value of valid output parameter value range
+ * @return Pointer of parameter spec which defined as ordered type
+ */
+param_spec *param_spec_float(const ec_char *name, ec_boolean is_input, ec_boolean is_output, ec_boolean input_validate_on, ec_float input_minimum, ec_float input_maximum, ec_boolean input_default_on, ec_float input_default_value, ec_boolean output_validate_on, ec_float output_minimum, ec_float output_maximum);
+
+/**
+ * @brief Allocs and returns double type of parameter spec
+ * @param[in] name Name of parameter which user defined
+ * @param[in] is_input On if this parameter to be used as input
+ * @param[in] is_output On if this parameter to be used as output
+ * @param[in] input_validate_on On if want to perform input parameter value validation
+ * @param[in] input_minimum Minimum value of valid input parameter value range
+ * @param[in] input_maximum Maximum value of valid input parameter value range
+ * @param[in] input_default_on On if this parameter to contain default value
+ * @param[in] input_default_value Default value for this parameter to contain
+ * @param[in] output_validate_on On if want to perform output parameter value validation
+ * @param[in] output_minimum Minimum value of valid output parameter value range
+ * @param[in] output_maximum Maximum value of valid output parameter value range
+ * @return Pointer of parameter spec which defined as ordered type
+ */
+param_spec *param_spec_double(const ec_char *name, ec_boolean is_input, ec_boolean is_output, ec_boolean input_validate_on, ec_double input_minimum, ec_double input_maximum, ec_boolean input_default_on, ec_double input_default_value, ec_boolean output_validate_on, ec_double output_minimum, ec_double output_maximum);
+
+/**
+ * @brief Allocs and returns structure(Pointer) type of parameter spec
+ * @param[in] name Name of parameter which user defined
+ * @param[in] copy_func Function which can make copy of this structure type of parameter
+ * @param[in] free_func Function which can free this structure type of parameter
+ * @param[in] is_input On if this parameter to be used as input
+ * @param[in] is_output On if this parameter to be used as output
+ * @param[in] input_validate_on On if want to perform input parameter value validation
+ * @param[in] in_val_func Function which can validate this structure type of input parameter
+ * @param[in] input_default_on On if this parameter to contain default value
+ * @param[in] pDefault_Struct Default value of this structure type of parameter
+ * @param[in] output_validate_on On if want to perform output parameter value validation
+ * @param[in] out_val_funcFunction which can validate this structure type of output parameter
+ * @return Pointer of parameter spec which defined as ordered type
+ */
+param_spec *param_spec_structure(const ec_char *name, copy_struct_func_callback copy_func, free_struct_func_callback free_func, ec_boolean is_input, ec_boolean is_output, ec_boolean input_validate_on, validate_struct_func_callback in_val_func, ec_boolean input_default_on, ec_pointer pDefault_Struct, ec_boolean output_validate_on, validate_struct_func_callback out_val_func);
+
+/**
+ * @brief Provides data type of requested parameter spec
+ * @param[in] pParam_spec Parameter spec to get data type from
+ * @return ECValueType Type of enumeration value
+ * @retval EC_VALUE_TYPE_UNKNOWN Unknown type
+ * @retval EC_VALUE_TYPE_BOOLEAN Boolean type
+ * @retval EC_VALUE_TYPE_CHAR Char type
+ * @retval EC_VALUE_TYPE_UCHAR Unsigned char type
+ * @retval EC_VALUE_TYPE_INT Integer type
+ * @retval EC_VALUE_TYPE_UINT Unsigned integer type
+ * @retval EC_VALUE_TYPE_FLOAT Float type
+ * @retval EC_VALUE_TYPE_DOUBLE Double type
+ * @retval EC_VALUE_TYPE_STRUCT Structure(Pointer) type
+ */
+const ECValueType param_spec_get_value_type(param_spec *pParam_spec);
+
+/**
+ * @brief Provides name of requested parameter spec
+ * @param[in] pParam_spec Parameter spec to get data type from
+ * @return Name of parameter spec which user assigned on spec creation
+ */
+const ec_char *param_spec_get_name(param_spec *pParam_spec);
+
+#endif /* PARAM_SPEC_H_ */
diff --git a/framework/include/EngineController/param_spec_internal.h b/framework/include/EngineController/param_spec_internal.h
new file mode 100644
index 0000000..5a6593f
--- /dev/null
+++ b/framework/include/EngineController/param_spec_internal.h
@@ -0,0 +1,125 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef PARAM_SPEC_INTERNAL_H_
+#define PARAM_SPEC_INTERNAL_H_
+
+#include "param_value.h"
+
+typedef ec_boolean(*char_validate_func) (ec_int8 value, ec_int8 minimum, ec_int8 maximum);
+typedef ec_boolean(*uchar_validate_func) (ec_uint8 value, ec_uint8 minimum, ec_uint8 maximum);
+typedef ec_boolean(*int_validate_func) (ec_int value, ec_int minimum, ec_int maximum);
+typedef ec_boolean(*uint_validate_func) (ec_uint value, ec_uint minimum, ec_uint maximum);
+typedef ec_boolean(*float_validate_func) (ec_float value, ec_float minimum, ec_float maximum);
+typedef ec_boolean(*double_validate_func) (ec_double value, ec_double minimum, ec_double maximum);
+
+typedef struct _param_spec_char_validate param_spec_char_validate;
+typedef struct _param_spec_uchar_validate param_spec_uchar_validate;
+typedef struct _param_spec_int_validate param_spec_int_validate;
+typedef struct _param_spec_uint_validate param_spec_uint_validate;
+typedef struct _param_spec_float_validate param_spec_float_validate;
+typedef struct _param_spec_double_validate param_spec_double_validate;
+
+struct _param_spec_char_validate {
+ ec_int8 minimum;
+ ec_int8 maximum;
+ char_validate_func valid_func;
+};
+
+struct _param_spec_uchar_validate {
+ ec_uint8 minimum;
+ ec_uint8 maximum;
+ uchar_validate_func valid_func;
+};
+
+struct _param_spec_int_validate {
+ ec_int minimum;
+ ec_int maximum;
+ int_validate_func valid_func;
+};
+
+struct _param_spec_uint_validate {
+ ec_uint minimum;
+ ec_uint maximum;
+ uint_validate_func valid_func;
+};
+
+struct _param_spec_float_validate {
+ ec_float minimum;
+ ec_float maximum;
+ float_validate_func valid_func;
+};
+
+struct _param_spec_double_validate {
+ ec_double minimum;
+ ec_double maximum;
+ double_validate_func valid_func;
+};
+
+struct _param_spec_struct_validate {
+
+};
+
+typedef union {
+ param_spec_char_validate *char_validate;
+ param_spec_uchar_validate *uchar_validate;
+ param_spec_int_validate *int_validate;
+ param_spec_uint_validate *uint_validate;
+ param_spec_float_validate *float_validate;
+ param_spec_double_validate *double_validate;
+ validate_struct_func_callback struct_validate_func;
+} private_validate;
+
+struct _param_spec {
+ ec_int ref_count;
+ ECValueType value_type;
+ ec_char *name;
+ ECParamFlags flags;
+
+ param_value_t default_value;
+ private_validate input_validate;
+ private_validate output_validate;
+
+ copy_struct_func_callback copy_struct_func;
+ free_struct_func_callback free_struct_func;
+};
+
+inline ec_boolean is_input_flag_on(ECParamFlags flags);
+inline ec_boolean is_output_flag_on(ECParamFlags flags);
+inline ec_boolean is_input_validate_on_flag_on(ECParamFlags flags);
+inline ec_boolean is_output_validate_on_flag_on(ECParamFlags flags);
+inline ec_boolean is_input_default_value_on_flag_on(ECParamFlags flags);
+
+#endif /* PARAM_SPEC_INTERNAL_H_ */
diff --git a/framework/include/EngineController/param_value.h b/framework/include/EngineController/param_value.h
new file mode 100644
index 0000000..417302a
--- /dev/null
+++ b/framework/include/EngineController/param_value.h
@@ -0,0 +1,83 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef PARAM_VALUE_H_
+#define PARAM_VALUE_H_
+
+#include "fundamental_type.h"
+#include "engine_controller_define.h"
+
+/**
+ * @file param_value.h
+ * @brief Provides set/get operation of parameter value
+ */
+
+/**
+ * @brief Union for parameter value corresponding to various data type
+ */
+typedef union {
+ ec_boolean boolean_value; /**< boolean type */
+ ec_char char_value; /**< char type */
+ ec_uchar uchar_value; /**< unsigned char type */
+ ec_int int_value; /**< int type */
+ ec_uint uint_value; /**< unsigned int type */
+ ec_float float_value; /**< float type */
+ ec_double double_value; /**< double type */
+ ec_pointer pointer_value; /**< pointer type */
+} param_value_t;
+
+/**
+ * @brief Provides set operation for parameter value
+ * @param[in] pParam_value param_value_t type of variable to set in
+ * @param[in] value_type Type of value to set in ECValueType type
+ * @param[in] pValue Value of parameter to set
+ */
+void param_value_set_value(param_value_t *pParam_value, ECValueType value_type, ec_constpointer pValue);
+
+/**
+ * @brief Provides set operation from existing param_value_t type of variable
+ * @param[in] pDest_param_value param_value_t type of variable to set value to
+ * @param[in] pSrc_param_value param_value_t type of variable to get value from
+ */
+void param_value_set_value_with_other_param_value(param_value_t *pDest_param_value, param_value_t *pSrc_param_value);
+/**
+ * @brief Provides get operation for parameter value
+ * @param[in] pParam_value param_value_t type of variable to get from
+ * @param[in] value_type Type of value to get in ECValueType type
+ * @param[out] pValue Value of requested parameter
+ */
+void param_value_get_value(param_value_t *pParam_value, ECValueType value_type, ec_pointer pValue);
+
+#endif /* PARAM_VALUE_H_ */
diff --git a/framework/include/EngineController/queuing_rule_spec.h b/framework/include/EngineController/queuing_rule_spec.h
new file mode 100644
index 0000000..a9609d8
--- /dev/null
+++ b/framework/include/EngineController/queuing_rule_spec.h
@@ -0,0 +1,85 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef QUEUING_RULE_SPEC_H_
+#define QUEUING_RULE_SPEC_H_
+
+#include <glib.h>
+#include "fundamental_type.h"
+#include "engine_controller_define.h"
+#include "task_spec.h"
+
+/**
+ * @file queuing_rule_spec.h
+ * @brief Provides queuing rule related operation such as create, add
+ */
+
+/**
+ * @brief Structure for queuing rule spec which contains queuing-related information
+ */
+typedef struct queuing_rule_spec_s queuing_rule_spec_t;
+
+/**
+ * @brief Initiates and returns queuing_rule_spec_t type of instance
+ * @param[in] queuing_rule_name User defined name to use as name of rule
+ * @return Newly allocated instance in queuing_rule_spec_t type
+ */
+queuing_rule_spec_t *queuing_rule_spec_create_queuing_rule_spec_outline(ec_char *queuing_rule_name);
+
+/**
+ * @brief Adds progress blocking element
+ * @param[in]
+ * @param[in]
+ * @param[in]
+ * @param[in]
+ * @param[in] ... Iteration of detail information about element in the path from root to blocking element (ec_boolean is_dynamic, ec_int dynamic_case, ec_int child_index)
+ * @return engine_controller_error_t type of enumeration value
+ */
+engine_controller_error_t queuing_rule_spec_add_progress_blocking_element(queuing_rule_spec_t *pRule, ec_uint root_task_spec_id, task_spec_t *pRoot_task_spec, ec_uint child_depth, ...);
+
+/**
+* @brief Increases reference count of queuing rule spec
+* @param[in] pRule pointer of queuing rule spec to increase ref count
+* @return Pointer of queuing rule spec itself on success, otherwise NULL
+*/
+queuing_rule_spec_t *queuing_rule_spec_ref(queuing_rule_spec_t *pRule);
+
+/**
+* @brief Decreases reference count of queuing rule spec
+* @param[in] pRule pointer of queuing rule spec to decrease ref count
+*/
+void queuing_rule_spec_unref(queuing_rule_spec_t *pRule);
+
+#endif /* QUEUING_RULE_SPEC_H_ */
diff --git a/framework/include/EngineController/queuing_rule_spec_internal.h b/framework/include/EngineController/queuing_rule_spec_internal.h
new file mode 100644
index 0000000..b893d70
--- /dev/null
+++ b/framework/include/EngineController/queuing_rule_spec_internal.h
@@ -0,0 +1,116 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef QUEUING_RULE_SPEC_INTERNAL_H_
+#define QUEUING_RULE_SPEC_INTERNAL_H_
+
+#include <stdarg.h>
+#include "queuing_rule_spec.h"
+
+typedef struct n_ary_tree_node_with_flag_s n_ary_tree_node_with_flag_t;
+struct n_ary_tree_node_with_flag_s {
+ ec_boolean blocking_flag;
+
+ ec_uint tree_level;
+ ec_boolean is_dynamic_child;
+ ec_int dynamic_case;
+ ec_uint child_index;
+
+ n_ary_tree_node_with_flag_t *parent_node;
+ n_ary_tree_node_with_flag_t *first_child_node;
+ n_ary_tree_node_with_flag_t *next_sibling_node;
+ n_ary_tree_node_with_flag_t *prev_sibling_node;
+};
+
+n_ary_tree_node_with_flag_t *n_ary_tree_node_with_flag_new(ec_boolean blocking_flag, ec_uint tree_level, ec_boolean is_dynamic_child, ec_int dynamic_case, ec_uint child_index);
+
+void n_ary_tree_node_with_flag_free_1(n_ary_tree_node_with_flag_t *node);
+void n_ary_tree_node_with_flag_free_subtree(n_ary_tree_node_with_flag_t *node);
+
+ec_uint n_ary_tree_node_with_flag_count_subtree_flag_on_number(n_ary_tree_node_with_flag_t *node);
+
+void n_ary_tree_node_with_flag_set_blocking_flag_on(n_ary_tree_node_with_flag_t *node);
+ec_boolean n_ary_tree_node_with_flag_is_blocking_flag_on(n_ary_tree_node_with_flag_t *node);
+
+ec_boolean n_ary_tree_node_with_flag_has_same_content_without_blocking_flag(n_ary_tree_node_with_flag_t *node, ec_uint tree_level, ec_boolean is_dynamic_child, ec_int dynamic_case, ec_uint child_index);
+
+n_ary_tree_node_with_flag_t *n_ary_tree_node_with_flag_add_child_node(n_ary_tree_node_with_flag_t *parent_node, ec_boolean blocking_flag, ec_boolean is_dynamic_child, ec_int dynamic_case, ec_uint child_index);
+
+void n_ary_tree_node_with_flag_link_child_node(n_ary_tree_node_with_flag_t *parent_node, n_ary_tree_node_with_flag_t *child_node);
+
+void n_ary_tree_node_with_flag_unlink_child_node(n_ary_tree_node_with_flag_t *parent_node, n_ary_tree_node_with_flag_t *child_node);
+
+n_ary_tree_node_with_flag_t *n_ary_tree_node_with_flag_get_child_node(n_ary_tree_node_with_flag_t *parent_node, ec_boolean is_dynamic_child, ec_int dynamic_case, ec_uint child_index);
+
+typedef struct progress_blocking_element_set_s progress_blocking_element_set_t;
+struct progress_blocking_element_set_s {
+ ec_uint progress_blocking_element_cnt;
+
+ n_ary_tree_node_with_flag_t *n_ary_tree_with_flag;
+};
+
+progress_blocking_element_set_t *progress_blocking_element_set_new();
+void progress_blocking_element_set_free(progress_blocking_element_set_t *pSet);
+engine_controller_error_t progress_blocking_element_add(progress_blocking_element_set_t *pSet, ec_uint depth, va_list ap);
+
+typedef struct progress_blocking_entity_s progress_blocking_entity_t;
+struct progress_blocking_entity_s {
+ ec_int ref_count;
+
+ queuing_rule_spec_t *pQueuing_rule_spec; /* mother of blocking entity */
+
+ ec_uint root_task_spec_id;
+ progress_blocking_element_set_t *pElement_set;
+};
+
+progress_blocking_entity_t *progress_blocking_entity_new(ec_uint root_task_spec_id, queuing_rule_spec_t *pQueuing_rule_spec);
+void progress_blocking_entity_free(progress_blocking_entity_t *pEntity);
+progress_blocking_entity_t *progress_blocking_entity_ref(progress_blocking_entity_t *pEntity);
+void progress_blocking_entity_unref(progress_blocking_entity_t *pEntity);
+
+struct queuing_rule_spec_s {
+ ec_int ref_count;
+
+ ec_uint id;
+ ec_char *name;
+
+ ec_uint total_progress_blocking_element_cnt;
+ GSList *progress_blocking_entity_list; /* containing progress_blocking_entity_t* */
+ /* containing progress_blocking_entities related to queuing_rule_spec */
+
+ GQueue *progress_blocking_queue;
+};
+
+#endif /* QUEUING_RULE_SPEC_INTERNAL_H_ */
diff --git a/framework/include/EngineController/queuing_rule_spec_pool.h b/framework/include/EngineController/queuing_rule_spec_pool.h
new file mode 100644
index 0000000..16548c2
--- /dev/null
+++ b/framework/include/EngineController/queuing_rule_spec_pool.h
@@ -0,0 +1,65 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef QUEUING_RULE_SPEC_POOL_H_
+#define QUEUING_RULE_SPEC_POOL_H_
+
+#include <glib.h>
+#include "fundamental_type.h"
+#include "engine_controller_define.h"
+#include "queuing_rule_spec.h"
+#include "task_info_pool.h"
+#include "Utility/fw_sequential_id_provider.h"
+
+typedef struct queuing_rule_spec_pool_s queuing_rule_spec_pool_t;
+struct queuing_rule_spec_pool_s {
+ id_provider_t *pId_provider;
+ GHashTable *pQueuing_rule_spec_hash; /* key : queuing_rule_spec_id
+ value : queuing_rule_spec_t* */
+
+ task_info_pool_t *pTask_info_pool; /* when register queuing_rule_spec to pool, we have to update task_info */
+};
+
+queuing_rule_spec_pool_t *queuing_rule_spec_pool_alloc(ec_uint queuing_rule_max_cnt, task_info_pool_t *pTask_info_pool);
+void queuing_rule_spec_pool_free(queuing_rule_spec_pool_t *pPool);
+
+engine_controller_error_t queuing_rule_spec_pool_add_queuing_rule_spec(queuing_rule_spec_pool_t *pPool, queuing_rule_spec_t *pSpec, ec_uint *queuing_rule_id);
+
+queuing_rule_spec_t *queueing_rule_spec_pool_search_queuing_rule_spec(queuing_rule_spec_pool_t *pPool, ec_uint queuing_rule_id);
+
+/* TODO */
+engine_controller_error_t queuing_rule_spec_pool_remove_queuing_rule_spec(queuing_rule_spec_pool_t *pPool, ec_uint queuing_rule_id);
+
+#endif /* QUEUING_RULE_SPEC_POOL_H_ */
diff --git a/framework/include/EngineController/task.h b/framework/include/EngineController/task.h
new file mode 100644
index 0000000..24b8ddf
--- /dev/null
+++ b/framework/include/EngineController/task.h
@@ -0,0 +1,146 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef TASK_H_
+#define TASK_H_
+
+#include <sys/time.h>
+#include <glib.h>
+#include "param.h"
+#include "task_spec.h"
+#include "task_cancel_info.h"
+#include "engine_controller_message.h"
+#include "task_info_pool.h"
+#include "Utility/fw_ref.h"
+
+typedef struct task_s task_t;
+struct task_s {
+ ec_int ref_count;
+
+ task_error_t task_error;
+
+ task_info_t *pTask_info;
+ GSList *progress_blocking_realized_entity_list; /* containing progress_blocking_realized_entity_t* */
+ GSList *current_node_in_progress_blocking_entity_list; /* containing n_ary_tree_node_with_flag_t* */
+
+ task_spec_t *pTask_spec;
+ refObject_t *pRequestMsg; /* containing engine_controller_request_msg_t* */
+
+ task_cancel_info_t *pCancel_Information;
+ param_t **param_array;
+
+ /* information of dynamic case */
+ ec_int dynamic_case; /* only use when task spec is dynamic */
+
+ /* information of parent link */
+ task_t *pParent_task;
+ ec_int child_task_index_in_parent_task;
+
+ /* information of child link */
+ task_t **child_task_array;
+
+ ec_uint cnt_left_child_task_to_finish;
+
+ ec_uint *current_child_task_control_flow_in_degree_array;
+
+ struct timeval create_time;
+ struct timeval run_time;
+ struct timeval finish_time;
+};
+
+GSList *task_construct_progress_blocking_realized_entity_list(task_info_t *pTask_info);
+
+task_t *task_alloc_root_task(task_spec_t *pTask_spec, engine_controller_request_msg_t *pRequest_Msg, task_info_pool_t *pTask_info_pool);
+task_t *task_alloc_child_task(task_t *pParent_task, ec_int child_index);
+
+task_t *task_ref_task(task_t *pTask);
+void task_unref_task(task_t *pTask);
+
+ec_boolean task_is_simple_task(task_t *pTask);
+ec_boolean task_is_container_task(task_t *pTask);
+ec_boolean task_is_root_task(task_t *pTask);
+
+ec_int task_get_param_cnt(task_t *pTask);
+ec_int task_get_output_param_info(task_t *pTask, ec_int *pOutput_param_cnt, ec_int **pOutput_param_index_array);
+ec_uint task_get_child_task_cnt(task_t *pTask);
+task_t *task_get_parent_task(task_t *pTask);
+ec_int task_get_child_index_in_parent_task(task_t *pTask);
+
+void task_set_task_error(task_t *pTask, task_error_t task_error);
+ec_boolean task_check_same_task_error(task_t *pTask, task_error_t task_error);
+ec_boolean task_is_not_yet_run(task_t *pTask);
+
+void task_do_cancellation(task_t *pTask);
+
+void task_call_task_finish_callback(task_t *pTask);
+
+void task_remove_control_flow(task_t *pParent_task, ec_int from_task_index, ec_int to_task_index);
+
+void task_set_left_child_to_run(task_t *pParent_task, ec_uint number);
+ec_boolean task_is_left_child_to_run_zero(task_t *pParent_task);
+void task_decrease_left_child_to_run(task_t *pParent_task);
+
+ec_boolean task_is_parent_task_done(task_t *pParent_task);
+void task_collect_parent_task_output_parameter(task_t *pParent_task);
+
+GSList *collect_firstly_runnable_child_tasks(task_t *pParent_task);
+GSList *collect_become_runnable_child_tasks_by_remove_control_flow(task_t *pParent_task, ec_int from_child_task_index);
+
+task_error_t task_run_simple_task(task_t *pSimple_task);
+
+/* return true if pending is done */
+ec_boolean task_add_pending_task_list_of_first_progress_blocking_realized_entity(task_t *pTask);
+
+void task_update_progress_blocking_realized_entity_and_pop_if_possible(task_t *pTask);
+
+typedef struct progress_blocking_realized_entity_s progress_blocking_realized_entity_t;
+struct progress_blocking_realized_entity_s {
+ ec_uint left_progress_blocking_element_cnt;
+
+ progress_blocking_entity_t *pEntity;
+ GSList *pending_task_list; /* containing task_t* */
+};
+
+progress_blocking_realized_entity_t *progress_blocking_realized_entity_new(progress_blocking_entity_t *pEntity);
+void progress_blocking_realized_entity_free(progress_blocking_realized_entity_t *pRealized_entity);
+
+void progress_blocking_realized_entity_restart_pending_task(progress_blocking_realized_entity_t *pRealized_entity);
+void progress_blocking_realized_entity_add_pending_task(progress_blocking_realized_entity_t *pEntity, task_t *pending_task);
+
+/* return true when left_progress_blocking_element_cnt are updated and become zero */
+ec_boolean progress_blocking_realized_entity_update_and_test_left_progress_blocking_element_cnt(progress_blocking_realized_entity_t *pRealized_entity, n_ary_tree_node_with_flag_t *current_node, task_t *pTask);
+ec_boolean progress_blocking_realized_entity_is_zero_left_progress_blocking_element_cnt(progress_blocking_realized_entity_t *pRealized_entity);
+
+#endif /* TASK_H_ */
diff --git a/framework/include/EngineController/task_cancel_info.h b/framework/include/EngineController/task_cancel_info.h
new file mode 100644
index 0000000..e905f5e
--- /dev/null
+++ b/framework/include/EngineController/task_cancel_info.h
@@ -0,0 +1,84 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef TASK_CANCEL_INFO_H_
+#define TASK_CANCEL_INFO_H_
+
+#include <sys/time.h>
+#include <glib.h>
+#include "Utility/fw_ref.h"
+#include "engine_controller_define.h"
+
+typedef void (*cancel_callback) (void *user_data);
+
+typedef struct cancel_callback_info_s cancel_callback_info_t;
+struct cancel_callback_info_s {
+ GThread *who_registered;
+ cancel_callback how_to_do;
+ ec_pointer user_data;
+};
+
+cancel_callback_info_t *cancel_callback_info_init(GThread *who_registered, cancel_callback how_to_do, ec_pointer user_data);
+ec_boolean cancel_callback_info_compare(cancel_callback_info_t *pCancel_callback_info, GThread *who_registered, cancel_callback how_to_do, ec_pointer user_data);
+void cancel_callback_info_call_callback(cancel_callback_info_t *pCancel_callback_info);
+void cancel_callback_info_destroy(cancel_callback_info_t *pCancel_callback_info);
+
+typedef struct task_cancel_info_s task_cancel_info_t;
+struct task_cancel_info_s {
+ ec_int ref_count;
+
+ ec_boolean cancel_flag;
+ refObject_t *pRequestMsg; /* containing engine_controller_request_msg_t* */
+
+ GMutex *cancel_info_mutex;
+ struct timeval cancel_time;
+ GSList *cancel_callback_infos; /* containing cancel_callback_info_t* */
+};
+
+task_cancel_info_t *task_cancel_info_init(refObject_t *pRequestMsg);
+task_cancel_info_t *task_cancel_info_ref(task_cancel_info_t *pInfo);
+void task_cancel_info_unref(task_cancel_info_t *pInfo);
+
+ec_boolean task_cancel_info_get_cancel_flag_atomic(task_cancel_info_t *pCancel_info);
+void task_cancel_info_set_cancel_flag_atomic(task_cancel_info_t *pCancel_info);
+
+ec_int task_cancel_info_get_request_msg_id(task_cancel_info_t *pCancel_info);
+
+void task_cancel_info_call_cancel_callbacks_unlocked(task_cancel_info_t *pCancel_info);
+
+engine_controller_error_t task_cancel_info_register_cancel_callback_unlocked(task_cancel_info_t *pCancel_info, cancel_callback callback_func, ec_pointer user_data);
+engine_controller_error_t task_cancel_info_unregister_cancel_callback_unlocked(task_cancel_info_t *pCancel_info, cancel_callback callback_func, ec_pointer user_data);
+
+#endif /* TASK_CANCEL_INFO_H_ */
diff --git a/framework/include/EngineController/task_error.h b/framework/include/EngineController/task_error.h
new file mode 100644
index 0000000..eeaa3bc
--- /dev/null
+++ b/framework/include/EngineController/task_error.h
@@ -0,0 +1,65 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef TASK_ERROR_H_
+#define TASK_ERROR_H_
+
+#include "fundamental_type.h"
+
+/**
+ * @file task_error.h
+ * @brief Provides enum definition for task status
+ */
+
+/**
+ * @brief Enumeration for task result cases
+ */
+typedef enum task_error_e task_error_t;
+enum task_error_e {
+ TASK_ERROR_NOT_YET_RUN = 0, /**< 'Not run yet' case */
+ TASK_ERROR_RUN_SUCCESS, /**< 'Success' case */
+ TASK_ERROR_RUN_FAILED, /**< 'Fail' case */
+ TASK_ERROR_CANCELED, /**< 'Canceled' case */
+ TASK_ERROR_INVALID_TASK /**< 'Invalid' case */
+};
+
+/**
+ * @brief Provides readable expressiong of task error cases
+ * @param[in] error task_error_t type of enumeration
+ * @return Error string of given error case
+ */
+ec_char *task_error_string(task_error_t error);
+
+#endif /* TASK_ERROR_H_ */
diff --git a/framework/include/EngineController/task_info_pool.h b/framework/include/EngineController/task_info_pool.h
new file mode 100644
index 0000000..fe8899f
--- /dev/null
+++ b/framework/include/EngineController/task_info_pool.h
@@ -0,0 +1,77 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef TASK_INFO_POOL_H_
+#define TASK_INFO_POOL_H_
+
+#include <glib.h>
+#include "fundamental_type.h"
+#include "engine_controller_message.h"
+
+#include "task_spec.h"
+#include "queuing_rule_spec_internal.h"
+
+typedef struct task_info_s task_info_t;
+struct task_info_s {
+ ec_int task_spec_id;
+ task_spec_t *pTask_spec;
+ GSList *progress_blocking_entity_list; /* related to queuing rule */
+ /* containing progress_blocking_entities related to task_spec */
+};
+
+task_info_t *task_info_new(ec_int task_spec_id, task_spec_t *pTask_spec);
+void task_info_free(task_info_t *pTask_info);
+task_info_t *task_info_ref(task_info_t *pTask_info);
+void task_info_unref(task_info_t *pTask_info);
+
+ec_boolean task_info_is_progress_blocking_entity_exist(task_info_t *pTask_info, progress_blocking_entity_t *pEntity);
+engine_controller_error_t task_info_add_progress_blocking_entity(task_info_t *pTask_info, progress_blocking_entity_t *pEntity);
+engine_controller_error_t task_info_remove_blocking_entity(task_info_t *pTask_info, progress_blocking_entity_t *pEntity);
+
+typedef struct task_info_pool_s task_info_pool_t;
+struct task_info_pool_s {
+ GHashTable *pTask_info_pool; /* key : msg id
+ value : task_info_t* */
+};
+
+task_info_pool_t *task_info_pool_alloc();
+void task_info_pool_free(task_info_pool_t *pTask_info_pool);
+
+ec_boolean task_info_pool_add_task_info(task_info_pool_t *pTask_info_pool, task_info_t *pTask_info, ec_boolean replace);
+ec_boolean task_info_pool_remove_task_info(task_info_pool_t *pTask_info_pool, ec_uint msg_type);
+
+task_info_t *task_info_pool_search_task_info(task_info_pool_t *pTask_info_pool, ec_uint msg_type);
+
+#endif /* TASK_INFO_POOL_H_ */
diff --git a/framework/include/EngineController/task_message.h b/framework/include/EngineController/task_message.h
new file mode 100644
index 0000000..74c604e
--- /dev/null
+++ b/framework/include/EngineController/task_message.h
@@ -0,0 +1,76 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef TASK_MESSAGE_H_
+#define TASK_MESSAGE_H_
+
+#include "task.h"
+
+/* note that task state also related to priority ( TASK_ROOT_START == TASK_ROOT_DONE == TASK_CANCEL == TASK_CANCEL_ALL > TASK_DONE > TASK_START ) */
+/* note that TASK_ROOT_START, TASK_CANCEL, TASK_CANCEL_ALL coming from engine controller receiver,
+ TASK_START, TASK_DONE, TASK_ROOT_DONE coming from engine controller */
+typedef enum task_state_e task_state_t;
+enum task_state_e {
+ TASK_ROOT_START = 0,
+ TASK_ROOT_DONE,
+ TASK_CANCEL,
+ TASK_CANCEL_ALL,
+ TASK_DONE,
+ TASK_START
+};
+
+/* lower priority, more urgent */
+ec_uint task_state_priority(task_state_t state);
+
+typedef struct task_message_s task_message_t;
+struct task_message_s {
+ ec_uint priority;
+ task_state_t task_state;
+ union {
+ task_t *pTask;
+ ec_uint request_msg_id; /* task_state == TASK_CANCEL */
+ /* nothing *//* task_state == TASK_CANCEL_ALL */
+ } u;
+};
+
+typedef ec_int (*compare_task_msg_priority_func) (task_message_t *pTask_message1, task_message_t *pTask_message2, ec_pointer user_data);
+
+ec_int compare_priority_of_task_message_append_way(task_message_t *pTask_message1, task_message_t *pTask_message2, ec_pointer user_data);
+ec_int compare_priority_of_task_message_prepend_way(task_message_t *pTask_message1, task_message_t *pTask_message2, ec_pointer user_data);
+
+task_message_t *task_message_create(task_state_t state, task_t *pTask, ec_uint request_msg_id);
+void task_message_free(task_message_t *pTask_msg);
+
+#endif /* TASK_MESSAGE_H_ */
diff --git a/framework/include/EngineController/task_pool.h b/framework/include/EngineController/task_pool.h
new file mode 100644
index 0000000..0992b23
--- /dev/null
+++ b/framework/include/EngineController/task_pool.h
@@ -0,0 +1,61 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef TASK_POOL_H_
+#define TASK_POOL_H_
+
+#include <glib.h>
+#include <stdbool.h>
+#include "task.h"
+
+/* it contains only root task */
+typedef struct task_pool_s task_pool_t;
+struct task_pool_s {
+ GHashTable *pTask_hash; /* key : ec_uint (request_id)
+ value : task_t* */
+};
+
+task_pool_t *task_pool_create_task_pool();
+void task_pool_free_task_pool(task_pool_t *pTask_pool);
+
+void task_pool_add_task(task_pool_t *pTask_pool, ec_uint request_id, task_t *pTask);
+
+task_t *task_pool_fetch_task(task_pool_t *pTask_pool, ec_uint request_id);
+
+GList *task_pool_fetch_all_tasks(task_pool_t *pTask_pool);
+
+void task_pool_remove_task(task_pool_t *pTask_pool, ec_uint request_id);
+
+#endif /* TASK_POOL_H_ */
diff --git a/framework/include/EngineController/task_process.h b/framework/include/EngineController/task_process.h
new file mode 100644
index 0000000..32297d9
--- /dev/null
+++ b/framework/include/EngineController/task_process.h
@@ -0,0 +1,229 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef TASK_PROCESS_H_
+#define TASK_PROCESS_H_
+
+#include "engine_controller_define.h"
+#include "param.h"
+
+/**
+ * @file task_process.h
+ * @brief Provides process related operations such as cancel flag check, callbak de/registration
+ */
+
+/**
+ * @brief TASK_PROCESS function which is considered as default unit of task for Engine Controller to launch
+ * @param[in] param_cnt Count of parameters which will be used in the processing logic
+ * @param[in] param_array Array of parameters which contains parameters values itself
+ * @return task_error_t type of result
+ */
+typedef task_error_t(*TASK_PROCESS) (ec_uint param_cnt, param_t **param_array);
+
+/**
+ * @brief process_cancel_callback function which is called when cancel flag gets on
+ * @param[in] user_data User data to process inside the calcel callback function
+ */
+typedef void (*process_cancel_callback) (void *user_data);
+
+/**
+ * @brief process_cancel_callback function which is called when cancel flag gets on
+ * @remarks Note that below functions are valid only inside the TASK_PROCESS function which will be registered at task spec
+ * @return 1 when cancel flag is on, otherwiae 0
+ * @code
+ task_error_t sample_add_task_process(ec_uint param_cnt, param_t** param_array) {
+ task_error_t err = TASK_ERROR_RUN_SUCCESS;
+ ec_boolean cancel_flag = false;
+
+ ec_int a = 0;
+ ec_int b = 0;
+ ec_int c = 0;
+
+ //get input parameter pass by user or previous task
+ param_value_get_value(&(param_array[0]->param_value), EC_VALUE_TYPE_INT, &a);
+ param_value_get_value(&(param_array[1]->param_value), EC_VALUE_TYPE_INT, &b);
+
+ //processing logic will be located here
+ //checking cancel flag and register, unregister cancel callback will be done inside here
+ {
+ //register cancel callback (note that this can be called every where inside processing logic)
+ task_process_register_cancel_callback_when_cancel_flag_off(simple_add_cancel_callback, NULL);
+
+ //check cancel flag (note that this can be called every where inside processing logic)
+ cancel_flag = task_process_check_cancel_flag();
+ if (cancel_flag) {
+ err = TASK_ERROR_CANCELLED;
+ goto return_part;
+ }
+
+ //processing logic
+ c = a+b;
+
+ //if fail occured during processing logic, then set task failed state.
+ if (c != a+b) {
+ err = TASK_ERROR_RUN_FAILED;
+ goto return_part;
+ }
+
+ //unregister cancel callback (note that this can be called every where inside processing logic)
+ task_process_unregister_cancel_callback_when_cancel_flag_off(simple_add_cancel_callback, NULL);
+ }
+
+ //set output parameter
+ param_value_set_value(&(param_array[2]->param_value), EC_VALUE_TYPE_INT, &c);
+
+ return_part:
+ return err;
+ }
+ * @endcode
+ */
+ec_boolean task_process_check_cancel_flag(void);
+
+/**
+ * @brief Registers cancel callback function which is called when cancel flag gets on
+ * @remarks Note that below functions are valid only inside the TASK_PROCESS function which will be registered at task spec
+ * @param[in] callback_func process_cancel_callback type of function to use on cancellation
+ * @param[in] user_data User data to pass to the callback function on cancellation
+ * @code
+ task_error_t sample_add_task_process(ec_uint param_cnt, param_t** param_array) {
+ task_error_t err = TASK_ERROR_RUN_SUCCESS;
+ ec_boolean cancel_flag = false;
+
+ ec_int a = 0;
+ ec_int b = 0;
+ ec_int c = 0;
+
+ //get input parameter pass by user or previous task
+ param_value_get_value(&(param_array[0]->param_value), EC_VALUE_TYPE_INT, &a);
+ param_value_get_value(&(param_array[1]->param_value), EC_VALUE_TYPE_INT, &b);
+
+ //processing logic will be located here
+ //checking cancel flag and register, unregister cancel callback will be done inside here
+ {
+ //register cancel callback (note that this can be called every where inside processing logic)
+ task_process_register_cancel_callback_when_cancel_flag_off(simple_add_cancel_callback, NULL);
+
+ //check cancel flag (note that this can be called every where inside processing logic)
+ cancel_flag = task_process_check_cancel_flag();
+ if (cancel_flag) {
+ err = TASK_ERROR_CANCELLED;
+ goto return_part;
+ }
+
+ //processing logic
+ c = a+b;
+
+ //if fail occured during processing logic, then set task failed state.
+ if (c != a+b) {
+ err = TASK_ERROR_RUN_FAILED;
+ goto return_part;
+ }
+
+ //unregister cancel callback (note that this can be called every where inside processing logic)
+ task_process_unregister_cancel_callback_when_cancel_flag_off(simple_add_cancel_callback, NULL);
+ }
+
+ //set output parameter
+ param_value_set_value(&(param_array[2]->param_value), EC_VALUE_TYPE_INT, &c);
+
+ return_part:
+ return err;
+ }
+ * @endcode
+ */
+void task_process_register_cancel_callback_when_cancel_flag_off(process_cancel_callback callback_func, ec_pointer user_data);
+
+/**
+ * @brief Unregisters cancel callback function registered in advance
+ * @remarks Note that below functions are valid only inside the TASK_PROCESS function which will be registered at task spec
+ * @param[in] callback_func process_cancel_callback type of function registered in advance
+ * @param[in] user_data User data registered with above callback functionin advnace
+ * @code
+ task_error_t sample_add_task_process(ec_uint param_cnt, param_t** param_array) {
+ task_error_t err = TASK_ERROR_RUN_SUCCESS;
+ ec_boolean cancel_flag = false;
+
+ ec_int a = 0;
+ ec_int b = 0;
+ ec_int c = 0;
+
+ //get input parameter pass by user or previous task
+ param_value_get_value(&(param_array[0]->param_value), EC_VALUE_TYPE_INT, &a);
+ param_value_get_value(&(param_array[1]->param_value), EC_VALUE_TYPE_INT, &b);
+
+ //processing logic will be located here
+ //checking cancel flag and register, unregister cancel callback will be done inside here
+ {
+ //register cancel callback (note that this can be called every where inside processing logic)
+ task_process_register_cancel_callback_when_cancel_flag_off(simple_add_cancel_callback, NULL);
+
+ //check cancel flag (note that this can be called every where inside processing logic)
+ cancel_flag = task_process_check_cancel_flag();
+ if (cancel_flag) {
+ err = TASK_ERROR_CANCELLED;
+ goto return_part;
+ }
+
+ //processing logic
+ c = a+b;
+
+ //if fail occured during processing logic, then set task failed state.
+ if (c != a+b) {
+ err = TASK_ERROR_RUN_FAILED;
+ goto return_part;
+ }
+
+ //unregister cancel callback (note that this can be called every where inside processing logic)
+ task_process_unregister_cancel_callback_when_cancel_flag_off(simple_add_cancel_callback, NULL);
+ }
+
+ //set output parameter
+ param_value_set_value(&(param_array[2]->param_value), EC_VALUE_TYPE_INT, &c);
+
+ return_part:
+ return err;
+ }
+ * @endcode
+ */
+void task_process_unregister_cancel_callback_when_cancel_flag_off(process_cancel_callback callback_func, ec_pointer user_data);
+
+/**
+ * @brief Provides task request ID of itself
+ * @remarks Note that below functions are valid only inside the TASK_PROCESS function which will be registered at task spec
+ * @return task request ID of itself
+ */
+ec_int task_process_get_self_request_id(void);
+
+#endif /* TASK_PROCESS_H_ */
diff --git a/framework/include/EngineController/task_spec.h b/framework/include/EngineController/task_spec.h
new file mode 100644
index 0000000..92b401d
--- /dev/null
+++ b/framework/include/EngineController/task_spec.h
@@ -0,0 +1,261 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef TASK_SPEC_H_
+#define TASK_SPEC_H_
+
+#include <glib.h>
+#include <stdbool.h>
+
+#include "engine_controller_define.h"
+#include "param_spec.h"
+#include "param.h"
+#include "task_process.h"
+
+/**
+ * @file task_spec.h
+ * @brief Provides task spec related operations such as create, child task fetch, data/control flow set and etc..
+ */
+
+/**
+ * @brief Callback function called after task running done
+ * @param[in] usr_post_task_func_data User data to pass to the post_task_callback_func
+ * @param[in] msg_id Task request msg ID
+ */
+typedef void (*post_task_callback_func) (ec_pointer usr_post_task_func_data, ec_uint msg_id);
+
+/**
+ * @brief Callback function which calculates result of dynamic task
+ * @param[in] param_cnt Count of output parameters resulted from dynamic task
+ * @param[in] param_array Array of output parameters resulted from dynamic task
+ * @return Result of the case calculatio callback function as integer
+ */
+typedef ec_int (*calculate_case_callback_func) (ec_uint param_cnt, param_t **param_array);
+
+/**
+ * @brief Structure of task spec which contains task related spec information such as parameter and callabck and etc
+ */
+typedef struct task_spec_s task_spec_t;
+
+/* external interface */
+
+/**
+ * @brief Allocs and returns task_spec_t type of structure,using given parameters
+ * @param[in] task_name User defined task name
+ * @param[in] task_process TASK_PROCESS type of function pointer
+ * @param[in] post_task_func_usr_data User data to pass to the post_task_callback_func
+ * @param[in] post_task_callback Callback function called after task running done
+ * @param[in] param_cnt Count of input parameters
+ * @param[in] param_spec_array Array of input parameters
+ * @return Newly alloced task_spec_t type of task spec
+ */
+task_spec_t *task_spec_alloc_simple_task_spec(ec_char *task_name, TASK_PROCESS task_process, ec_pointer post_task_func_usr_data, post_task_callback_func post_task_callback, ec_uint param_cnt, param_spec **param_spec_array);
+
+/**
+ * @brief Increases reference count of task spec
+ * @param[in] pTask_spec Pointer of task spec to increase ref count
+ * @return Pointer of task spec itself on success, otherwise NULL
+ */
+task_spec_t *task_spec_ref(task_spec_t *pTask_spec);
+
+/**
+ * @brief Decreases reference count of task spec
+ * @param[in] pTask_spec Pointer of task spec to decrease ref count
+ */
+void task_spec_unref(task_spec_t *pTask_spec);
+
+/**
+ * @brief Comparea if given two task specs are same each other
+ * @param[in] pTask_spec1 Task spec to compare with
+ * @param[in] pTask_spec2 Task spec to compare with
+ * @return 1 on positive case, otherwise 0
+ */
+ec_boolean task_spec_is_same(task_spec_t *pTask_spec1, task_spec_t *pTask_spec2);
+
+/**
+ * @brief Checks if given task spec is simple task
+ * @param[in] pTask_spec Task spec to check
+ * @return 1 on positive case, otherwise 0
+ */
+ec_boolean task_spec_is_simple_task_spec(task_spec_t *pTask_spec);
+
+/**
+ * @brief Checks if given task spec is container task
+ * @param[in] pTask_spec Task spec to check
+ * @return 1 on positive case, otherwise 0
+ */
+ec_boolean task_spec_is_container_task_spec(task_spec_t *pTask_spec);
+
+/**
+ * @brief Checks if given task spec is dynamic container task
+ * @param[in] pTask_spec Task spec to check
+ * @return 1 on positive case, otherwise 0
+ */
+ec_boolean task_spec_is_dynamic_container_task_spec(task_spec_t *pTask_spec);
+
+/**
+ * @brief Returns number of child task in given task spec
+ * @param[in] pTask_spec Task spec to get child task count from
+ * @return Number of child task
+ */
+ec_uint task_spec_get_child_task_cnt(task_spec_t *pTask_spec);
+
+/**
+ * @brief Returns task spec of n'th child task in given parent task spec
+ * @param[in] pParent_task_spec Task spec to get child task spec from
+ * @param[in] child_task_index Index of child task to get spec from
+ * @return Task spec of requested child task
+ */
+task_spec_t *task_spec_get_child_task_spec(task_spec_t *pParent_task_spec, ec_int child_task_index);
+
+/**
+ * @brief Returns task spec of n'th child task in given parent task spec
+ * @param[in] pDynamic_task_spec Dynamic task spec to get child task count from
+ * @param[in] dynamic_case Case number to get child task count from under given dynamic task
+ * @return Count of child task under given dynamic task
+ */
+ec_uint task_spec_get_child_task_cnt_on_dynamic_case(task_spec_t *pDynamic_task_spec, ec_int dynamic_case);
+
+/**
+ * @brief Returns task spec of n'th child task in given parent dynamic task spec
+ * @param[in] dynamic_case Case number to get child task count from under given dynamic task
+ * @param[in] pParent_dynamic_task_spec Task spec to get child task spec from
+ * @param[in] child_task_index Index of child task to get spec from
+ * @return Task spec of requested child task
+ */
+task_spec_t *task_spec_get_child_task_spec_on_dynamic_case(ec_int dynamic_case, task_spec_t *pParent_dynamic_task_spec, ec_int child_task_index);
+
+/**
+ * @brief Returns number of input parameters
+ * @param[in] pTask_spec Case number to get child task count from under given dynamic task
+ * @return Number of parameters in given task spec
+ */
+ec_int task_spec_get_param_cnt(task_spec_t *pTask_spec);
+
+/**
+ * @brief Returns calculate_case_callback_func of given dynamic container task spec
+ * @param[in] pDynamic_container_task_spec Task spec of dynamic container task to get callback function info
+ * @return calculate_case_callback_func type of case calculation callback
+ */
+calculate_case_callback_func task_spec_get_calculate_case_callback_func(task_spec_t *pDynamic_container_task_spec);
+
+/**
+ * @brief Returns output parameter info such as param count and param value array
+ * @param[in] pTask_spec Task spec to get output parameter info
+ * @param[in] pOutput_param_cnt Count of output parameter
+ * @param[in] pOutput_param_index_array Array of output parameter value
+ * @return 1 when success, otherwise 0
+ */
+ec_boolean task_spec_get_output_param_info(task_spec_t *pTask_spec, ec_int *pOutput_param_cnt, ec_int **pOutput_param_index_array);
+
+/**
+ * @brief Allocs and returns task_spec_t type of structure,using given parameters
+ * @param[in] task_name User defined task name
+ * @param[in] post_task_func_usr_data User data to pass to the post_task_callback_func
+ * @param[in] post_func Callback function called after task running done
+ * @param[in] param_cnt Count of input parameters
+ * @param[in] param_spec_array Array of input parameters
+ * @param[in] child_task_cnt Number of child tasks to put under
+ * @param[in] child_task_array Array of child task specs to put under
+ * @return Newly alloced task_spec_t type of task spec
+ */
+task_spec_t *task_spec_alloc_container_task_spec_outline(ec_char *task_name, ec_pointer usr_post_task_func_data, post_task_callback_func post_func, ec_uint param_cnt, param_spec **param_spec_array, ec_uint child_task_cnt, task_spec_t **child_task_array);
+
+/**
+ * @brief Sets data flow on given container task
+ * @param[in] pContainer_task_spec Container task spec to set data flow on
+ * @param[in] from_task_index Index of task to take data from
+ * @param[in] from_param_index Index of parameter to take data from
+ * @param[in] to_task_index Index of task to put data to
+ * @param[in] to_param_index Index of parameter to put data to
+ * @return Enumeration value of engine_controller_error_t
+ */
+engine_controller_error_t task_spec_set_data_flow(task_spec_t *pContainer_task_spec, ec_int from_task_index, ec_int from_param_index, ec_int to_task_index, ec_int to_param_index);
+
+/**
+ * @brief Sets control flow on given container task
+ * @param[in] pContainer_task_spec Container task spec to set control flow on
+ * @param[in] from_task_index Index of task to take data from
+ * @param[in] to_task_index Index of task to put data to
+ * @return Enumeration value of engine_controller_error_t
+ */
+engine_controller_error_t task_spec_set_control_flow(task_spec_t *pContainer_task_spec, ec_int from_task_index, ec_int to_task_index);
+
+/**
+ * @brief Checks if all child tasks under given container task are done
+ * @param[in] pContainer_task_spec Task spec of container task to check
+ * @return Enumeration value of engine_controller_error_t
+ */
+engine_controller_error_t task_spec_check_everything_done(task_spec_t *pContainer_task_spec);
+
+/**
+ * @brief Allocs and returns task_spec_t type of structure,using given parameters
+ * @param[in] task_name User defined task name
+ * @param[in] post_task_func_usr_data User data to pass to the post_task_callback_func
+ * @param[in] post_func Callback function called after task running done
+ * @param[in] param_cnt Count of input parameters
+ * @param[in] param_spec_array Array of input parameters
+ * @param[in] calculate_case_func Function which will calculate result case of dynamic task
+ * @param[in] case_cnt Count of cases in dynamic case
+ * @param[in] case_array Array of cases used in dynamic task
+ * @param[in] child_task_cnt_array Array of count of child task in each case
+ * @param[in] child_task_array_per_case_array Array of array of child task spec in each case
+ * @return Newly alloced task_spec_t type of task spec
+ */
+task_spec_t *task_spec_alloc_dynamic_container_task_spec_outline(ec_char *task_name, ec_pointer usr_post_task_func_data, post_task_callback_func post_func, ec_uint param_cnt, param_spec **param_spec_array, calculate_case_callback_func calculate_case_func, ec_uint case_cnt, ec_int *case_array, ec_uint *child_task_cnt_array, task_spec_t ***child_task_array_per_case_array);
+
+/**
+ * @brief Sets data flow on given dynamic case
+ * @param[in] dynamic_case Case number under given dynamic container task
+ * @param[in] pDynamic_container_task_spec Dynamic container task spec to set data flow on
+ * @param[in] from_task_index Index of task to take data from
+ * @param[in] from_param_index Index of parameter to take data from
+ * @param[in] to_task_index Index of task to put data to
+ * @param[in] to_param_index Index of parameter to put data to
+ * @return Enumeration value of engine_controller_error_t
+ */
+engine_controller_error_t task_spec_set_data_flow_on_dynamic_case(ec_int dynamic_case, task_spec_t *pDynamic_container_task_spec, ec_int from_task_index, ec_int from_param_index, ec_int to_task_index, ec_int to_param_index);
+
+/**
+ * @brief Sets control flow on given dynamic case
+ * @param[in] dynamic_case Case number under given dynamic container task
+ * @param[in] pDynamic_container_task_spec Dynamic container task spec to set control flow on
+ * @param[in] from_task_index Index of task to take data from
+ * @param[in] to_task_index Index of task to put data to
+ * @return Enumeration value of engine_controller_error_t
+ */
+engine_controller_error_t task_spec_set_control_flow_on_dynamic_case(ec_int dynamic_case, task_spec_t *pDynamic_container_task_spec, ec_int from_task_index, ec_int to_task_index);
+
+#endif /* TASK_SPEC_H_ */
diff --git a/framework/include/EngineController/task_spec_internal.h b/framework/include/EngineController/task_spec_internal.h
new file mode 100644
index 0000000..09cf5d0
--- /dev/null
+++ b/framework/include/EngineController/task_spec_internal.h
@@ -0,0 +1,147 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef TASK_SPEC_INTERNAL_H_
+#define TASK_SPEC_INTERNAL_H_
+
+#include <glib.h>
+#include "param_spec.h"
+#include "graph_edge_pool.h"
+#include "queuing_rule_spec.h"
+
+typedef struct data_flow_edges_s data_flow_edges_t;
+/* all parameter in container task has unique index which calculated as following */
+/* parent container task param[0] : 0
+ * ...
+ * parent container task param[parent_param_cnt - 1] : parent_param_cnt - 1
+ * ...
+ * child task 1 param[0] : parent_param_cnt
+ * ...
+ * child task 1 param[child_1_param_cnt - 1] : parent_param_cnt + child_1_param_cnt - 1
+ * ...
+ */
+struct data_flow_edges_s {
+ ec_int child_task_cnt;
+ ec_int *child_task_param_start_index_array;
+
+ ec_int total_param_cnt; /* total_param_cnt = parent_task_param_cnt + sum of (child_task_param_cnt_array[i]) for all i */
+ ec_int *from_param_array; /* containing data flow (from_param_array[idx] th param -> idx th param ) */
+};
+
+data_flow_edges_t *data_flow_edges_new(ec_int parent_task_param_cnt, ec_uint child_task_cnt, task_spec_t **child_task_array);
+void data_flow_edges_free(data_flow_edges_t *pData_flow_edges);
+
+ec_int data_flow_edges_compute_internal_index(data_flow_edges_t *pData_flow_edges, ec_int task_index, ec_int param_index);
+
+/* return true when valid internal index used, false otherwise */
+ec_boolean data_flow_edges_compute_task_index_and_param_index(data_flow_edges_t *pData_flow_edges, ec_int internal_index, ec_int *pTask_index, ec_int *pParam_index);
+
+/* return true when success, false otherwise */
+ec_boolean data_flow_edges_add_edge(data_flow_edges_t *pData_flow_edges, ec_int from_task_index, ec_int from_param_index, ec_int to_task_index, ec_int to_param_index);
+
+/* return true when from part exist, false otherwise */
+ec_boolean data_flow_edges_get_from_param_info(data_flow_edges_t *pData_flow_edges, ec_int to_task_index, ec_int to_param_index, ec_int *from_task_index, ec_int *from_param_index);
+
+typedef struct child_tasks_info_s child_tasks_info_t;
+struct child_tasks_info_s {
+ ec_uint child_task_cnt;
+ /* node index description */
+ /* -1 : parent node */
+ /* 0 ~ child_task_cnt - 1 : child nodes */
+ task_spec_t **child_task_array;
+
+ /* data, control flows between child tasks */
+ ec_uint *child_task_control_flow_in_degree;
+ graph_edge_pool_t *pControl_edge_pool; /* node type : int */
+ data_flow_edges_t *pData_flow_edges;
+};
+
+task_spec_t *task_spec_get_child_task_spec_from_child_task_info(child_tasks_info_t *pChild_tasks_info, ec_uint child_task_index);
+
+typedef struct dynamic_container_task_specific_s dynamic_container_task_specific_t;
+struct dynamic_container_task_specific_s {
+ calculate_case_callback_func calculate_case_func;
+
+ ec_uint case_cnt;
+ ec_int *case_array;
+
+ child_tasks_info_t **case_specific_child_task_info_array;
+};
+
+typedef enum task_type_e task_type_t;
+enum task_type_e {
+ TASK_SIMPLE = 0,
+ TASK_CONTAINER,
+ TASK_DYNAMIC_CONTAINER
+};
+
+struct task_spec_s {
+ ec_int ref_count;
+ task_type_t task_type;
+ ec_char *task_name;
+
+ ec_int task_param_cnt;
+ param_spec **task_param_spec_array;
+
+ void *usr_post_task_func_data;
+ post_task_callback_func post_func;
+
+ union {
+ /* simple task */
+ TASK_PROCESS task_process;
+
+ /* container task */
+ child_tasks_info_t *pContainer_task_specific;
+
+ /* dynamic container task */
+ dynamic_container_task_specific_t *pDynmaic_container_task_specific;
+ } u;
+};
+
+/* engine_controller_error_t task_spec_attach_queuing_rule_spec(task_spec_t* pSpec, queuing_rule_spec_t* pQueuing_rule_spec); */
+
+engine_controller_error_t task_spec_valididate_child_task_index(task_spec_t *pContainer_task_spec, ec_int child_task_index);
+
+engine_controller_error_t task_spec_valididate_child_task_index_on_dynamic_case(ec_int dynamic_case, task_spec_t *pDynamic_container_task_spec, ec_int child_task_index);
+
+ec_uint *task_spec_duplicate_child_task_control_flow_in_degree(task_spec_t *pTask_spec);
+
+ec_uint *task_spec_duplicate_child_task_control_flow_in_degree_on_dynamic_case(task_spec_t *pDynamic_task_spec, ec_int dynamic_case);
+
+child_tasks_info_t *task_spec_find_child_tasks_info(task_spec_t *pParent_container_task_spec);
+
+child_tasks_info_t *task_spec_find_case_specific_child_tasks_info(task_spec_t *pParent_dynamic_task_spec, ec_int dynamic_case);
+
+#endif /* TASK_SPEC_INTERNAL_H_ */
diff --git a/framework/include/EngineController/thread_pool.h b/framework/include/EngineController/thread_pool.h
new file mode 100644
index 0000000..2026b8f
--- /dev/null
+++ b/framework/include/EngineController/thread_pool.h
@@ -0,0 +1,59 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef THREAD_POOL_H_
+#define THREAD_POOL_H_
+
+#include <glib.h>
+#include "task.h"
+
+typedef struct thread_pool_s thread_pool_t;
+struct thread_pool_s {
+ GPrivate *cancel_tsk;
+
+ ec_uint max_thread_count;
+ GThreadPool *pPool;
+};
+
+GPrivate *thread_pool_create_cancel_TSK(void);
+GPrivate *thread_pool_get_cancel_TSK(thread_pool_t *pThread_pool);
+
+ec_uint thread_pool_get_max_thread_count(thread_pool_t *pThread_pool);
+
+thread_pool_t *thread_pool_alloc_and_init(ec_uint max_thread_count);
+void thread_pool_destroy(thread_pool_t *pPool);
+void thread_pool_push_task(thread_pool_t *pPool, task_t *pTask);
+
+#endif /* THREAD_POOL_H_ */
diff --git a/framework/include/Event/Event_Config.h b/framework/include/Event/Event_Config.h
new file mode 100755
index 0000000..daf763e
--- /dev/null
+++ b/framework/include/Event/Event_Config.h
@@ -0,0 +1,81 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef EVENT_INIT_H_
+#define EVENT_INIT_H_
+
+#include "Event_Error.h"
+#include "Event_Handler.h"
+#include "Event/Event_UI_API.h"
+#include "Event/Event_Spec.h"
+
+#define EVENT_COMMUNICATION_PATH "/tmp/agent_fw_event_"
+#define EVENT_REPLY_COMMUNICATION_PATH "/tmp/agent_fw_event_reply_"
+#define NOTI_COMMUNICATION_PATH "/tmp/agent_fw_noti_"
+#define NOTI_REPLY_COMMUNICATION_PATH "/tmp/agent_fw_noti_reply_"
+
+#define MAX_STREAM_SIZE 102400
+
+const char *get_Noti_Path(const char *noti_key);
+
+const char *get_Noti_Reply_Path(const char *noti_key);
+
+const char *get_Event_Path();
+
+const char *get_Event_Reply_Path();
+
+EVENT_ERROR set_EventSpec_from_ConfigFile(const char *event_key, const char *configfile);
+
+EVENT_ERROR clean_EventSpec();
+
+EVENT_ERROR set_NotiSpec_from_ConfigFile(const char *noti_key, const char *configfile);
+
+EVENT_ERROR clean_NotiSpec();
+
+EVENT_ERROR register_EventCallback(int eventNum, EVENT_CALLBACK callback);
+
+EVENT_ERROR register_NotiCallback(int notiNum, NOTI_CALLBACK callback, void *data); /* only UI */
+
+EVENT_CALLBACK get_EventCallback(int eventNum);
+
+NOTI_CALLBACK get_NotiCallback(int notiNum); /* only UI */
+
+void *get_NotiCallback_AdditinalParam(int notiNum); /* only UI */
+
+EVENT_TYPE get_EventType(int eventNum);
+
+NOTI_TYPE get_NotiType(const char *noti_key, int notiNum); /* UI and Agent */
+
+#endif /* EVENT_INIT_H_ */
diff --git a/framework/include/Event/Event_Data_Accessor.h b/framework/include/Event/Event_Data_Accessor.h
new file mode 100755
index 0000000..8ccf05e
--- /dev/null
+++ b/framework/include/Event/Event_Data_Accessor.h
@@ -0,0 +1,103 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef EVENT_DATA_ACCESSOR_H_
+#define EVENT_DATA_ACCESSOR_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file Event_Data_Accessor.h
+ * @brief Support to access (create, append, get, remove) Event packet structure
+ */
+
+/**
+ * @brief Structure of Event Packet
+ */
+ typedef struct {
+ int eventNum;
+ /**< event number described in event config file */
+ char *size; /**< need to iterate real data */
+ char *data; /**< real data expected to send */
+ } Event_Data;
+
+/**
+ * @brief type of parameter in Event_Data
+ */
+ typedef enum {
+ INTEGER = 'I',
+ /**< Interger type */
+ STRING = 'S' /**< String type */
+ } param_type;
+
+/**
+ * @brief Add parameter to Event packet
+ * @remarks Once one parameter is added each time it's invoked. parameter type can be Number or String.
+ * @param[out] iter Event_Data* parameters to be added
+ * @param[in] type parameter type (INTEGER, STRING) @ref param_type
+ * @param[in] data real parameter data
+ * @see get_eventdata_param()
+ */
+ void append_eventdata_param(Event_Data *iter, param_type type, void *data);
+
+/**
+ * @brief Extract parameter from Event packet
+ * @remarks This function will be used when Extracting Recieved Event packet.
+ * extracted order is matched the order of @ref append_eventdata_param().
+ * @param[out] iter Event_Data* parameters to be extracted
+ * @param[out] data real extracted data
+ * @see append_eventdata_param()
+ */
+ void get_eventdata_param(Event_Data *iter, void *data);
+
+/**
+ * @brief Print Event_Data' packet contents Heuristically
+ * @remarks for Debugging. LOG_TAG "AF_EVENT"
+ * @param[in] msg_stream print msg packet
+ */
+ void print_eventdata(char *msg_stream);
+
+/**
+ * @brief Free Event_Data *
+ * @param[in] event will be freed
+ */
+ void free_eventdata(Event_Data *event);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* EVENT_DATA_ACCESSOR_H_ */
diff --git a/framework/include/Event/Event_Error.h b/framework/include/Event/Event_Error.h
new file mode 100755
index 0000000..ea7fd5c
--- /dev/null
+++ b/framework/include/Event/Event_Error.h
@@ -0,0 +1,62 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef EVENT_ERROR_H_
+#define EVENT_ERROR_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file Event_Error.h
+ * @brief Definition of framework error codes for Event module
+ */
+
+/**
+ * @brief Enumerations of error codes for Event module
+ */
+ typedef enum {
+ EVENT_SUCCESS, /**< when Event Operation is succeed */
+ EVENT_FAIL, /**< when Event Operation is failed */
+ EVENT_TIME_OVER,/**< when Event Operation is failed because of time over */
+ EVENT_IPC_ERR, /**< when Event Operation is failed because of IPC */
+ EVENT_CANCLED /**< when Event Operation is canceled */
+ } EVENT_ERROR;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* EVENT_ERROR_H_ */
diff --git a/framework/include/Event/Event_Handler.h b/framework/include/Event/Event_Handler.h
new file mode 100755
index 0000000..008aa6a
--- /dev/null
+++ b/framework/include/Event/Event_Handler.h
@@ -0,0 +1,148 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef EVENT_HANDLER_H_
+#define EVENT_HANDLER_H_
+
+#include "Event_Error.h"
+#include "Event_Data_Accessor.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file Event_Handler.h
+ * @brief Support to use framework Event module for agent
+ */
+
+/**
+ * @brief Enumerations of need for cancel IPC
+ */
+ typedef enum {
+ NEED_CANCEL = 1, /**< need to cancel IPC */
+ UN_NEED_CANCEL /**< not need to cancel IPC */
+ } IPC_CANCEL;
+
+/**
+ * @brief Event callback
+ * @remark event described in event config file will be processed in this callback function.
+ * @param[in] request received event packet from UI
+ * @param[in] response if event need to synchronous response, use this parameter
+ * @see set_EventCallback()
+ */
+ typedef int (*EVENT_CALLBACK) (Event_Data *request, Event_Data *response);
+
+/**
+ * @brief checking logic, need for IPC cancel
+ * @remark this function is used in @ref send_Noti().
+ * @param[in] user_data user data used in callback function
+ * @see send_Noti()
+ */
+ typedef IPC_CANCEL(*CONFIRM_IPC_CANCEL) (void *user_data);
+
+/**
+ * @brief Activate the Event Handler
+ * @remarks Event Handler is a thread. Thread's routine is UNIX Domain Socket Server.
+ * @param[out] thread_id Created thread's ID
+ * @return EVENT_SUCCESS on success, otherwise a error value.
+ * @retval EVENT_SUCCESS Successful
+ * @retval EVENT_FAIL thread creation failed
+ * @pre This function should be called one time. or after clean_Event_Handler() called.
+ * @post new thread is created. Agent can receive event from UI.
+ * @see clean_Event_Handler()
+ */
+ EVENT_ERROR run_Event_Handler(unsigned long int *thread_id);
+
+/**
+ * @brief Cleaning the Running Event Handler
+ * @remarks Event handler thread is killed. event/noti config is removed from memory
+ * @return EVENT_SUCCESS on success, otherwise a error value.
+ * @retval EVENT_SUCCESS Successful
+ * @retval EVENT_FAIL clean failed
+ * @post Agent can not receive event from UI.
+ * @see run_Event_Handler()
+ */
+ EVENT_ERROR clean_Event_Handler();
+
+/**
+ * @brief set callback function to process event from UI
+ * @param[in] eventNum event number in event config file
+ * @param[in] callback event processing callback function
+ * @return EVENT_SUCCESS on success, otherwise a error value.
+ * @retval EVENT_SUCCESS Successful
+ * @retval EVENT_FAIL registration failed
+ * @pre eventNum must be in event config file.
+ * @post callback function will be called when UI send the event.
+ */
+ EVENT_ERROR set_EventCallback(int eventNum, EVENT_CALLBACK callback);
+
+/**
+ * @brief Creation Empty Notification packet.
+ * @remarks Notification is from Agent to UI. Complete using returned Event_Data pointer. and
+ * send completed Event_Data to UI. Event_Data* should be freed with @ref free_Noti() by you.
+ * @param[in] notiNum notification number in notification config file
+ * @return Event_Data structure on success, otherwise a null pointer.
+ * @retval Event_Data* Successful
+ * @retval NullPointer creation failed
+ * @pre notiNum must be in notification config file.
+ * @see free_Noti()
+ */
+ Event_Data *create_Noti(int notiNum);
+
+/**
+ * @brief Agent send Notification to UI
+ * @param[in] noti_key destination, descripted in framework initialization config file <Noti> tag
+ * @param[in] noti real notification packet
+ * @param[in] confirm_cancel function pointer checking cancel condition. it's needed when response is required.
+ * @param[in] user_data use in confirm_cancel function
+ * @param[out] error result
+ * @return Event_Data* when response is required, otherwise null pointer
+ * @see create_Noti(), free_Noti()
+ */
+ Event_Data *send_Noti(const char *noti_key, Event_Data *noti, CONFIRM_IPC_CANCEL confirm_cancel, void *user_data, EVENT_ERROR *error);
+
+/**
+ * @brief free notification packet
+ * @remarks this function will release Event_Data* returned from @ref create_Noti(), send_Noti().
+ * @param[in] noti Expected to be freed notification packet
+ * @see create_Noti(), send_Noti()
+ */
+ void free_Noti(Event_Data *noti);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* EVENT_HANDLER_H_ */
diff --git a/framework/include/Event/Event_Spec.h b/framework/include/Event/Event_Spec.h
new file mode 100755
index 0000000..cf8471b
--- /dev/null
+++ b/framework/include/Event/Event_Spec.h
@@ -0,0 +1,80 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef EVENT_SPEC_H_
+#define EVENT_SPEC_H_
+
+#define MAX_EVENT_COUNT 100
+#define MAX_NOTI_COUNT 100
+
+typedef enum {
+ EVENT_TYPE_NO_RESPONSE = 0,
+ EVENT_TYPE_NEED_RESPONSE,
+ EVENT_TYPE_NEED_NOTI_RESPONSE,
+ EVENT_TYPE_IS_RESPONSE
+} EVENT_TYPE;
+
+typedef enum {
+ NOTI_TYPE_SIMPLE = 0,
+ NOTI_TYPE_IS_REPLY,
+ NOTI_TYPE_NEED_REPLY
+} NOTI_TYPE;
+
+typedef struct {
+ int eventNum;
+ EVENT_TYPE event_type;
+ int relational_notiNum;
+ int pendingtime;
+ EVENT_CALLBACK callback;
+} Event_Spec;
+
+typedef struct {
+ int notiNum;
+ NOTI_TYPE noti_type;
+ int relational_eventNum;
+ int pendingtime;
+ void *additional_param;
+ NOTI_CALLBACK callback;
+} Noti_Spec;
+
+typedef struct {
+ char *noti_key;
+ char *communication_path_noti;
+ char *communication_path_reply_noti;
+ int noti_count;
+ Noti_Spec *noti_Spec_list[MAX_NOTI_COUNT];
+} Noti_Spec_Bag;
+
+#endif /* EVENT_SPEC_H_ */
diff --git a/framework/include/Event/Event_UI_API.h b/framework/include/Event/Event_UI_API.h
new file mode 100755
index 0000000..34c4b1b
--- /dev/null
+++ b/framework/include/Event/Event_UI_API.h
@@ -0,0 +1,121 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef EVENT_UI_API_H_
+#define EVENT_UI_API_H_
+
+#include "Event_Error.h"
+#include "Event_Data_Accessor.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file Event_UI_API.h
+ * @brief Support to use framework Event module for UI
+ */
+
+/**
+ * @brief Notification callback
+ * @remark notification described in notification config file will be processed in this callback function.
+ * @param[in] noti received notification packet from agent
+ * @param[in] data user data
+ * @see set_NotiCallBack()
+ */
+ typedef int (*NOTI_CALLBACK) (Event_Data *noti, void *data);
+
+/**
+ * @brief Creation Empty Event packet.
+ * @remarks Event is from UI to Agent. Complete using returned Event_Data pointer. and
+ * send completed Event_Data to Agent. Event_Data* should be freed with @ref free_Event() by you.
+ * @param[in] eventNum Event number in notification config file
+ * @return Event_Data structure on success, otherwise a null pointer.
+ * @retval Event_Data* Successful
+ * @retval NullPointer creation failed
+ * @pre eventNum must be in event config file.
+ * @see free_Eventi()
+ */
+ Event_Data *create_Event(int eventNum);
+
+/**
+ * @brief UI send Event to Agent
+ * @param[in] event real Event packet
+ * @param[out] error result
+ * @return Event_Data* when response is required, otherwise null pointer
+ * @see create_Event(), free_Event()
+ */
+ Event_Data *send_Event(Event_Data *event, EVENT_ERROR *error);
+
+/**
+ * @brief Activate the Notification Listener
+ * @remarks Notification Listener is a thread. Thread's routine is UNIX Domain Socket Server.
+ * @return EVENT_SUCCESS on success, otherwise a error value.
+ * @retval EVENT_SUCCESS Successful
+ * @retval EVENT_FAIL thread creation failed
+ * @pre This function should be called one time. or after stop_NotiListener() called.
+ * @post new thread is created. UI can receive event from Agent.
+ * @see stop_NotiListener()
+ */
+ EVENT_ERROR run_NotiListener();
+
+/**
+ * @brief Stop the Running Notification Listener
+ * @remarks Notification Listener thread is killed. event/noti config is removed from memory
+ * @return EVENT_SUCCESS on success, otherwise a error value.
+ * @retval EVENT_SUCCESS Successful
+ * @retval EVENT_FAIL clean failed
+ * @post UI can not receive event from Agent.
+ * @see run_NotiListener()
+ */
+ EVENT_ERROR stop_NotiListener();
+
+/**
+ * @brief set callback function to process Notification from Agent
+ * @param[in] notiType notification number in notification config file
+ * @param[in] callback notification processing callback function
+ * @param[in] data use in notification callback function
+ * @return EVENT_SUCCESS on success, otherwise a error value.
+ * @retval EVENT_SUCCESS Successful
+ * @retval EVENT_FAIL registration failed
+ * @pre notiType must be in notification config file.
+ * @post callback function will be called when Agent send the UI.
+ */
+ EVENT_ERROR set_NotiCallBack(int notiType, NOTI_CALLBACK callback, void *data);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* EVENT_UI_API_H_ */
diff --git a/framework/include/Event/Event_Util.h b/framework/include/Event/Event_Util.h
new file mode 100644
index 0000000..ab81786
--- /dev/null
+++ b/framework/include/Event/Event_Util.h
@@ -0,0 +1,49 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef EVENT_UTIL_H_
+#define EVENT_UTIL_H_
+
+#include "Event_Data_Accessor.h"
+
+void init_eventdata_iter(Event_Data *event);
+
+int get_eventdata_byte_size(Event_Data *iter);
+
+int get_eventdata_element_size(Event_Data *iter);
+
+void remove_buffer(Event_Data *event);
+
+#endif /* EVENT_UTIL_H_ */
diff --git a/framework/include/FSAPI/FSAPI_operation.h b/framework/include/FSAPI/FSAPI_operation.h
new file mode 100644
index 0000000..ed90aa1
--- /dev/null
+++ b/framework/include/FSAPI/FSAPI_operation.h
@@ -0,0 +1,216 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef FSAPI_OPERATION_H_
+#define FSAPI_OPERATION_H_
+
+#include <stdbool.h>
+#include <glib.h>
+#include <glib/gstdio.h>
+
+/**
+ * @file FSAPI_operation.h
+ * @brief Provides file system related operations such as file/folder create, delete, read, write and etc..
+ */
+
+/**
+ * @brief Check whether given file path is existing or not
+ * @remarks file path can be either a file or a folder.
+ * @param[in] filename File path you want to check
+ * @return 1 when the instance you want to check exists, otherwise 0
+ */
+int FSAPI_isExisting(const char *filename);
+
+/**
+ * @brief Provides free size and total size of file system which your file path exists on
+ * @param[in] root File path you want to check
+ * @param[out] sizeFree Free size of file system in bytes
+ * @param[out] sizeTotal Total size of file system in bytes
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_memSize(const char *root, long double *sizeFree, long double *sizeTotal);
+
+/**
+ * @brief Provides size of your file
+ * @param[in] filename File path you want to check
+ * @param[out] size Size of requested file in bytes
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileSize(const char *filename, unsigned long *size);
+
+/**
+ * @brief Provides date information of your file in character stream
+ * @remarks The return char stream format is "Y:m:d H:M:S".
+ * The Date info stream should be freed when no more in use.
+ * @param[in] filename File path you want to check
+ * @param[out] time_string Double pointer of the char variable you want to load file date info on
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileDate(const char *filename, char **time_string);
+
+/**
+ * @brief Provides file copy operation
+ * @remarks Operation will fail if destination already exists.
+ * @param[in] source Source file path
+ * @param[in] dest Destination file path
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileCopy(const char *source, const char *dest);
+
+/**
+ * @brief Provides file delete operation
+ * @param[in] filename File path to delete
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileDelete(const char *filename);
+
+/**
+ * @brief Provides file move operation
+ * @remarks Operation will fail if destination already exists.
+ * @param[in] source Source file path
+ * @param[in] dest Destination file path
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileMove(const char *source, const char *dest);
+
+/**
+ * @brief Provides file rename operation
+ * @remarks Operation will fail if destination already exists.
+ * @param[in] source Source file path
+ * @param[in] dest Destination file path
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileRename(const char *source, const char *dest);
+
+/**
+ * @brief Provides file read operation (Keeps file descriptor until reaching end of file)
+ * @remarks Need to call repeatedly with proper 'required_length' until you get TRUE value of the bool option 'isFinal'.
+ * Provided contents 'required_contents' should be freed when no more in use.
+ * @param[in] filename File path which you want to read
+ * @param[in] required_length Size to read
+ * @param[out] required_contents Char variable to load file contents on
+ * @param[out] size_return Size of invoked file contents
+ * @param[out] isFinal Boolean value to indicate whether end of file reached or not
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileRead(const char *filename, char **required_contents, unsigned long required_length, unsigned long *size_return, bool *isFinal);
+
+/**
+ * @brief Provides file read operation (Entire contents at once)
+ * @remarks Provided 'required_contents' should be freed when no more in use.
+ * @param[in] filename File path which you want to read
+ * @param[out] required_contents Char variable to load file contents on
+ * @param[out] size_return Size of invoked file contents
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileReadWhole(const char *filename, char **required_contents, unsigned long *size_return);
+
+/**
+ * @brief Provides free operation for file contents loaded from FSAPI_fileRead, FSAPI_fileReadWhole
+ * @param[in] requested_contents File contents to free
+ */
+int FSAPI_fileRead_Free(char **requested_contents);
+
+/**
+ * @brief Provides file write operation (Keeps file descriptor until finish order)
+ * @remarks Writes given contents to given file until 'isFinal' option enabled.
+ * Destination file won't be appeared until you give 'isFinal' option.
+ * Useful when writing several chunks into new file in one task.
+ * @param[in] filename File path which you want to write
+ * @param[in] contents Contents to write
+ * @param[in] length Size of the contents
+ * @param[in] isFinal Option to order operation finish
+ * @param[in] overwrite Option to order overwriting
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileWrite(const char *filename, const char *contents, unsigned long length, bool isFinal, bool overwrite);
+
+/**
+ * @brief Provides file write operation (Entire contents at once)
+ * @param[in] filename File path which you want to write
+ * @param[in] contents Contents to write
+ * @param[in] length Size of the contents
+ * @param[in] overwrite Option to order overwriting
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileWriteWhole(const char *filename, const char *contents, unsigned long length, bool overwrite);
+
+/**
+ * @brief Provides file append operation
+ * @remarks Appends given contents to given file.
+ * If given file not existing, create first and start appending.
+ * @param[in] filename File path which you want to write
+ * @param[in] contents Contents to write
+ * @param[in] length Size of the contents
+ * @param[in] overwrite Option to order overwriting
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileAppend(const char *filename, const char *contents, unsigned long length, bool overwrite);
+
+/**
+ * @brief Provides folder create operation
+ * @remarks All parents folder will be created along
+ * in case any upper parents folders in the ordered folder path not existing.
+ * @param[in] foldername Folder path to create
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_folderCreate(const char *foldername);
+
+/**
+ * @brief Provides folder delete operation
+ * @remarks Operation will fail in case the requested folder is not empty if 'recusive' option not given.
+ * @param[in] foldername Folder path to delete
+ * @param[in] recursive Option to delete inside recursively
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_folderDelete(const char *foldername, bool recursive);
+
+/**
+ * @brief Provides folder delete operation without deleting root of the requested folder itself
+ * @param[in] foldername Folder path to delete inside
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_folderEmptyContents(const char *foldername);
+
+/**
+ * @brief Provides folder rename operation
+ * @remarks Operation will fail if destination already exists.
+ * @param[in] source Source file path
+ * @param[in] dest Destination file path
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_folderRename(const char *source, const char *dest);
+
+#endif /* FSAPI_OPERATION_H_ */
diff --git a/framework/include/FSAPI/FSAPI_util.h b/framework/include/FSAPI/FSAPI_util.h
new file mode 100644
index 0000000..a941952
--- /dev/null
+++ b/framework/include/FSAPI/FSAPI_util.h
@@ -0,0 +1,47 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef FSAPI_UTIL_H_
+#define FSAPI_UTIL_H_
+
+#include <time.h>
+
+int isExisting(const char *filename);
+
+int isDirectory(const char *filename);
+
+int getTimeString(time_t *time_stamp, char *time_string);
+
+#endif /* FSAPI_UTIL_H_ */
diff --git a/framework/include/Initialization/initialize.h b/framework/include/Initialization/initialize.h
new file mode 100755
index 0000000..5cde9ca
--- /dev/null
+++ b/framework/include/Initialization/initialize.h
@@ -0,0 +1,74 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef INITIALIZE_H_
+#define INITIALIZE_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include "initialize_error.h"
+
+/**
+ * @file initialize.h
+ * @brief Support to initialize framework for agent
+ */
+
+/**
+ * @brief Initialization of Agent Framework
+ * @remarks Framework will be initialized using by config file written by the agent developer.
+ * Initialization config file format is XML.
+ * @param[in] init_config_path framework init config file - XML format
+ * @return INIT_SUCCESS on success, otherwise a error value.
+ * @retval INIT_SUCCESS Successful
+ * @retval INIT_PARSER_FAIL Parsing the initialization config file failed
+ * @retval INIT_ENGINE_CONTROLLER_FAIL Engine controller Initialization failed
+ * @retval INIT_EVENT_FAIL Event module Initialization failed
+ * @retval INIT_COMMON_DB_FAIL CommonDataBase Initialization failed
+ * @retval INIT_PLUGIN_FAIL PlugIn Initialization failed
+ * @retval INIT_PM_FAIL PlatformMonitor Initialization failed
+ * @retval INIT_DM_FAIL DeviceManagent Initialization failed
+ * @retval INIT_NETWORK_FAIL NetworkAccess Initialization failed
+ * @retval INIT_DEVICE_FAIL Device Initialization failed
+ * @pre Has not been called before. This function should be called one time.
+ * @post Framework is initialized as described in the file. Agent can use the Framework's function.
+ */
+ INIT_ERROR Init_Framework(const char *init_config_path);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* INITIALIZE_H_ */
diff --git a/framework/include/Initialization/initialize_error.h b/framework/include/Initialization/initialize_error.h
new file mode 100755
index 0000000..02ea7ab
--- /dev/null
+++ b/framework/include/Initialization/initialize_error.h
@@ -0,0 +1,72 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef INITIALIZE_ERROR_H_
+#define INITIALIZE_ERROR_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file initialize_error.h
+ * @brief Definition of framework error codes for Initialization
+ */
+
+/**
+ * @brief Enumerations of error codes for Initialization
+ */
+ typedef enum {
+ INIT_SUCCESS = 0,
+ /**< Successful */
+ INIT_FAIL, /**< Fail */
+ INIT_PARSER_FAIL, /**< Failed to parse the config file */
+ INIT_ENGINE_CONTROLLER_FAIL,
+ /**< Failed to initialize the engine controller module */
+ INIT_EVENT_FAIL, /**< Failed to initialize the event module */
+ INIT_COMMON_DB_FAIL,
+ /**< Failed to initialize the common database module */
+ INIT_PLUGIN_FAIL, /**< Failed to initialize the plugIn module */
+ INIT_SERVICE_DB_FAIL, /**< Failed to initialize the service module */
+ INIT_PM_FAIL, /**< Failed to initialize the platform monitor module */
+ INIT_DM_FAIL, /**< Failed to initialize the device manage module */
+ INIT_NETWORK_FAIL, /**< Failed to initialize the network access module */
+ INIT_DEVICE_FAIL /**< Failed to initialize the device module */
+ } INIT_ERROR;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* INITIALIZE_ERROR_H_ */
diff --git a/framework/include/Initialization/initialize_parser.h b/framework/include/Initialization/initialize_parser.h
new file mode 100755
index 0000000..4e5b60d
--- /dev/null
+++ b/framework/include/Initialization/initialize_parser.h
@@ -0,0 +1,47 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef INITIALIZE_PARSER_H_
+#define INITIALIZE_PARSER_H_
+
+#include "initialize_error.h"
+
+INIT_ERROR parse_Init_config(const char *init_config_file_path);
+
+char *get_AgentKey();
+
+int use_MainLoop();
+
+#endif /* INITIALIZE_PARSER_H_ */
diff --git a/framework/include/NetworkAccess/EXT_NA_NetworkStatus.h b/framework/include/NetworkAccess/EXT_NA_NetworkStatus.h
new file mode 100755
index 0000000..362cfaf
--- /dev/null
+++ b/framework/include/NetworkAccess/EXT_NA_NetworkStatus.h
@@ -0,0 +1,67 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef EXT_NA_NETWORKSTATUS_H_
+#define EXT_NA_NETWORKSTATUS_H_
+
+/**
+ * @file EXT_NA_NetworkStatus.h
+ * @brief Defines network status/type provided by sync-agent-framework
+ */
+
+/**
+ * @brief Enumerations for the information about current network status provided by sync-agent-framework
+ */
+typedef enum {
+ NETWORK_UNKNOWN = 0, /** initial network status */
+ NETWORK_ON, /** network connection */
+ NETWORK_OFF, /** network disconnection */
+ NETWORK_CHANGE /** change ip/proxy information */
+} FW_NETWORK_STATUS;
+
+/**
+ * @brief Enumerations for the information about current network connection type provided by sync-agent-framework
+ */
+typedef enum {
+ NETWORK_NONE = 0, /** initial network type */
+ NETWORK_3G_ON, /** network UMTS on */
+ NETWORK_3G_OFF, /** network UMTS off */
+ NETWORK_WIFI_ON, /** network WIFI on */
+ NETWORK_WIFI_ON_NOT_CONNECTED, /** network WIFI on but not connected */
+ NETWORK_WIFI_OFF, /** network WIFI off */
+ NETWORK_WIFI_3G_ON, /** network UMTS and WIFI on */
+} FW_NETWORK_TYPE;
+
+#endif /* EXT_NA_NETWORKSTATUS_H_ */
diff --git a/framework/include/NetworkAccess/IN_NA_FW_Callbacks.h b/framework/include/NetworkAccess/IN_NA_FW_Callbacks.h
new file mode 100644
index 0000000..d67a602
--- /dev/null
+++ b/framework/include/NetworkAccess/IN_NA_FW_Callbacks.h
@@ -0,0 +1,60 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+#ifndef IN_NA_FW_CALLBACKS_H_
+#define IN_NA_FW_CALLBACKS_H_
+
+/**
+ * @brief Set current network status (callback function used in slp-sysnoti-plugIn)
+ * @param[in] na_plugIn_id NetworkAccess PlugIn ID , means protocol type
+ * @param[in] fw_network_status Network status
+ * @param[in] fw_network_type Network type
+ * @param[in] proxy Proxy information
+ * @param[in] ip Ip information
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int handle_Network_Status(int na_plugIn_id, int fw_network_status, int fw_network_type, char *proxy, char *ip);
+
+/**
+ * @brief Request cancel and disconnect connection about all network session (callback function used in slp-sysnoti-plugIn)
+ * @param[in] na_plugIn_id NetworkAccess PlugIn ID , means protocol type
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int handle_Network_All_Cancel(int na_plugIn_id);
+
+#endif /* IN_NA_FW_CALLBACKS_H_ */
diff --git a/framework/include/NetworkAccess/IN_NA_Session_Manager.h b/framework/include/NetworkAccess/IN_NA_Session_Manager.h
new file mode 100755
index 0000000..b1c20ce
--- /dev/null
+++ b/framework/include/NetworkAccess/IN_NA_Session_Manager.h
@@ -0,0 +1,247 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+#ifndef IN_NA_SESSION_MANAGER_H_
+#define IN_NA_SESSION_MANAGER_H_
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <glib.h>
+
+#include "NetworkAccess/EXT_NA_NetworkStatus.h"
+
+/*
+ * @brief structure for multiple sessions management
+ */
+typedef struct {
+ GList *session_info_list;
+ char *ip;
+ char *proxy;
+ FW_NETWORK_STATUS fw_network_status;
+ FW_NETWORK_TYPE fw_network_type;
+} NA_Session_Manager;
+
+/*
+ * @brief session information
+ */
+typedef struct {
+ int session_id;
+ void *session;
+ void *msg;
+ int timeout;
+ char *id;
+ char *password;
+} NA_Session_Info;
+
+/*
+ * @brief initialize session manager
+ */
+void init_session_manager();
+
+/*
+ * @brief destroy session manager
+ */
+void destroy_session_manager();
+
+/*
+ * @brief create session information
+ * @param[out] session address of session in session information
+ * @return operation result
+ * @retval 1 success
+ * @retval -1 fail
+ */
+int create_session_info(void **session);
+
+/*
+ * @brief provide session id for the created session
+ * @param[out] session_id session id to provide the user
+ * @return operation result
+ * @retval 1 success
+ * @retval -1 fail
+ */
+int provide_session_id(unsigned int *session_id);
+
+/*
+ * @brief get session by using session id
+ * @param[in] session_id session id to provide the user
+ * @param[out] session address of session in session information
+ * @return operation result
+ * @retval 1 success
+ * @retval -1 fail
+ */
+int get_session(unsigned int session_id, void **session);
+
+/*
+ * @brief set session by using session id
+ * @param[in] session_id session id to provide the user
+ * @param[in] session address of session in session information
+ * @return operation result
+ * @retval 1 success
+ * @retval -1 fail
+ */
+int set_session(unsigned int session_id, void *session);
+
+/*
+ * @brief get current network status
+ * @return information about current network status provided by framework
+ * @retval NETWORK_UNKNOWN initial network status
+ * @retval NETWORK_ON network connection
+ * @retval NETWORK_OFF network disconnection
+ * @retval NETWORK_CHANGE change ip/proxy information
+ */
+FW_NETWORK_STATUS get_network_status();
+
+/*
+ * @brief set current network status (exception case : for mobex)
+ * @param[in] information about current network status provided by framework
+ * @return operation result
+ * @retval 1 success
+ * @retval -1 fail
+ */
+int set_network_status(FW_NETWORK_STATUS network_status);
+
+/*
+ * @brief get current network type
+ * @return information about current network connection type provided by framework
+ * @retval NETWORK_NONE initial network type
+ * @retval NETWORK_3G_ON network UMTS on
+ * @retval NETWORK_3G_OFF network UMTS off
+ * @retval NETWORK_WIFI_ON network WIFI on
+ * @retval NETWORK_WIFI_ON_NOT_CONNECTED network WIFI on but not connected
+ * @retval NETWORK_WIFI_OFF network WIFI off
+ * @retval NETWORK_WIFI_3G_ON network UMTS and WIFI on
+ */
+FW_NETWORK_TYPE get_network_type();
+
+/*
+ * @brief get current proxy information
+ * @return current proxy information
+ * @retval current proxy information (ex> http://xxx.xxx.xxx.xxx or https://xxx.xxx.xxx.xxx)
+ */
+char *get_proxy();
+
+/*
+ * @brief get message by using session id
+ * @param[in] session_id session id to provide the user
+ * @param[out] msg message
+ * @return operation result
+ * @retval 1 success
+ * @retval -1 fail
+ */
+int get_msg(unsigned int session_id, void **msg);
+
+/*
+ * @brief get timeout time by using session id
+ * @param[in] session_id session id to provide the user
+ * @param[out] timeout timeout time
+ * @return operation result
+ * @retval 1 success
+ * @retval -1 fail
+ */
+int get_timeout(unsigned int session_id, int *timeout);
+
+/*
+ * @brief set timeout time
+ * @param[in] session_id session id to provide the user
+ * @param[in] timeout timeout time
+ * @return operation result
+ * @retval 1 success
+ * @retval -1 fail
+ */
+int set_timeout(unsigned int session_id, int timeout);
+
+/*
+ * @brief get user id and password by using session id (not used)
+ * @param[in] session_id session id to provide the user
+ * @param[out] id user id
+ * @param[out] password user password
+ * @return operation result
+ * @retval 1 success
+ * @retval -1 fail
+ */
+int get_id_n_password(unsigned int session_id, char **id, char **password);
+
+/*
+ * @brief set user id and password for authentication at EAS
+ * @param[in] session_id session id to provide the user
+ * @param[in] id user id
+ * @param[in] password user password
+ * @return operation result
+ * @retval 1 success
+ * @retval -1 fail
+ */
+int set_id_n_password(unsigned int session_id, char *id, char *password);
+
+/*
+ * @brief get all sessions in session manager
+ * @param[out] session_list list of sessions
+ * @return operation result
+ * @retval 1 success
+ * @retval -1 fail
+ */
+int get_all_session(GList **session_list);
+
+/*
+ * @brief remove session information that has specific session id
+ * @param[in] session_id session id to provide the user
+ * @param[in] flag ( 1 : need not session memory free, 0 : need session memory free )
+ * @return operation result
+ * @retval 1 success
+ * @retval -1 fail
+ */
+int remove_session_info(unsigned int session_id, int flag);
+
+/*
+ * @brief remove all session information
+ * @param[in] flag ( 1 : need not session memory free, 0 : need session memory free )
+ * @return operation result
+ * @retval 1 success
+ * @retval -1 fail
+ */
+int remove_all_session_info(int flag);
+
+/*
+ * @brief set network information (network status/type) in session manager
+ * @param[in] protocol_type protocol type (ex> FW_HTTP, FW_MOBEX, ...)
+ * @param[in] net_status network status
+ * @param[in] net_type network type
+ * @param[in] proxy proxy information
+ * @param[in] ip ip information
+ * @return operation result
+ * @retval 1 success
+ * @retval -1 fail
+ */
+int set_network_info(int na_plugIn_id, int net_status, int net_type, char *proxy, char *ip);
+
+#endif /* IN_NA_SESSION_MANAGER_H_ */
diff --git a/framework/include/NetworkAccess/NACI.h b/framework/include/NetworkAccess/NACI.h
new file mode 100644
index 0000000..ec0263b
--- /dev/null
+++ b/framework/include/NetworkAccess/NACI.h
@@ -0,0 +1,341 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef NACI_H_
+#define NACI_H_
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <glib.h>
+
+#include "NACI_Common.h"
+
+/**
+ * @file NACI.h
+ * @brief Defines network data communication APIs
+ */
+
+/**
+ * @code
+
+#include "agent-framework/NetworkAccess/NACI.h"
+#include "agent-framework/NetworkAccess/NA_External.h"
+
+int main()
+{
+ NACI_RESULT res = NACI_SUCCESS;
+
+ GList *header_list = NULL;
+ GList *recv_header = NULL;
+ char *send_msg = "xxxxxxx";
+ char *recv_msg = NULL;
+ unsigned int recv_msg_length = 0;
+ char *content_value = NULL;
+ unsigned int session_id = 0;
+ int na_plugIn_id = 1; // defined each agent-config.xml files
+
+ char *ip = "http://xxx.xxx.xxx.xxx";
+ char *id = "abcd";
+ char *pw = "1234";
+
+ // init NACI
+ res = NACI_Init();
+ if (res != NACI_SUCCESS) {
+ // exception handling
+ }
+
+ // open connection
+ res = NACI_Open_Connection(na_plugIn_id, 300, &session_id);
+ if (res != NACI_SUCCESS) {
+ // exception handling
+ }
+
+ // add user authentication information - used if necessary
+ res = NACI_Add_Authentication_Info(na_plugIn_id, id, pw, session_id);
+ if (res != NACI_SUCCESS) {
+ // exception handling
+ }
+
+ // header binding - these elements are necessary to configure the header information !!
+ key : "method" value : "options" / "get" / "head" / "post" / "put" / "delete" / "trace" / "connect"
+ key : "uri" value : ip address (ex> "http://xxx.xxx.xxx.xxx")
+ common_header_info *method = (common_header_info*)malloc(sizeof(common_header_info));
+ if (method == 0x00) {
+ // exception handling
+ }
+ memset(method, 0x00, sizeof(common_header_info));
+
+ method->key = "method";
+ method->value = "post";
+ header_list = g_list_append(header_list, method);
+
+ common_header_info *uri = (common_header_info*)malloc(sizeof(common_header_info));
+ if (uri == 0x00) {
+ // exception handling
+ }
+ memset(uri, 0x00, sizeof(common_header_info));
+
+ uri->key = "uri";
+ uri->value = ip;
+ header_list = g_list_append(header_list, uri);
+
+ // test - check header information
+ GList *iter = NULL;
+ for (iter = header_list; iter != NULL; iter = g_list_next(iter)) {
+ fprintf(stdout, "key : %s, \t value : %s\n", ((common_header_info*)(iter->data))->key, ((common_header_info*)(iter->data))->value);
+ }
+
+ // send message
+ res = NACI_Send_Msg(header_list,
+ na_plugIn_id,
+ send_msg,
+ strlen(send_msg),
+ &recv_header,
+ &recv_msg,
+ &recv_msg_length,
+ SEND_N_RECEIVE,
+ session_id);
+
+ switch (res) {
+ case NACI_SUCCESS :
+ break;
+ case NACI_NETWORK_UNAVAILABLE :
+ // exception handling
+ break;
+ case NACI_HEADER_BINDING_FAIL :
+ // exception handling
+ break;
+ case NACI_SEND_MSG_FAIL :
+ // exception handling
+ break;
+ case NACI_TIME_OUT_SEND_MSG :
+ // exception handling
+ break;
+ case NACI_SEND_MSG_CANCEL :
+ // exception handling
+ break;
+ case NACI_SEND_MSG_TRY_AGAIN :
+ // exception handling
+ break;
+ case NACI_HEADER_UNBINDING_FAIL :
+ // exception handling
+ break;
+ default :
+ break;
+ }
+
+ ...
+
+ // get header information
+ res = NACI_Get_Header_Info(na_plugIn_id, recv_header, "Content", &content_value);
+ if (res != NACI_SUCCESS) {
+ // exception handling
+ }
+
+ // free header information received from server
+ res = NACI_Free_Recv_Header_Info(recv_header);
+ if (res != NACI_SUCCESS) {
+ // exception handling
+ }
+
+ // close connection
+ res = NACI_Close_Connection(na_plugIn_id, session_id);
+ if (res != NACI_SUCCESS) {
+ // exception handling
+ }
+
+ // destroy NACI
+ res = NACI_Destroy();
+ if (res != NACI_SUCCESS) {
+ // exception handling
+ }
+
+ return 0;
+}
+* @endcode
+*/
+
+/**
+ * @brief Initialize NACI
+ * @remarks Run only once at the beginning of the process
+ * @param[in] na_plugIn_id NetworkAccess PlugIn ID, means protocol type
+ * @return Operation result
+ * @retval NACI_SUCCESS Successful
+ * @retval NACI_FAIL Operation failed
+ */
+NACI_RESULT NACI_Init(int na_plugIn_id);
+
+/**
+ * @brief Open network connection (ex> create http session / create socket ...)
+ * @param[in] na_plugIn_id NetworkAccess PlugIn ID, means protocol type
+ * @param[in] timeout Set user preferred time-out seconds used in sending message (ex> 30 : means 30sec)
+ * @param[out] session_id Session id to provide the user
+ * @return Operation result
+ * @retval NACI_SUCCESS Successful
+ * @retval NACI_OPEN_CONNECTION_FAIL Open connection failed
+ */
+NACI_RESULT NACI_Open_Connection(int na_plugIn_id, int timeout, unsigned int *session_id);
+
+/**
+ * @brief Close network connection (ex> close http session / close socket ...)
+ * @param[in] na_plugIn_id NetworkAccess PlugIn ID, means protocol type
+ * @param[in] session_id Session id to provide the user
+ * @return Operation result
+ * @retval NACI_SUCCESS Successful
+ * @retval NACI_CLOSE_CONNECTION_FAIL Close connection failed
+ */
+NACI_RESULT NACI_Close_Connection(int na_plugIn_id, unsigned int session_id);
+
+/**
+ * @brief Send message to server
+ * 1. Header binding for network protocol
+ * 2, Send message to server
+ * 3. Receive message from server
+ * 4. Divide header and body information from the received message
+ * @param[in] header_info Header information that depending on the protocol type
+ * @param[in] na_plugIn_id NetworkAccess PlugIn ID, means protocol type
+ * @param[in] send_msg Body message
+ * @param[in] send_msg_length Length of body message
+ * @param[out] recv_header Header information (key - value pair) of received message
+ * @param[out] recv_msg Body information of received message
+ * @param[out] recv_msg_length Length of received body message
+ * @param[in] send_type Type of send message
+ * @param[in] session_id Session id to provide the user
+ * @return Operation result
+ * @retval NACI_SUCCESS Successful
+ * @retval NACI_NETWORK_UNAVAILABLE Network Unavailable (fail to send message)
+ * @retval NACI_HEADER_BINDING_FAIL Header binding failed
+ * @retval NACI_SEND_MSG_FAIL Send message failed - send_type : SEND_N_RECEIVE
+ * @retval NACI_TIME_OUT_SEND_MSG Send message failed (failure due to timeout) - send_type : SEND_N_RECEIVE
+ * @retval NACI_SEND_MSG_CANCEL Send message failed (failure due to cancel operation request) - send_type : SEND_N_RECEIVE
+ * @retval NACI_SEND_MSG_TRY_AGAIN Send message failed (failure due to over the number of retries (3) for send message) - send_type : SEND_N_RECEIVE
+ * @retval NACI_JUST_SEND_MSG_FAIL Send message failed - send_type : JUST_SEND
+ * @retval NACI_HEADER_UNBINDING_FAIL Header unbinding failed
+ */
+NACI_RESULT NACI_Send_Msg(GList *header_info, int na_plugIn_id, char *send_msg, unsigned int send_msg_length, GList **recv_header, unsigned char **recv_msg, unsigned int *recv_msg_length, NACI_SEND_TYPE send_type, unsigned int session_id);
+
+/**
+ * @brief Cancel operation about message being sent to the server
+ * @remarks This API is must called by other thread
+ * @param[in] na_plugIn_id NetworkAccess PlugIn ID, means protocol type
+ * @param[in] session_id Session id to provide the user
+ * @return Operation result
+ * @retval NACI_SUCCESS Successful
+ * @retval NACI_CANCEL_MSG_FAIL Cancel message sending operation is failed
+ */
+NACI_RESULT NACI_Cancel_Msg(int na_plugIn_id, unsigned int session_id);
+
+/**
+ * @brief Destroy NACI
+ * @remarks Run only once at the end of the process
+ * @return Operation result
+ * @retval NACI_SUCCESS Successful
+ * @retval NACI_FAIL Operation failed
+ * @pre The application should be called NACI_Init() and returned NACI_SUCCESS
+ */
+NACI_RESULT NACI_Destroy();
+
+/**
+ * @brief Get network header information about specific keyword
+ * @param[in] na_plugIn_id NetworkAccess PlugIn ID, means protocol type
+ * @param[in] header_info List of network header information (key-value pair)
+ * @param[in] key Specific keyword of header information that user want to know
+ * @param[out] value Value for the key
+ * @return Operation result
+ * @retval NACI_SUCCESS Successful
+ * @retval NACI_GET_HEADER_INFO_FAIL Operation failed
+ * @pre The application should be called NACI_Send_Msg() and returned NACI_SUCCESS
+ */
+NACI_RESULT NACI_Get_Header_Info(int na_plugIn_id, GList *header_info, char *key, char **value);
+
+/**
+ * @brief Memory free for the header information received from the server
+ * @param[in] header_info Header information received from the server
+ * @return Operation result
+ * @retval NACI_SUCCESS Successful
+ * @retval NACI_FAIL Operation failed
+ * @pre The application should be called NACI_Get_Header_Info() and returned NACI_SUCCESS
+ */
+NACI_RESULT NACI_Free_Recv_Header_Info(GList *header_info);
+
+/**
+ * @brief Check the current network status provided by sync-agent-framework
+ * @param[in] interval Interval time for checking network status (ex> 3 : 3sec)
+ * @param[in] retry_cnt The number of retries for checking network status
+ * @return Operation result
+ * @retval NACI_SUCCESS Network is available
+ * @retval NACI_NETWORK_UNAVAILABLE Network is unavailable
+ */
+NACI_RESULT NACI_Check_Network_Status(int interval, int retry_cnt);
+
+/**
+ * @brief Get current network type provided by sync-agent-framework
+ * @param[in] net_type Current network type
+ * @return Operation result
+ * @retval NACI_SUCCESS Successful
+ * @retval NACI_FAIL Operation failed
+ */
+NACI_RESULT NACI_Get_Network_Type(int *net_type);
+
+/**
+ * @brief Download data from server
+ * @param[in] header_info Header information that depending on the protocol type
+ * @param[in] na_plugIn_id NetworkAccess PlugIn ID, means protocol type
+ * @param[in] download_folder Folder path for download
+ * @param[in] download_start_size Download start size
+ * @param[in] download_body_size Download message size
+ * @param[out] out_download_path File path to download
+ * @param[in] send_type Type of send message
+ * @param[in] session_id Session id to provide the user
+ * @return Operation result
+ * @retval NACI_SUCCESS Successful
+ * @retval NACI_DOWNLOAD_DATA_FAIL Operation failed
+ */
+NACI_RESULT NACI_Download_Data(GList *header_info, int na_plugIn_id, unsigned char *download_folder, unsigned int download_start_size, unsigned int download_body_size, unsigned char **out_download_path, NACI_SEND_TYPE send_type, unsigned int session_id);
+
+/**
+ * @brief Add user authentication information (id, password) to session and
+ * register authentication callback for 'authenticate' signal
+ * @param[in] na_plugIn_id NetworkAccess PlugIn ID, means protocol type
+ * @param[in] id User id
+ * @param[in] password User password
+ * @param[in] session_id Session id to provide the user
+ * @return Operation result
+ * @retval NACI_SUCCESS Successful
+ * @retval NACI_ADD_AUTH_INFO_FAIL Operation failed
+ */
+NACI_RESULT NACI_Add_Authentication_Info(int na_plugIn_id, char *id, char *password, unsigned int session_id);
+
+#endif /* NACI_H_ */
diff --git a/framework/include/NetworkAccess/NACI_Common.h b/framework/include/NetworkAccess/NACI_Common.h
new file mode 100755
index 0000000..ae11d64
--- /dev/null
+++ b/framework/include/NetworkAccess/NACI_Common.h
@@ -0,0 +1,54 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef NACI_COMMON_H_
+#define NACI_COMMON_H_
+
+#include "NACI_Errors.h"
+
+/**
+ * @file NACI_Common.h
+ * @brief Support to send message to the server
+ */
+
+/**
+ * @brief Enumerations for the type of sending message
+ */
+typedef enum {
+ SEND_N_RECEIVE = 0, /** general process */
+ JUST_SEND, /** specific process (send only) */
+} NACI_SEND_TYPE;
+
+#endif /* NACI_COMMON_H_ */
diff --git a/framework/include/NetworkAccess/NACI_Errors.h b/framework/include/NetworkAccess/NACI_Errors.h
new file mode 100755
index 0000000..1e06c40
--- /dev/null
+++ b/framework/include/NetworkAccess/NACI_Errors.h
@@ -0,0 +1,72 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef NACI_ERRORS_H_
+#define NACI_ERRORS_H_
+
+/**
+ * @file NACI_Errors.h
+ * @brief Defines NACI errors
+ */
+
+/**
+ * @brief Enumerations for the NACI error
+ */
+typedef enum {
+ NACI_SUCCESS = 1,
+
+ NACI_FAIL = -1000,
+
+ NACI_NETWORK_UNAVAILABLE = -1001,
+ NACI_INIT_FAIL = -1002,
+ NACI_OPEN_CONNECTION_FAIL = -1003,
+ NACI_HEADER_BINDING_FAIL = -1004,
+ NACI_SEND_MSG_FAIL = -1005,
+ NACI_SEND_MSG_CANCEL = -1006,
+ NACI_JUST_SEND_MSG_FAIL = -1007,
+ NACI_HEADER_UNBINDING_FAIL = -1008,
+ NACI_CLOSE_CONNECTION_FAIL = -1009,
+ NACI_CANCEL_MSG_FAIL = -1010,
+ NACI_GET_HEADER_INFO_FAIL = -1011,
+ NACI_DOWNLOAD_DATA_FAIL = -1012,
+
+ /* for http */
+ NACI_TIME_OUT_SEND_MSG = -1100,
+ NACI_SEND_MSG_TRY_AGAIN = -1101,
+ NACI_ADD_AUTH_INFO_FAIL = -1102,
+
+} NACI_RESULT;
+
+#endif /* NACI_ERRORS_H_ */
diff --git a/framework/include/NetworkAccess/NA_External.h b/framework/include/NetworkAccess/NA_External.h
new file mode 100755
index 0000000..001f53d
--- /dev/null
+++ b/framework/include/NetworkAccess/NA_External.h
@@ -0,0 +1,53 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef NA_EXTERNALL_H_
+#define NA_EXTERNAL_H_
+
+/**
+ * @file NA_External.h
+ * @brief Defines common network header setting
+ */
+
+/**
+ * @brief Structure for the network protocol header information setting
+ * @remarks Key-value pair
+ */
+typedef struct {
+ char *key;
+ char *value;
+} common_header_info;
+
+#endif /* NA_EXTERNAL_H_ */
diff --git a/framework/include/NetworkAssistant/protocol_binder/protocol_binder.h b/framework/include/NetworkAssistant/protocol_binder/protocol_binder.h
new file mode 100755
index 0000000..f79eb7c
--- /dev/null
+++ b/framework/include/NetworkAssistant/protocol_binder/protocol_binder.h
@@ -0,0 +1,242 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * SeongWon Shim <seongwon.shim@samsung.com>
+ */
+
+#ifndef PROTOCOL_BINDER_H_
+#define PROTOCOL_BINDER_H_
+
+#include "protocol_binder_common.h"
+
+/* binder function set */
+
+/**
+ * @brief Initialize binder function set
+ * @param[in] binder_function_cnt Count of binder function
+ * @param[in] info_array Binder_function_info
+ * @param[out] pBinder_function_set Binder_function_set
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_OUT_OF_MEMORY Out of memory
+ */
+PROTOCOL_BINDER_ERROR init_binder_function_set(unsigned int binder_function_cnt, Binder_function_info *info_array, Binder_function_set **pBinder_function_set);
+
+/**
+ * @brief Ignore previous binder function set built and rebuild binder function set with new function informations
+ * @param[in] pBinder_functino_set Binder function set
+ * @param[in] new_binder_function_info_cnt Number of new binder function informations
+ * @param[in] new_info_array Array of new binder function informations
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_OUT_OF_MEMORY Out of memory
+ */
+PROTOCOL_BINDER_ERROR reset_binder_function_set(Binder_function_set *pBinder_function_set, unsigned int new_binder_function_info_cnt, Binder_function_info *new_info_array);
+
+/**
+ * @brief Add more function informations to binder function set
+ * @remarks you should notice that if same value of protocol_element
+ * or protocol_element_xml_name are already existed in binder function set,
+ * then previous information is removed from binder function set
+ * @param[in] pBinder_functino_set Binder function set
+ * @param[in] binder_function_info_cnt Number of new binder function informations to be added
+ * @param[in] info_array_to_be_added Array of new binder function informations to be added
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_OUT_OF_MEMORY Out of memory
+ */
+PROTOCOL_BINDER_ERROR add_binder_function_set(Binder_function_set *pBinder_function_set, unsigned int binder_function_info_cnt, Binder_function_info *info_array_to_be_added);
+
+/**
+ * @brief Free binder function set
+ * @param[in] pBinder_function_set Binder_function_set
+ */
+void free_binder_function_set(Binder_function_set *pBinder_function_set);
+
+/* protocol binder */
+
+/**
+ * @brief Initialize protocol binder
+ * @param[in] pBinder protocol_binder
+ * @param[in] protocol Protocol enum value
+ * @param[in] option Function pointer of Protocol_Option_Ptr
+ * @param[in] enc Encoding enum value
+ * @param[in] encode_xml_header Whether need XML header encoding or not
+ * @param[in] use_strtbl Whether use string table or not
+ * @param[in] produce_anonymous whether produce an anonymous document or not
+ * @param[in] use_flow_mode Whether use flow mode or not
+ * @param[in] restrict_params List of restrict parameter
+ * @param[in] restrict_condition_checker Function pointer of restrict condition
+ * @param[in] pBinder_function_set Binder_function_set
+ * @return protocol_binder on success, NULL on fail
+ */
+protocol_binder *protocol_binder_init(protocol_binder *pBinder, Protocol protocol, Protocol_Option_Ptr option, Encoding enc, bool encode_xml_header, bool use_strtbl, bool produce_anonymous, bool use_flow_mode, GList *restrict_params, Restrict_Condition_Checker_callback restrict_condition_checker, Binder_function_set *pBinder_function_set);
+
+/**
+ * @brief Append specific XML element to WBXMLTree
+ * @remarks Process callback function that has registered to Binder_function_set
+ * pContent by pass to callback function
+ * @param[in] pBinder protocol_binder
+ * @param[in] protocol_element Protocol_Element
+ * @param[in] pContent Structure that need to append to WBXMLTree
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_NOT_DEFINED Invalid parameter(pBinder)
+ * @retval PROTOCOL_BINDER_BINDER_FUNCTION_SET_NOT_DEFINED Binder Function Set is not defined
+ * @retval PROTOCOL_BINDER_APPEND_INVALID_PROTOCOL_ELEMENT Invalid protocol element
+ * @retval PROTOCOL_BINDER_UNKNOWN_ERROR
+ */
+PROTOCOL_BINDER_ERROR protocol_binder_append(protocol_binder *pBinder, Protocol_Element protocol_element, Content_Ptr pContent);
+
+/**
+ * @brief Terminate protocol binder
+ * @param[in] pBinder protocol_binder
+ */
+void protocol_binder_terminate(protocol_binder *pBinder);
+
+/**
+ * @brief Get stream from protocol binder
+ * @param[in] pBinder protocol_binder
+ * @param[out] byte_stream Encoded stream
+ * @param[out] byte_stream_size Size of Encoded stream
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_NOT_DEFINED Invalid parameter(pBinder)
+ * @retval PROTOCOL_BINDER_INVALID_INPUT_PARAMETER Invalid parameter
+ * @retval PROTOCOL_BINDER_UNKNOWN_ERROR
+ */
+PROTOCOL_BINDER_ERROR protocol_binder_get_stream(protocol_binder *pBinder, char **byte_stream, unsigned int *byte_stream_size);
+
+/**
+ * @brief Get XML stream from protocol binder
+ * @remarks Only support when protocol binder encoding == ENCODING_WBXML_XX
+ * @param[in] pBinder protocol_binder
+ * @param[out] xml XML
+ * @param[out] xml_size Size of XML
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_NOT_DEFINED Invalid parameter(pBinder)
+ * @retval PROTOCOL_BINDER_NOT_SUPPORT_FOR_XML_ENCODING Encoding type is ENCODING_XML
+ * @retval PROTOCOL_BINDER_UNKNOWN_ERROR
+ */
+PROTOCOL_BINDER_ERROR protocol_binder_get_xml_for_debugging(protocol_binder *pBinder, char **xml, unsigned int *xml_size);
+
+/**
+ * @brief Get stream size from protocol binder
+ * @param[in] pBinder protocol_binder
+ * @param[out] byte_stream_size Size of byte stream
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_NOT_DEFINED Invalid parameter(pBinder)
+ * @retval PROTOCOL_BINDER_INVALID_INPUT_PARAMETER Invalid parameter
+ * @retval PROTOCOL_BINDER_UNKNOWN_ERROR
+ */
+PROTOCOL_BINDER_ERROR protocol_binder_get_stream_size(protocol_binder *pBinder, unsigned int *byte_stream_size);
+
+/**
+ * @brief Get encoding type protocol binder
+ * @param[in] pBinder protocol_binder
+ * @param[out] enc Encoding enum value
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_NOT_DEFINED Invalid parameter(pBinder)
+ */
+PROTOCOL_BINDER_ERROR protocol_binder_get_encoding(protocol_binder *pBinder, Encoding * enc);
+
+/* reverse protocol binder */
+
+/**
+ * @brief Initialize reverse protocol binder
+ * @param[in] byte_stream WBXML or XML byte stream
+ * @param[in] byte_stream_len Length of byte stream
+ * @param[in] dec Type of Decoding(DECODING_XML, DECODING_WBXML)
+ * @param[in] pProtocol Protocol Enum value(which Protocol)
+ * @param[in] pBinder_function_set Binder_function_set
+ * @param[in] user_data
+ * @param[out] ppBinder Reverse_protocol_binder
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_INVALID_INPUT_PARAMETER Invalid parameter
+ * @retval PROTOCOL_BINDER_UNKNOWN_ENCODING Unknown Encoding type
+ * @retval PROTOCOL_BINDER_OUT_OF_MEMORY Out of memory
+ */
+PROTOCOL_BINDER_ERROR reverse_protocol_binder_init(char *byte_stream, unsigned int byte_stream_len, Decoding dec, Protocol * pProtocol, Binder_function_set *pBinder_function_set, void *user_data, Reverse_protocol_binder **ppBinder);
+
+/**
+ * @brief Set user data to reverse protocol binder
+ * @param[in] pBinder Reverse_protocol_binder
+ * @param[in] user_data User data
+ */
+void reverse_protocol_binder_set_user_data(Reverse_protocol_binder *pBinder, void *user_data);
+
+/**
+ * @brief get user data from reverse protocol binder
+ * @param[in] pBinder Reverse_protocol_binder
+ * @return void* on success
+ */
+void *reverse_protocol_binder_get_user_data(Reverse_protocol_binder *pBinder);
+
+/**
+ * @brief Process next registered XML element related callback function and get structure as a result
+ * @param[in] pBinder Reverse_protocol_binder
+ * @param[in] protocol_element Protocol_Element
+ * @param[out] protocol_element_name XML element name
+ * @param[out] pContent Structure as a callback process result
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_HAS_NO_MORE_ELEMENT No more XML element
+ * @retval PROTOCOL_BINDER_OUT_OF_MEMORY Out of memory
+ */
+PROTOCOL_BINDER_ERROR reverse_protocol_binder_next(Reverse_protocol_binder *pBinder, Protocol_Element * protocol_element, char **protocol_element_name, Content_Ptr *pContent);
+
+/**
+ * @brief Terminate Reverse protocol binder
+ * @param[in] pBinder Reverse_protocol_binder
+ */
+void reverse_protocol_binder_terminate(Reverse_protocol_binder *pBinder);
+
+/**
+ * @brief Get XML stream from reverse protocol binder
+ * @remarks Only support when protocol binder encoding == ENCODING_WBXML_XX
+ * @param[in] pBinder Reverse_protocol_binder
+ * @param[out] xml XML
+ * @param[out] xml_size Size of XML
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_NOT_DEFINED Invalid parameter(pBinder)
+ * @retval PROTOCOL_BINDER_INIT_REQUIRED_OR_INVALID_BINDER Invalid parameter(pBinder)
+ * @retval PROTOCOL_BINDER_NOT_SUPPORT_FOR_XML_DECODING Encoding type is ENCODING_XML
+ * @retval PROTOCOL_BINDER_UNKNOWN_ERROR
+ */
+PROTOCOL_BINDER_ERROR reverse_protocol_binder_get_xml_for_debugging(Reverse_protocol_binder *pBinder, char **xml, unsigned int *xml_size);
+
+#endif /* PROTOCOL_BINDER_H_ */
diff --git a/framework/include/NetworkAssistant/protocol_binder/protocol_binder_common.h b/framework/include/NetworkAssistant/protocol_binder/protocol_binder_common.h
new file mode 100755
index 0000000..f9420da
--- /dev/null
+++ b/framework/include/NetworkAssistant/protocol_binder/protocol_binder_common.h
@@ -0,0 +1,47 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * SeongWon Shim <seongwon.shim@samsung.com>
+ */
+
+#ifndef PROTOCOL_BINDER_COMMON_H_
+#define PROTOCOL_BINDER_COMMON_H_
+
+/* common includes */
+#include <stdbool.h>
+
+/* our includes */
+#include "protocol_binder_definition.h"
+#include "protocol_binder_error.h"
+#include "protocol_binder_util.h"
+
+#endif /* PROTOCOL_BINDER_COMMON_H_ */
diff --git a/framework/include/NetworkAssistant/protocol_binder/protocol_binder_definition.h b/framework/include/NetworkAssistant/protocol_binder/protocol_binder_definition.h
new file mode 100755
index 0000000..84b6b65
--- /dev/null
+++ b/framework/include/NetworkAssistant/protocol_binder/protocol_binder_definition.h
@@ -0,0 +1,161 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * SeongWon Shim <seongwon.shim@samsung.com>
+ */
+
+#ifndef PROTOCOL_BINDER_DEFINITION_H_
+#define PROTOCOL_BINDER_DEFINITION_H_
+
+#include <glib.h>
+#include <stdbool.h>
+#include "protocol_binder_error.h"
+#include <wbxml/wbxml.h>
+#include <wbxml/wbxml_parser.h>
+#include <wbxml/wbxml_tree.h>
+#include <wbxml/wbxml_encoder.h>
+
+typedef void *Content_Ptr;
+typedef void *Protocol_Option_Ptr;
+typedef unsigned int Protocol_Element;
+
+/* common definition */
+
+/**
+ * @brief Enumerations of encoding type
+ */
+typedef enum {
+ ENCODING_UNKNOWN = 0,
+ ENCODING_XML, /**< XML*/
+ ENCODING_WBXML_10, /**< WBXML 1.0*/
+ ENCODING_WBXML_11, /**< WBXML 1.1*/
+ ENCODING_WBXML_12, /**< WBXML 1.2*/
+ ENCODING_WBXML_13 /**< WBXML 1.3*/
+} Encoding;
+
+/**
+ * @brief Enumerations of decoding type
+ */
+typedef enum {
+ DECODING_UNKNOWN = 0,
+ DECODING_XML, /**< XML*/
+ DECODING_WBXML /**< WBXML*/
+} Decoding;
+
+/**
+ * @brief Enumerations of Protocol that supports by Protocol binder
+ */
+typedef enum {
+ PROTOCOL_UNKNOWN = 0,
+ PROTOCOL_SYNCML_SYNCML10, /**< SYNCML1.0*/
+ PROTOCOL_SYNCML_SYNCML11, /**< SYNCML1.1*/
+ PROTOCOL_SYNCML_SYNCML12, /**< SYNCML1.2*/
+
+ PROTOCOL_SYNCML_DEVINF10, /**< SYNCML Device Information 1.0*/
+ PROTOCOL_SYNCML_DEVINF11, /**< SYNCML Device Information 1.1*/
+ PROTOCOL_SYNCML_DEVINF12, /**< SYNCML Device Information 1.2*/
+
+ PROTOCOL_SYNCML_METINF10, /**< SYNCML Meta Information 1.0*/
+ PROTOCOL_SYNCML_METINF11, /**< SYNCML Meta Information 1.1*/
+ PROTOCOL_SYNCML_METINF12, /**< SYNCML Meta Information 1.2*/
+
+ PROTOCOL_SYNCML_DMDDF12, /**< SYNCML DM DDF 1.2*/
+
+ PROTOCOL_ACTIVESYNC, /**< EAS*/
+
+ PROTOCOL_PROV10, /**< EAS Provisioning*/
+
+ PROTOCOL_MAX_COUNT /**< for counting supporting protocol*/
+} Protocol;
+
+/* protocol binder */
+
+/**
+ * @brief Structure for protocol binder
+ */
+typedef struct _protocol_binder protocol_binder;
+
+/**
+ * @brief Restrict Condition Checker callback
+ * @param[in] enc Encoding enum value
+ * @param[in] option Protocol_Option_Ptr
+ * @param[in] restrict_params List of restrict parameter
+ * @param[in] arguments List of parameter
+ */
+typedef bool (*Restrict_Condition_Checker_callback) (Encoding enc, Protocol_Option_Ptr option, GList *restrict_params, GList *arguments);
+
+/**
+ * @brief Binder Object converter function
+ * @param[in] pBinder protocol_binder
+ * @param[in] pContent Void pointer
+ * @param[in] ppWbxml_dom_node WBXMLTreeNode
+ */
+typedef PROTOCOL_BINDER_ERROR(*Binder_Object_converter_function) (protocol_binder *pBinder, Content_Ptr pContent, WBXMLTreeNode **ppWbxml_dom_node);
+
+/* reverse protocol binder */
+
+/*typedef struct _Reverse_binder_function_info Reverse_binder_function_info;*/
+/*typedef struct _Reverse_binder_function_set Reverse_binder_function_set;*/
+
+/**
+ * @brief Structure for reverse protocol binder
+ */
+typedef struct _Reverse_protocol_binder Reverse_protocol_binder;
+
+/**
+ * @brief Reverse Binder Object converter function
+ * @param[in] pReverse_binder Reverse_protocol_binder
+ * @param[in] wbxml_dom_node WBXMLTreeNode
+ * @param[in] pContent Content_Ptr
+ */
+typedef PROTOCOL_BINDER_ERROR(*Reverse_Binder_Object_converter_function) (Reverse_protocol_binder *pReverse_binder, WBXMLTreeNode *wbxml_dom_node, Content_Ptr *pContent);
+
+/* protocol binder & reverse protocol binder callback */
+
+/**
+ * @brief Structure for Binder function set
+ */
+typedef struct _Binder_function_set Binder_function_set;
+
+/**
+ * @brief Structure for Binder function info
+ */
+typedef struct _Binder_function_info Binder_function_info;
+struct _Binder_function_info {
+ Protocol_Element protocol_element;
+ char *protocol_element_xml_name;
+ Binder_Object_converter_function binder_object_converter_function;
+ Reverse_Binder_Object_converter_function reverse_binder_object_converter_function;
+ bool isTerminal;
+};
+
+#endif /* PROTOCOL_BINDER_DEFINITION_H_ */
diff --git a/framework/include/NetworkAssistant/protocol_binder/protocol_binder_error.h b/framework/include/NetworkAssistant/protocol_binder/protocol_binder_error.h
new file mode 100755
index 0000000..7fca01f
--- /dev/null
+++ b/framework/include/NetworkAssistant/protocol_binder/protocol_binder_error.h
@@ -0,0 +1,84 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * SeongWon Shim <seongwon.shim@samsung.com>
+ */
+
+#ifndef PROTOCOL_BINDER_ERROR_H_
+#define PROTOCOL_BINDER_ERROR_H_
+
+/**
+ * @brief Enumerations of error code for protocol binder
+ */
+typedef enum {
+ PROTOCOL_BINDER_OK = 0, /**< Successful */
+ PROTOCOL_BINDER_HAS_NO_MORE_ELEMENT = 1, /**< No more XML Element */
+
+ PROTOCOL_BINDER_UNKNOWN_ERROR, /**< Unknown Error */
+ PROTOCOL_BINDER_OUT_OF_MEMORY, /**< Out of memory */
+ PROTOCOL_BINDER_NOT_DEFINED, /**< Something that have to be defined is not defined */
+ PROTOCOL_BINDER_INIT_REQUIRED_OR_INVALID_BINDER,
+ PROTOCOL_BINDER_UNKNOWN_ENCODING, /**< Unknown Encoding type */
+
+ PROTOCOL_BINDER_NOT_SUPPORT_FOR_XML_ENCODING, /**< Not Support for XML encoding */
+ PROTOCOL_BINDER_NOT_SUPPORT_FOR_XML_DECODING, /**< Not Support for XML decoding */
+
+ PROTOCOL_BINDER_UNKNOWN_LANGUAGE, /**< Unknown Language */
+ PROTOCOL_BINDER_WBXML_PARSE_FAIL, /**< WBXML Parse Fail */
+ PROTOCOL_BINDER_XML_PARSE_FAIL, /**< XML Parse Fail */
+ PROTOCOL_BINDER_INVALID_XML, /**< Invalid XML */
+ PROTOCOL_BINDER_BINDER_FUNCTION_SET_NOT_DEFINED, /**< Function Set Not Defined */
+ PROTOCOL_BINDER_BINDER_FUNCTION_SET_LOOKUP_TBL_NOT_DEFINED, /**< Lookup table has not defined */
+
+ PROTOCOL_BINDER_INVALID_PROTOCOL, /**< Invalid Protocol */
+ PROTOCOL_BINDER_INVALID_CONTENT, /**< Invalid Content */
+
+ PROTOCOL_BINDER_UNEXPECTED_CASE_ACCORDING_TO_PROTOCOL_SPEC,
+
+ PROTOCOL_BINDER_ALREADY_SWITCH_PROTOCOL, /**< Operation failed */
+ PROTOCOL_BINDER_HAS_NO_UNDO_SWITCH_PROTOCOL, /**< Operation failed */
+ PROTOCOL_BINDER_INVALID_PROTOCOL_ELEMENT, /**< Invalid protocol element */
+ PROTOCOL_BINDER_APPEND_INVALID_PROTOCOL_ELEMENT, /**< Invalid protocol element */
+
+ PROTOCOL_BINDER_INVALID_INPUT_PARAMETER, /**< Invalid input parameter */
+
+ PROTOCOL_BINDER_TREE_NODE_IS_NOT_ELEMENT_NODE, /**< Invalid parameter */
+
+ PROTOCOL_BINDER_TREE_ALREADY_HAS_ROOT, /**< Already has root in WBXMLTree */
+
+ /* protocol binder error */
+ PROTOCOL_BINDER_UTIL_NO_TEXT_VALUE, /* TODO remove */
+ PROTOCOL_BINDER_UTIL_NO_BINARY_VALUE, /**<nvalid parameter */
+ PROTOCOL_BINDER_UTIL_NO_INT_VALUE /**<nvalid parameter */
+} PROTOCOL_BINDER_ERROR;
+
+#endif /* PROTOCOL_BINDER_ERROR_H_ */
diff --git a/framework/include/NetworkAssistant/protocol_binder/protocol_binder_internal.h b/framework/include/NetworkAssistant/protocol_binder/protocol_binder_internal.h
new file mode 100755
index 0000000..896ef19
--- /dev/null
+++ b/framework/include/NetworkAssistant/protocol_binder/protocol_binder_internal.h
@@ -0,0 +1,104 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * SeongWon Shim <seongwon.shim@samsung.com>
+ */
+
+#ifndef PROTOCOL_BINDER_INTERNAL_H_
+#define PROTOCOL_BINDER_INTERNAL_H_
+
+#include "protocol_binder_common.h"
+#include "protocol_binder.h"
+#include <glib.h>
+#include <stdbool.h>
+
+/* protocol binder */
+
+/**
+ * @brief Structure for Binder function set
+ */
+struct _Binder_function_set {
+ unsigned int set_size;
+ Binder_function_info *info_array;
+
+ GHashTable *protocol_element_lookup_tbl;
+ GHashTable *protocol_element_xml_name_lookup_tbl;
+};
+
+/**
+ * @brief Structure for protocol binder
+ */
+struct _protocol_binder {
+ Protocol protocol;
+ Protocol_Option_Ptr option;
+ Encoding enc;
+ bool encode_xml_header; /* use only when enc = ENCODING_XML */
+ bool use_strtbl; /* use only when enc = ENCODING_WBXML_... */
+ bool produce_anonymous; /* use only when enc = ENCODING_WBXML_... */
+ bool use_flow_mode;
+ GList *restrict_params;
+ Restrict_Condition_Checker_callback restrict_condition_checker;
+ Binder_function_set *binder_functions;
+
+ WBXMLLangEntry *lang_table;
+ WBXMLLangEntry *prev_lang_table;
+ /* use only if flow_mode = false */
+ WBXMLTree *tree;
+
+ /* use only if flow mode = true */
+ WBXMLEncoder *wbxml_encoder;
+
+ GSList *tree_node_stack;
+ bool is_current_node_terminal;
+};
+
+/* reverse protocol binder */
+
+/**
+ * @brief Structure for reverse protocol binder
+ */
+struct _Reverse_protocol_binder {
+ Protocol protocol;
+ Decoding dec;
+ Binder_function_set *binder_functions;
+ void *user_data;
+
+ WBXMLTree *tree; /* TODO : replace this part to our code */
+ GSList *tree_stack; /* this part is needed for traversing wbxml tree with two language */
+ WBXMLTreeNode *current_tree_node; /* TODO : replace this part to our code */
+ bool current_tree_node_first_visit;
+
+ bool no_tree_node_visited;
+ bool all_tree_node_visited;
+};
+
+#endif /* PROTOCOL_BINDER_INTERNAL_H_ */
diff --git a/framework/include/NetworkAssistant/protocol_binder/protocol_binder_util.h b/framework/include/NetworkAssistant/protocol_binder/protocol_binder_util.h
new file mode 100755
index 0000000..eeadbc7
--- /dev/null
+++ b/framework/include/NetworkAssistant/protocol_binder/protocol_binder_util.h
@@ -0,0 +1,321 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * SeongWon Shim <seongwon.shim@samsung.com>
+ */
+
+#ifndef PROTOCOL_BINDER_UTIL_H_
+#define PROTOCOL_BINDER_UTIL_H_
+
+#include <stdbool.h>
+#include "protocol_binder_error.h"
+#include "protocol_binder_definition.h"
+#include "protocol_binder.h"
+
+/* protocol binder property managing functions */
+/**
+ * @brief Change protocol
+ * @param[in] pBinder Structure(protocol_binder)
+ * @param[in] protocol Enum value that means specific protocol
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_NOT_DEFINED Invalid parameter(pBinder)
+ * @retval PROTOCOL_BINDER_INVALID_PROTOCOL Invalid parameter(protocol)
+ * @retval PROTOCOL_BINDER_ALREADY_SWITCH_PROTOCOL Operation failed
+ */
+PROTOCOL_BINDER_ERROR switch_protocol(protocol_binder *pBinder, Protocol protocol);
+
+/**
+ * @brief Go back to previous protocol
+ * @param[in] pBinder Structure(protocol_binder)
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_NOT_DEFINED Invalid parameter(pBinder)
+ * @retval PROTOCOL_BINDER_HAS_NO_UNDO_SWITCH_PROTOCOL Operation failed
+ */
+PROTOCOL_BINDER_ERROR undo_switch_protocol(protocol_binder *pBinder);
+
+/* wbxml dom tree building functions */
+/**
+ * @brief Create WBXMLTree using information in protocol_binder structure
+ * @param[in] pBinder Structure(protocol_binder)
+ * @return WBXMLTree on success, NULL on fail
+ */
+WBXMLTree *create_wbxml_tree(const protocol_binder *pBinder);
+
+/**
+ * @brief Add WBXMLTree to WBXMLTreeNode as a subree
+ * @param[in] parent_node WBXMLTreeNode
+ * @param[in] tree WBXMLTree
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_INVALID_INPUT_PARAMETER Invalid parameter(parent_node, tree)
+ * @retval PROTOCOL_BINDER_OUT_OF_MEMORY Out of memory
+ */
+PROTOCOL_BINDER_ERROR add_wbxml_tree_to_wbxml_node(WBXMLTreeNode *parent_node, WBXMLTree *tree);
+
+/**
+ * @brief Set root node of WBXMLTree
+ * @param[in] tree WBXMLTree
+ * @param[in] node WBXMLTreeNode
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_INVALID_INPUT_PARAMETER Invalid parameter(parent_node, tree)
+ * @retval PROTOCOL_BINDER_TREE_ALREADY_HAS_ROOT
+ */
+PROTOCOL_BINDER_ERROR set_wbxml_tree_root(WBXMLTree *tree, WBXMLTreeNode *node);
+
+/**
+ * @brief Create WBXMLTreeNode using XML element name
+ * @param[in] pBinder protocol_binder
+ * @param[in] xml_name XML element name
+ * @return WBXMLTreeNode on success, NULL on fail
+ */
+WBXMLTreeNode *create_wbxml_node_using_xml_name(const protocol_binder *pBinder, const char *xml_name);
+
+/**
+ * @brief Create WBXMLTreeNode using XML element name and XML name space
+ * @param[in] pBinder protocol_binder
+ * @param[in] xml_name XML element name
+ * @param[in] namespace XML name space
+ * @return WBXMLTreeNode on success, NULL on fail
+ */
+WBXMLTreeNode *create_wbxml_node_using_xml_name_and_namespace(const protocol_binder *pBinder, const char *xml_name, const char *namespace);
+
+/**
+ * @brief Create WBXMLTreeNode using XML element name with text content
+ * @param[in] pBinder protocol_binder
+ * @param[in] xml_name XML element name
+ * @param[in] text Content
+ * @param[in] text_len Length of Content
+ * @return WBXMLTreeNode on success, NULL on fail
+ */
+WBXMLTreeNode *create_wbxml_node_using_xml_name_with_text(const protocol_binder *pBinder, const char *xml_name, const char *text, unsigned int text_len);
+
+/**
+ * @brief Create WBXMLTreeNode using XML element name and XML name space with text content
+ * @param[in] pBinder protocol_binder
+ * @param[in] xml_name XML element name
+ * @param[in] namespace XML name space
+ * @param[in] text Content
+ * @param[in] text_len Length of Content
+ * @return WBXMLTreeNode on success, NULL on fail
+ */
+WBXMLTreeNode *create_wbxml_node_using_xml_name_and_namespace_with_text(const protocol_binder *pBinder, const char *xml_name, const char *namespace, const char *text, unsigned int text_len);
+
+/**
+ * @brief Create WBXMLTreeNode using XML element name with cdata content
+ * @param[in] pBinder protocol_binder
+ * @param[in] xml_name XML element name
+ * @param[in] text Content
+ * @param[in] text_len Length of Content
+ * @return WBXMLTreeNode on success, NULL on fail
+ */
+WBXMLTreeNode *create_wbxml_node_using_xml_name_with_cdata(const protocol_binder *pBinder, const char *xml_name, const char *text, unsigned int text_len);
+
+/**
+ * @brief Create WBXMLTreeNode using XML element name, and add WBXMLTreeNode to parent node as a child node
+ * @param[in] pBinder protocol_binder
+ * @param[in] parent_node Parent node
+ * @param[in] xml_name XML element name
+ * @return WBXMLTreeNode on success, NULL on fail
+ */
+WBXMLTreeNode *add_child_wbxml_node_using_xml_name(const protocol_binder *pBinder, WBXMLTreeNode *parent_node, const char *xml_name);
+
+/**
+ * @brief Create WBXMLTreeNode using XML element name and XML name space, and add WBXMLTreeNode to parent node as a child node
+ * @param[in] pBinder protocol_binder
+ * @param[in] parent_node Parent node
+ * @param[in] xml_name XML element name
+ * @param[in] namespace XML name space
+ * @return WBXMLTreeNode on success, NULL on fail
+ */
+WBXMLTreeNode *add_child_wbxml_node_using_xml_name_and_namespace(const protocol_binder *pBinder, WBXMLTreeNode *parent_node, const char *xml_name, const char *namespace);
+
+/**
+ * @brief Create WBXMLTreeNode using XML element name with text content, and add WBXMLTreeNode to parent node as a child node
+ * @param[in] pBinder protocol_binder
+ * @param[in] parent_node Parent node
+ * @param[in] xml_name XML element name
+ * @param[in] text Content
+ * @param[in] text_len Length of Content
+ * @return WBXMLTreeNode on success, NULL on fail
+ */
+WBXMLTreeNode *add_child_wbxml_node_using_xml_name_with_text(const protocol_binder *pBinder, WBXMLTreeNode *parent_node, const char *xml_name, const char *text, unsigned int text_len);
+
+/**
+ * @brief Create WBXMLTreeNode using XML element name and XML name space with text content, and add WBXMLTreeNode to parent node as a child node
+ * @param[in] pBinder protocol_binder
+ * @param[in] parent_node Parent node
+ * @param[in] xml_name XML element name
+ * @param[in] namespace XML name space
+ * @param[in] text Content
+ * @param[in] text_len Length of Content
+ * @return WBXMLTreeNode on success, NULL on fail
+ */
+WBXMLTreeNode *add_child_wbxml_node_using_xml_name_and_namespace_with_text(const protocol_binder *pBinder, WBXMLTreeNode *parent_node, const char *xml_name, const char *namespace, const char *text, unsigned int text_len);
+
+/**
+ * @brief Create WBXMLTreeNode using XML element name with cdata content, and add WBXMLTreeNode to parent node as a child node
+ * @param[in] pBinder protocol_binder
+ * @param[in] parent_node Parent node
+ * @param[in] xml_name XML element name
+ * @param[in] text Content
+ * @param[in] text_len Length of Content
+ * @return WBXMLTreeNode on success, NULL on fail
+ */
+WBXMLTreeNode *add_child_wbxml_node_using_xml_name_with_cdata(const protocol_binder *pBinder, WBXMLTreeNode *parent_node, const char *xml_name, const char *text, unsigned int text_len);
+
+/**
+ * @brief Create WBXMLTreeNode using XML element name with int content, and add WBXMLTreeNode to parent node as a child node
+ * @param[in] pBinder protocol_binder
+ * @param[in] parent_node Parent node
+ * @param[in] xml_name XML element name
+ * @param[in] num Content
+ * @return WBXMLTreeNode on success, NULL on fail
+ */
+WBXMLTreeNode *add_child_wbxml_node_using_xml_name_with_int(const protocol_binder *pBinder, WBXMLTreeNode *parent_node, const char *xml_name, const int num);
+
+/**
+ * @brief Create WBXMLTreeNode using XML element name with int content, and add WBXMLTreeNode to parent node as a child node
+ * @param[in] pBinder protocol_binder
+ * @param[in] parent_node Parent node
+ * @param[in] xml_name XML element name
+ * @param[in] namespace XML name space
+ * @param[in] num Content
+ * @return WBXMLTreeNode on success, NULL on fail
+ */
+WBXMLTreeNode *add_child_wbxml_node_using_xml_name_and_namespace_with_int(const protocol_binder *pBinder, WBXMLTreeNode *parent_node, const char *xml_name, const char *namespace, const int num);
+
+/**
+ * @brief Create WBXMLTreeNode using XML element name with unsigned int content, and add WBXMLTreeNode to parent node as a child node
+ * @param[in] pBinder protocol_binder
+ * @param[in] parent_node Parent node
+ * @param[in] xml_name XML element name
+ * @param[in] num Content
+ * @return WBXMLTreeNode on success, NULL on fail
+ */
+WBXMLTreeNode *add_child_wbxml_node_using_xml_name_with_unsigned_int(const protocol_binder *pBinder, WBXMLTreeNode *parent_node, const char *xml_name, const unsigned int num);
+
+/**
+ * @brief Create WBXMLTreeNode using XML element name and XML name space with unsigned int content, and add WBXMLTreeNode to parent node as a child node
+ * @param[in] pBinder protocol_binder
+ * @param[in] parent_node Parent node
+ * @param[in] xml_name XML element name
+ * @param[in] namespace XML name space
+ * @param[in] num Content
+ * @return WBXMLTreeNode on success, NULL on fail
+ */
+WBXMLTreeNode *add_child_wbxml_node_using_xml_name_and_namespace_with_unsigned_int(const protocol_binder *pBinder, WBXMLTreeNode *parent_node, const char *xml_name, const char *namespace, const unsigned int num);
+
+/**
+ * @brief Add WBXMLTreeNode to parent node as a child node
+ * @param[in] parent Parent node
+ * @param[in] child Child node
+ * @return WBXMLTreeNode on success, NULL on fail
+ */
+bool wbxml_node_add_child_node(WBXMLTreeNode *parent, WBXMLTreeNode *child);
+
+/* wbxml dom tree getter functions */
+
+/**
+ * @brief Get XML element name from WBXMLTreeNode
+ * @param[in] element_node WBXMLTreeNode
+ * @param[out] element_xml_name XML element name
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_TREE_NODE_IS_NOT_ELEMENT_NODE Invalid parameter(element_node)
+ */
+PROTOCOL_BINDER_ERROR get_xml_name_from_element_wbxml_node(const WBXMLTreeNode *element_node, char **element_xml_name);
+
+/**
+ * @brief Get XML name space from WBXMLTreeNode
+ * @param[in] pBinder Reverse_protocol_binder
+ * @param[in] element_node WBXMLTreeNode
+ * @param[out] namespace XML name space
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_TREE_NODE_IS_NOT_ELEMENT_NODE Invalid parameter(element_node)
+ */
+PROTOCOL_BINDER_ERROR get_namespace_from_element_wbxml_node(const Reverse_protocol_binder *pBinder, const WBXMLTreeNode *element_node, char **namespace);
+
+/**
+ * @brief Get pointer of text content from WBXMLTreeNode
+ * @param[in] element_node WBXMLTreeNode
+ * @param[out] text_pointer Pointer of text content
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ */
+PROTOCOL_BINDER_ERROR get_text_pointer_from_wbxml_node(WBXMLTreeNode *element_node, char **text_pointer);
+
+/**
+ * @brief Get pointer of binary content from WBXMLTreeNode
+ * @param[in] element_node WBXMLTreeNode
+ * @param[out] binary_pointer Pointer of binary content
+ * @param[out] binary_size Size of binary content
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_UTIL_NO_BINARY_VALUE Invalid parameter(element_node)
+ */
+PROTOCOL_BINDER_ERROR get_binary_pointer_from_wbxml_node(WBXMLTreeNode *element_node, char **binary_pointer, unsigned int *binary_size);
+
+/**
+ * @brief Get int content from WBXMLTreeNode
+ * @param[in] element_node WBXMLTreeNode
+ * @param[out] value Int content
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_UTIL_NO_INT_VALUE Invalid parameter(element_node)
+ */
+PROTOCOL_BINDER_ERROR get_int_from_wbxml_node(WBXMLTreeNode *element_node, int *value);
+
+/**
+ * @brief Get pointer of text content from WBXMLTreeNode(cdata node)
+ * @param[in] element_node WBXMLTreeNode
+ * @param[out] text_pointer Pointer of text content
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ */
+PROTOCOL_BINDER_ERROR get_text_pointer_from_wbxml_cdata_node(WBXMLTreeNode *element_node, char **text_pointer);
+
+/**
+ * @brief Get pointer of binary content from WBXMLTreeNode(cdata node)
+ * @param[in] element_node WBXMLTreeNode
+ * @param[out] binary_pointer Pointer of binary content
+ * @param[out] binary_size Size of binary content
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_UTIL_NO_BINARY_VALUE Invalid parameter(element_node)
+ */
+PROTOCOL_BINDER_ERROR get_binary_pointer_from_wbxml_cdata_node(WBXMLTreeNode *element_node, char **binary_pointer, unsigned int *binary_size);
+
+#endif /* PROTOCOL_BINDER_UTIL_H_ */
diff --git a/framework/include/NetworkAssistant/protocol_binder/protocol_binder_util_internal.h b/framework/include/NetworkAssistant/protocol_binder/protocol_binder_util_internal.h
new file mode 100755
index 0000000..c5576c3
--- /dev/null
+++ b/framework/include/NetworkAssistant/protocol_binder/protocol_binder_util_internal.h
@@ -0,0 +1,151 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * SeongWon Shim <seongwon.shim@samsung.com>
+ */
+
+#ifndef PROTOCOL_BINDER_UTIL_INTERNAL_H_
+#define PROTOCOL_BINDER_UTIL_INTERNAL_H_
+
+#include "protocol_binder_util.h"
+
+/**
+ * @brief XML document adjusting
+ * @remarks Remove XML header from XML msg
+ * @param[in] Pointer of XML message
+ * @param[in] Length of XML
+ * @return Length of XML after remove header
+ */
+unsigned int remove_xml_header(char *xml, unsigned int xml_len);
+
+/* wbxml related part */
+/**
+ * @brief Validate protocol
+ * @remarks Validate that protocol is supported by portocol binder
+ * @param[in] protocol Enum value that means specific protocol
+ * @return True on success, False on fail
+ */
+bool validate_protocol(Protocol protocol);
+
+/**
+ * @brief Get WBXMLLanguage enum value
+ * @remarks Convert to WBXMLLanguage from Protocol
+ * @param[in] Enum value that means specific protocol
+ * @return WBXMLLanguage enum value on success
+ */
+WBXMLLanguage get_wbxml_language(Protocol protocol);
+
+/**
+ * @brief Get Protocol enum value
+ * @remarks Convert to Protocol from WBXMLLanguage
+ * @param[in] WBXMLLanguage enum value
+ * @return Protocol enum value on success
+ */
+Protocol get_protocol_from_wbxml_lang(WBXMLLanguage wbxml_lang);
+
+/**
+ * @brief Get WBXMLVersion enum value
+ * @remarks Convert to WBXMLVersion from Encoding
+ * @param[in] WBXMLVersion enum value
+ * @return WBXMLVersion enum value on success
+ */
+WBXMLVersion get_wbxml_version(Encoding enc);
+
+/**
+ * @brief Get WBXML tree from WBXML byte stream
+ * @remarks Parse WBXML byte stream and build WBXMLTree
+ * @param[in] byte_stream Byte stream of WBXML message
+ * @param[in] byte_stream_len Length of WBXML message
+ * @param[in] wbxml_lang WBXMLLanguage enum value
+ * @param[out] wbxml_tree WBXMLTree
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_WBXML_PARSE_FAIL Parse failed
+ */
+PROTOCOL_BINDER_ERROR get_wbxml_tree_from_wbxml(char *byte_stream, int byte_stream_len, WBXMLLanguage wbxml_lang, WBXMLTree **wbxml_tree);
+
+/**
+ * @brief Get WBXML tree from XML byte stream
+ * @remarks Parse WBXML byte stream and build WBXMLTree using libwbxml library
+ * @param[in] byte_stream Byte stream of XML message
+ * @param[in] byte_stream_len Length of XML message
+ * @param[in] wbxml_lang WBXMLLanguage enum value
+ * @param[out] wbxml_tree WBXMLTree
+ * @return 0 on success, otherwise a negative error value.
+ * @retval PROTOCOL_BINDER_OK Successful
+ * @retval PROTOCOL_BINDER_WBXML_PARSE_FAIL Parse failed
+ */
+PROTOCOL_BINDER_ERROR get_wbxml_tree_from_xml(char *byte_stream, int byte_stream_len, WBXMLLanguage wbxml_lang, WBXMLTree **wbxml_tree);
+
+/**
+ * @brief Get next WBXMLTreeNode from current WBXMLTreeNode
+ * @remarks if current WBXMLTreeNode's type is
+ * WBXML_TREE_TREE_NODE(WBXMLTree has a subtree as a tree node),
+ * use this API to get next WBXMLTreeNode of subtree
+ * @param[in] node Current WBXMLTreeNode
+ * @param[out] first_visit Whether first visit for this tree node or not
+ * @return WBXMLTreeNode on success
+ */
+WBXMLTreeNode *get_next_node_of_tree_node(WBXMLTreeNode *node, bool *first_visit);
+
+/**
+ * @brief Get next WBXMLTreeNode from current WBXMLTreeNode
+ * @remarks if current WBXMLTreeNode's type is not WBXML_TREE_TREE_NODE,
+ * use this API to get next WBXMLTreeNode of current WBXMLTreeNode
+ * @param[in] node Current WBXMLTreeNode
+ * @param[out] first_visit Whether first visit for this tree node or not
+ * @return WBXMLTreeNode on success
+ */
+WBXMLTreeNode *get_next_node_of_element_node(WBXMLTreeNode *node, bool *first_visit);
+
+/**
+ * @brief Get WBXMLLangEntry of subtree
+ * @param[in] pReverse_binder Reverse_protocol_binder
+ * @return WBXMLLangEntry on success
+ */
+const WBXMLLangEntry *get_current_subtree_lang(Reverse_protocol_binder *pReverse_binder);
+
+/**
+ * @brief whether node has a same type as inputted type
+ * @param[in] node WBXMLTreeNode
+ * @param[in] type WBXMLTreeNodeType
+ * @return true is node has a type which is inputted, false is not
+ */
+bool has_wbxml_node_same_type(WBXMLTreeNode *node, WBXMLTreeNodeType type);
+
+/**
+ * @brief print XML from current WBXMLTree
+ * @param[in] tree WBXMLTree
+ */
+void print_wbxml_dom_in_xml(const WBXMLTree *tree);
+
+#endif /* PROTOCOL_BINDER_UTIL_INTERNAL_H_ */
diff --git a/framework/include/PlatformMonitor/EXT_PMCI.h b/framework/include/PlatformMonitor/EXT_PMCI.h
new file mode 100755
index 0000000..69d7a0c
--- /dev/null
+++ b/framework/include/PlatformMonitor/EXT_PMCI.h
@@ -0,0 +1,162 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef EXT_PMCI_H_
+#define EXT_PMCI_H_
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "EXT_PMCI_Common.h"
+
+/**
+ * @file EXT_PMCI.h
+ * @brief Defines service platform notification APIs
+ */
+
+/**
+ * @brief Destroy default platform notification
+ * @remarks Network notification is only supported currently
+ * @param[in] pm_plugIn_id PlatformMonitor PlugIn ID
+ * @return Operation result
+ * @retval PMCI_SUCCESS Successful
+ * @retval PMCI_FAIL Operation failed
+ */
+PMCI_RETURN PMCI_Destroy_Default_Noti_Types(int pm_plugIn_id);
+
+/**
+ * @brief Prototype of callback function for platform notification
+ * @remarks This callback function must be implemented by user
+ * @param[out] item_id Item id (It is only used in ALARM service)
+ * @param[out] user_data Data that is passed to the user
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ * @see EXT_PMCI_Struct.h
+ */
+typedef int (*SPECIFIC_TYPE_CALLBACK) (int item_id, void *user_data);
+
+/**
+ * @brief Initialize specific platform notification
+ * @remarks Connect to the service and register user notification callback function to the service
+ * @param[in] pm_plugIn_id PlatformMonitor PlugIn ID
+ * @param[in] noti_type Platform notification type defined in FW_PLATFORM_NOTI_TYPE
+ * @param[in] pkg_name Package name (ex> com.samsung.test)
+ * @param[in] user_data Some data for passing to the service
+ * @param[in] callback_cnt The number of callback functions
+ * @param[in] ... Variable number of callback functions (type : 'SPECIFIC_TYPE_CALLBACK')
+ * @return Operation result
+ * @retval PMCI_SUCCESS Successful
+ * @retval PMCI_FAIL Operation failed
+ * @see EXT_PMCI_Noti.h
+ *
+ * @code
+
+1. noti_type : NETWORK
+
+int network_on_callback(int item_id, void *user_data);
+int network_off_callback(int item_id, void *user_data);
+PMCI_RETURN ret = PMCI_Init_Specific_Type(1, NETWORK, NULL, NULL, 2, network_on_callback, network_off_callback);
+
+2. noti_type : SAN
+
+int san_incoming_callback(int item_id, void *user_data);
+int san_operation_callback(int item_id, void *user_data);
+PMCI_RETURN ret = PMCI_Init_Specific_Type(1, SAN, NULL, NULL, 2, san_incoming_callback, san_operation_callback);
+
+3. noti_type : ALARM
+
+int alarm_callback(int item_id, void *user_data);
+PMCI_RETURN ret = PMCI_Init_Specific_Type(1, ALARM, "package_name", NULL, 1, alarm_callback);
+
+ * @endcode
+ */
+PMCI_RETURN PMCI_Init_Specific_Type(int pm_plugIn_id, FW_SERVICE_NOTI_TYPE noti_type, const char *pkg_name, const char *user_data, int callback_cnt, ...);
+
+/**
+ * @brief Unregister user notification callback function that was previously registered to the service and disconnect to the service
+ * @param[in] pm_plugIn_id PlatformMonitor PlugIn ID
+ * @param[in] noti_type Platform notification type defined in FW_PLATFORM_NOTI_TYPE
+ * @return Operation result
+ * @retval PMCI_SUCCESS Successful
+ * @retval PMCI_FAIL Operation failed
+ * @pre The application should be called PMCI_Init_Specific_Type() and returned PMCI_SUCCESS
+ * @see EXT_PMCI_Noti.h
+ */
+PMCI_RETURN PMCI_Destory_Specific_Type(int pm_plugIn_id, FW_SERVICE_NOTI_TYPE noti_type);
+
+/**
+ * @brief Add item to the service that was previously initialized by user using 'PMCI_Init_Specific_Type()'
+ * @param[in] pm_plugIn_id PlatformMonitor PlugIn ID
+ * @param[in] noti_type Platform notification type defined in FW_PLATFORM_NOTI_TYPE
+ * @param[in] add_item Item to add to the service
+ * @param[out] out_add_item_id Id of the newly Item added to the service
+ * @return Operation result
+ * @retval PMCI_SUCCESS Successful
+ * @retval PMCI_FAIL Operation failed
+ * @pre The application should be called PMCI_Init_Specific_Type() and returned PMCI_SUCCESS
+ * @see EXT_PMCI_Noti.h, EXT_PMCI_Struct.h
+ */
+PMCI_RETURN PMCI_Add_Item_To_Specific_Type(int pm_plugIn_id, FW_SERVICE_NOTI_TYPE noti_type, void *add_item, int *out_add_item_id);
+
+/**
+ * @brief Remove item from the service
+ * @param[in] pm_plugIn_id PlatformMonitor PlugIn ID
+ * @param[in] noti_type Platform notification type defined in FW_PLATFORM_NOTI_TYPE
+ * @param[in] remove_item_id Id of Item that user want to remove from service
+ * @return Operation result
+ * @retval PMCI_SUCCESS Successful
+ * @retval PMCI_FAIL Operation failed
+ * @pre The application should be called PMCI_Init_Specific_Type() and returned PMCI_SUCCESS
+ * @see EXT_PMCI_Noti.h
+ */
+PMCI_RETURN PMCI_Remove_Item_To_Specific_Type(int pm_plugIn_id, FW_SERVICE_NOTI_TYPE noti_type, int remove_item_id);
+
+/**
+ * @brief Get item that user want to know from the service
+ * @param[in] pm_plugIn_id PlatformMonitor PlugIn ID
+ * @param[in] noti_type Platform notification type defined in FW_PLATFORM_NOTI_TYPE
+ * @param[in] get_item_id Id of the item that user want to know
+ * @param[out] out_get_item Item that user want to know
+ * @return Operation result
+ * @retval PMCI_SUCCESS Successful
+ * @retval PMCI_FAIL Operation failed
+ * @pre The application should be called PMCI_Init_Specific_Type() and returned PMCI_SUCCESS
+ * @see EXT_PMCI_Noti.h, EXT_PMCI_Struct.h
+ */
+PMCI_RETURN PMCI_Get_Item_To_Specific_Type(int pm_plugIn_id, FW_SERVICE_NOTI_TYPE noti_type, int get_item_id, void **out_get_item);
+
+#endif /* EXT_PMCI_H_ */
diff --git a/framework/include/PlatformMonitor/EXT_PMCI_Common.h b/framework/include/PlatformMonitor/EXT_PMCI_Common.h
new file mode 100755
index 0000000..f48a053
--- /dev/null
+++ b/framework/include/PlatformMonitor/EXT_PMCI_Common.h
@@ -0,0 +1,47 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef EXT_PMCI_COMMON_H_
+#define EXT_PMCI_COMMON_H_
+
+#include "EXT_PMCI_Errors.h"
+#include "EXT_PMCI_Noti.h"
+
+/**
+ * @file EXT_PMCI_Common.h
+ * @brief Includes header files needed for using PMCI APIs
+ */
+
+#endif /* EXT_PMCI_COMMON_H_ */
diff --git a/framework/include/PlatformMonitor/EXT_PMCI_Errors.h b/framework/include/PlatformMonitor/EXT_PMCI_Errors.h
new file mode 100755
index 0000000..cf2d5cb
--- /dev/null
+++ b/framework/include/PlatformMonitor/EXT_PMCI_Errors.h
@@ -0,0 +1,52 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef EXT_PMCI_ERRORS_H_
+#define EXT_PMCI_ERRORS_H_
+
+/**
+ * @file EXT_PMCI_Errors.h
+ * @brief Defines PMCI errors
+ */
+
+/**
+ * @brief Enumerations for the PMCI error
+ */
+typedef enum {
+ PMCI_SUCCESS,
+ PMCI_FAIL,
+} PMCI_RETURN;
+
+#endif /* EXT_PMCI_ERRORS_H_ */
diff --git a/framework/include/PlatformMonitor/EXT_PMCI_Noti.h b/framework/include/PlatformMonitor/EXT_PMCI_Noti.h
new file mode 100755
index 0000000..14d3c30
--- /dev/null
+++ b/framework/include/PlatformMonitor/EXT_PMCI_Noti.h
@@ -0,0 +1,53 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef EXT_PMCI_NOTI_H_
+#define EXT_PMCI_NOTI_H_
+
+/**
+ * @file EXT_PMCI_Noti.h
+ * @brief Defines notification types provided by sync-agent-framework
+ */
+
+/**
+ * @brief Enumerations for the Service notification type
+ */
+typedef enum {
+ NETWORK,
+ SAN, /* Server Alert Notification */
+ ALARM,
+} FW_SERVICE_NOTI_TYPE;
+
+#endif /* EXT_PMCI_NOTI_H_ */
diff --git a/framework/include/PlatformMonitor/EXT_PMCI_Struct.h b/framework/include/PlatformMonitor/EXT_PMCI_Struct.h
new file mode 100755
index 0000000..c114b3f
--- /dev/null
+++ b/framework/include/PlatformMonitor/EXT_PMCI_Struct.h
@@ -0,0 +1,130 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef EXT_PMCI_STRUCT_H_
+#define EXT_PMCI_STRUCT_H_
+
+#include <time.h>
+
+/**
+ * @file EXT_PMCI_Struct.h
+ * @brief Defines enumerations & structures for PMCI
+ */
+
+#define DAY_CNT 7
+
+/**
+ * @brief Enumerations for the day type
+ */
+typedef enum {
+ DAY_NO_TYPE = 0x00,
+ DAY_SUN = 0x01,
+ DAY_MON = 0x02,
+ DAY_TUE = 0x04,
+ DAY_WED = 0x08,
+ DAY_THU = 0x10,
+ DAY_FRI = 0x20,
+ DAY_SAT = 0x40
+} PMCI_DAY_TYPE;
+
+/**
+ * @brief Enumerations for the repeat type
+ */
+typedef enum {
+ REPEAT_NO_TYPE = 0,
+ ONCE = 1,
+ REPEAT,
+ REPEAT_WEEKLY,
+ REPEAT_MONTHLY,
+ REPEAT_ANNUALLY,
+} PMCI_REPEAT_TYPE;
+
+/**
+ * @brief Alarm structure provided by sync-agent-framework
+ * @see PMCI_Add_Item_To_Specific_Type(), SPECIFIC_TYPE_CALLBACK
+ */
+typedef struct {
+ /* start alarm time : time to start alarm at first.
+ * format: 2011-01-02T15:13:02Z
+ */
+ char *start_alarm_time;
+
+ /* repeat type */
+ PMCI_REPEAT_TYPE repeat_type;
+
+ /* repeat value
+ * 1) repeat_type: ONCE => repeat_value: do not mean
+ * 1) repeat_type: REPEAT => repeat_value: interval time (second)
+ * 2) repeat_type: etc => repeat_value: PMCI_DAY_TYPE
+ */
+ int repeat_value;
+
+ int isDisposable;
+} pmci_alarm_t;
+
+/**
+ * @brief Incoming data (SAN) structure provided by sync-agent-framework
+ * @remarks Notification data for 'SAN Incoming' operation
+ * @see SPECIFIC_TYPE_CALLBACK
+ */
+typedef struct {
+ const char *msgBody;
+ unsigned int msgSize;
+ int version;
+} pmci_san_incoming_t;
+
+/**
+ * @brief Operation data (SAN) structure provided by sync-agent-framework
+ * @remarks Notification data for 'SAN Operation' operation
+ * @see SPECIFIC_TYPE_CALLBACK
+ */
+typedef struct {
+ int msgId;
+ int extId;
+ void *user_param;
+} pmci_san_operation_t;
+
+/**
+ * @brief Message data (SAN) structure provided by sync-agent-framework
+ * @see PMCI_Add_Item_To_Specific_Type()
+ */
+/* SAN (send message) fw struct */
+typedef struct {
+ int extId;
+ int pinCode;
+ char *msgData;
+} pmci_san_message_t;
+
+#endif /* EXT_PMCI_STRUCT_H_ */
diff --git a/framework/include/PlugIn/DataConverter_Resource.h b/framework/include/PlugIn/DataConverter_Resource.h
new file mode 100644
index 0000000..1022db1
--- /dev/null
+++ b/framework/include/PlugIn/DataConverter_Resource.h
@@ -0,0 +1,65 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef DATACONVERTER_RESOURCE_H_
+#define DATACONVERTER_RESOURCE_H_
+
+/**
+ * @file DataConverter_Resource.h
+ * @brief Support to share structure DataConverter plugIn with F/W
+ */
+
+/**
+ * @brief Structure of Converter plugin's object's field - linked list
+ */
+struct Field_Info {
+ char *field_name; /**< field name */
+ int field_child_cnt; /**< field's child count */
+ struct Field_Info *field_child_list; /**< next field info node */
+};
+
+/**
+ * @brief Structure of Converter plugin's Object info
+ */
+typedef struct {
+ char *type; /**< object type */
+ char *version; /**< object version */
+ int field_cnt; /**< field count */
+ struct Field_Info *field_list; /**< real field list **/
+} Object_Info;
+
+typedef struct Field_Info Field_Info;
+
+#endif /* DATACONVERTER_RESOURCE_H_ */
diff --git a/framework/include/PlugIn/PlatformMonitor_Resource.h b/framework/include/PlugIn/PlatformMonitor_Resource.h
new file mode 100644
index 0000000..5965347
--- /dev/null
+++ b/framework/include/PlugIn/PlatformMonitor_Resource.h
@@ -0,0 +1,57 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef PLATFORMMONITOR_RESOURCE_H_
+#define PLATFORMMONITOR_RESOURCE_H_
+
+#ifdef dnet
+ typedef int (*CALLBACK_NETWORK_STATUS) (int dev_network_status, int fw_network_status, char *proxy, char *ip);
+#endif
+
+typedef int (*CALLBACK_NETWORK_STATUS) (int protocol_type, int fw_network_status, int fw_network_type, char *proxy, char *ip);
+
+typedef int (*CALLBACK_NETWORK_CANCEL) (int protocol_type);
+
+typedef int (*CALLBACK_SYNCML_SAN_INCOMING) (int item_id, void *user_data);
+
+typedef int (*CALLBACK_SYNCML_SAN_OPERATION) (int item_id, void *user_data);
+
+typedef int (*CALLBACK_ALARM) (int alarm_id, void *user_data);
+
+typedef int (*CALLBACK_NETWORK_ON) (int item_id, void *user_data);
+
+typedef int (*CALLBACK_NETWORK_OFF) (int item_id, void *user_data);
+
+#endif /* PLATFORMMONITOR_RESOURCE_H_ */
diff --git a/framework/include/PlugIn/PlugIn_Account.h b/framework/include/PlugIn/PlugIn_Account.h
new file mode 100755
index 0000000..5daeafb
--- /dev/null
+++ b/framework/include/PlugIn/PlugIn_Account.h
@@ -0,0 +1,101 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef PLUGIN_ACCOUNT_H_
+#define PLUGIN_ACCOUNT_H_
+
+#include "PlugIn_Error.h"
+#include "PlugIn_Struct.h"
+
+typedef void (*Set_AccountReposioryName) (const char *agent_name);
+
+typedef void (*Add_PlatformAccount) (int fw_account_id, char *email, char *password, int create_mode);
+
+typedef void (*Set_PlatformAccount_Service) (int fw_account_id, int service_type, int service_account_id);
+
+typedef void (*Del_PlatformAccount) (int fw_account_id);
+
+typedef void (*Del_PlatformAccount_Service) (int fw_account_id, int service_type);
+
+typedef int (*Has_PlatformAccount_Service) (int fw_account_id, int service_type);
+
+typedef int (*Get_Service_AccountID) (int service_type, int fw_account_id);
+
+typedef int (*Get_FW_AccountID) (int service_type, int service_account_id, int index);
+
+typedef void *(*Get_Service_AccountInfo) (int fw_account_id, int service_type);
+
+typedef struct {
+ Set_AccountReposioryName pFunc_Set_AccountReposioryName;
+ Add_PlatformAccount pFunc_Add_PlatformAccount;
+ Set_PlatformAccount_Service pFunc_Set_PlatformAccount_Service;
+ Del_PlatformAccount pFunc_Del_PlatformAccount;
+ Del_PlatformAccount_Service pFunc_Del_PlatformAccount_Service;
+ Has_PlatformAccount_Service pFunc_Has_PlatformAccount_Service;
+ Get_Service_AccountID pFunc_Get_Service_AccountID;
+ Get_FW_AccountID pFunc_Get_FW_AccountID;
+ Get_Service_AccountInfo pFunc_Get_Service_AccountInfo;
+} Account_Func_Set;
+
+typedef struct {
+ PlugIn_Info_t plugIn_info;
+ Account_Func_Set func_Set;
+} PlugIn_Account;
+
+Account_Func_Set getAccount_Func_Set(void *plugIn_handle, PLUGIN_ERROR * error_code);
+
+PLUGIN_ERROR registerPlugIn_Account(PlugIn_Account plugIn);
+
+int getAccount_PlugIn_ID();
+
+Set_AccountReposioryName getFunction_Set_AccountReposioryName(int plugIn_id);
+
+Add_PlatformAccount getFunction_Account_Add_PlatformAccount(int plugIn_id);
+
+Set_PlatformAccount_Service getFunction_Set_PlatformAccount_Service(int plugIn_id);
+
+Del_PlatformAccount getFunction_Account_Del_PlatformAccount(int plugIn_id);
+
+Del_PlatformAccount_Service getFunction_Account_Del_PlatformAccount_Service(int plugIn_id);
+
+Has_PlatformAccount_Service getFunction_Account_Has_PlatformAccount_Service(int plugIn_id);
+
+Get_Service_AccountID getFunction_Account_Get_Service_AccountID(int plugIn_id);
+
+Get_FW_AccountID getFunction_Account_Get_FW_AccountID(int plugIn_id);
+
+Get_Service_AccountInfo getFunction_Get_Service_AccountInfo(int plugIn_id);
+
+#endif /* PLUGIN_ACCOUNT_H_ */
diff --git a/framework/include/PlugIn/PlugIn_DataConnector.h b/framework/include/PlugIn/PlugIn_DataConnector.h
new file mode 100755
index 0000000..3e780e3
--- /dev/null
+++ b/framework/include/PlugIn/PlugIn_DataConnector.h
@@ -0,0 +1,206 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef PLUGIN_DATACONNECTOR_H_
+#define PLUGIN_DATACONNECTOR_H_
+
+#include "PlugIn_Error.h"
+#include "PlugIn_Struct.h"
+#include "PlugIn_Interface/DataConnector_Resource.h"
+#include "DataAdapter/EXT_DACI_Errors.h"
+
+#define MAX_PLUGIN_DATACONNECTOR 20
+
+typedef DACI_RETURN(*Service_Open) (void);
+typedef DACI_RETURN(*Service_Close) (void);
+typedef DACI_RETURN(*Begin_Transaction) (void);
+typedef DACI_RETURN(*End_Transaction) (int is_success);
+
+typedef DACI_RETURN(*ADD_ITEM) (int account_ID, char *folder_id, void *data, char **item_id);
+typedef DACI_RETURN(*UPDATE_ITEM) (int account_ID, char *folder_id, char *item_id, void *data);
+typedef DACI_RETURN(*DEL_ITEM) (int account_ID, char *folder_id, char *item_id);
+typedef DACI_RETURN(*DEL_ALL_ITEMS) (int account_ID);
+typedef DACI_RETURN(*GET_ITEM) (int account_ID, char *folder_id, char *item_id, void **data);
+typedef DACI_RETURN(*ADD_FOLDER) (int account_ID, const char *folder_name, int folder_type, char **folder_id);
+typedef DACI_RETURN(*DEL_FOLDER) (int account_ID, const char *folder_id);
+typedef DACI_RETURN(*GET_FOLDER) (int account_ID, const char *folder_id, char **folder_name, int *folder_type);
+typedef DACI_RETURN(*EXECUTE) (int account_ID, const char *execute_key, void *execute_values, void **result);
+typedef int (*GET_USED_ITEM_COUNT) ();
+typedef int (*GET_USED_COUNT_FOR_FOLDER) (int account_ID, const char *folder_id);
+typedef DACI_RETURN(*WRITE_ITEMS_TO_FILE) (int account_ID, char **file_path);
+typedef DACI_RETURN(*ADD_FILE_WROTE_ITEMS_TO_DATASTORE) (int account_ID, const char *file_path);
+
+typedef char **(*GET_FOLDER_ID_LIST) (int account_ID, int *folder_count, int **folder_type_list);
+typedef int *(*GET_ACCOUNT_ID_LIST) (int *count);
+typedef Item_Node *(*GET_CHANED_ITEM_FOR_FOLDER_ADD) (int account_ID, const char *folder_id, int chagepoint, int *changeCount);
+typedef Item_Node *(*GET_CHANED_ITEM_FOR_FOLDER_DEL) (int account_ID, const char *folder_id, int chagepoint, int *changeCount);
+typedef Item_Node *(*GET_CHANED_ITEM_FOR_FOLDER_UPDATE) (int account_ID, const char *folder_id, int chagepoint, int *changeCount);
+
+typedef int (*GET_LAST_CHANGEPOINT) ();
+typedef void (*StartListening_ChangeNoti) (void *filter_flag);
+typedef void (*SetCallBack_AddItem) (CALLBACK_ADD_ITEM callback);
+typedef void (*SetCallBack_DeleteItem) (CALLBACK_DEL_ITEM callback);
+typedef void (*SetCallBack_UpdateItem) (CALLBACK_UPDATE_ITEM callback);
+typedef void (*SetCallBack_GetAccountIDList) (GET_ACCOUNTIDLIST callback);
+
+/********************* Get Meta Info ******************/
+typedef int (*GET_MAX_ITEM_COUNT) (int folder_type);
+typedef int (*GET_MAX_FIELD_LENGTH) (int field_name, int child_field_name);
+typedef int (*GET_MAX_FIELD_COUNT) (int field_name, int child_field_name);
+typedef int (*GET_FIELD_VALUE) (int field_name, int child_field_name, char **str_val, int *num_val1, int *num_val2);
+typedef int (*GET_IS_SUPPORT_FEATURE) (int feature);
+
+typedef struct {
+ Service_Open pFunc_Service_Open;
+ Service_Close pFunc_Service_Close;
+ Begin_Transaction pFunc_Begin_Transaction;
+ End_Transaction pFunc_End_Transaction;
+ ADD_ITEM pFunc_ADD_ITEM;
+ UPDATE_ITEM pFunc_UPDATE_ITEM;
+ DEL_ITEM pFunc_DEL_ITEM;
+ DEL_ALL_ITEMS pFunc_DEL_ALL_ITEMS;
+ GET_ITEM pFunc_GET_ITEM;
+ ADD_FOLDER pFunc_ADD_FOLDER;
+ DEL_FOLDER pFunc_DEL_FOLDER;
+ GET_FOLDER pFunc_GET_FOLDER;
+ EXECUTE pFunc_EXECUTE;
+ GET_USED_ITEM_COUNT pFunc_GET_USED_ITEM_CNT;
+ GET_USED_COUNT_FOR_FOLDER pFunc_GET_USED_CNT_FOR_FOLDER;
+ WRITE_ITEMS_TO_FILE pFunc_WRITE_ITEMS_TO_FILE;
+ ADD_FILE_WROTE_ITEMS_TO_DATASTORE pFunc_ADD_FILE_WROTE_ITEMS_TO_DATASTORE;
+
+ GET_FOLDER_ID_LIST pFunc_GET_FOLDER_ID_LIST;
+ GET_ACCOUNT_ID_LIST pFunc_GET_ACCOUNT_ID_LIST;
+ GET_CHANED_ITEM_FOR_FOLDER_ADD pFunc_GET_CHANED_ITEM_FOR_FOLDER_ADD;
+ GET_CHANED_ITEM_FOR_FOLDER_DEL pFunc_GET_CHANED_ITEM_FOR_FOLDER_DEL;
+ GET_CHANED_ITEM_FOR_FOLDER_UPDATE pFunc_GET_CHANED_ITEM_FOR_FOLDER_UPDATE;
+ GET_LAST_CHANGEPOINT pFunc_GET_LAST_CHANGEPOINT;
+ StartListening_ChangeNoti pFunc_StartListening_ChangeNoti;
+ SetCallBack_AddItem pFunc_SetCallBack_AddItem;
+ SetCallBack_DeleteItem pFunc_setCallBack_DeleteItem;
+ SetCallBack_UpdateItem pFunc_setCallBack_UpdateItem;
+ SetCallBack_GetAccountIDList pFunc_SetCallBack_GetAccountIDList;
+ GET_MAX_ITEM_COUNT pFunc_GET_MAX_ITEM_COUNT;
+ GET_MAX_FIELD_LENGTH pFunc_GET_MAX_FIELD_LENGTH;
+ GET_MAX_FIELD_COUNT pFunc_GET_MAX_FIELD_COUNT;
+ GET_FIELD_VALUE pFunc_GET_FIELD_VALUE;
+ GET_IS_SUPPORT_FEATURE pFunc_GET_IS_SUPPORT_FEATURE;
+} DataConnector_Func_Set;
+
+typedef struct {
+ PlugIn_Info_t plugIn_info;
+ DataConnector_Func_Set func_set;
+ int data_converter_id;
+ int handle_changenoti;
+ int use_mainloop;
+} PlugIn_DataConnector;
+
+DataConnector_Func_Set getDataConnector_Func_Set(void *plugIn_handle, PLUGIN_ERROR * error_code);
+
+PLUGIN_ERROR registerPlugIn_DataConnector(PlugIn_DataConnector plugIn);
+
+const PlugIn_DataConnector *getDataConnector_PlugInRepository(int *count);
+
+int getDataConverter_PlugIn_ID(int dc_plugIn_id);
+
+int *get_DataConnector_PlugIn_ID_List(int *count);
+
+Service_Open getFunction_DataConnector_Service_Open(int plugIn_id);
+
+Service_Close getFunction_DataConnector_Service_Close(int plugIn_id);
+
+Begin_Transaction getFunction_DataConnector_Begin_Transaction(int plugIn_id);
+
+End_Transaction getFunction_DataConnector_End_Transaction(int plugIn_id);
+
+ADD_ITEM getFunction_DataConnector_ADD_ITEM(int plugIn_id);
+
+UPDATE_ITEM getFunction_DataConnector_UPDATE_ITEM(int plugIn_id);
+
+DEL_ITEM getFunction_DataConnector_DEL_ITEM(int plugIn_id);
+
+DEL_ALL_ITEMS getFunction_DataConnector_DEL_ALL_ITEMS(int plugIn_id);
+
+GET_ITEM getFunction_DataConnector_GET_ITEM(int plugIn_id);
+
+ADD_FOLDER getFunction_DataConnector_ADD_FOLDER(int plugIn_id);
+
+DEL_FOLDER getFunction_DataConnector_DEL_FOLDER(int plugIn_id);
+
+GET_FOLDER getFunction_DataConnector_GET_FOLDER(int plugIn_id);
+
+EXECUTE getFunction_DataConnector_EXECUTE(int plugIn_id);
+
+GET_USED_ITEM_COUNT getFunction_DataConnector_GET_USED_ITEM_COUNT(int plugIn_id);
+
+GET_USED_COUNT_FOR_FOLDER getFunction_DataConnector_GET_USED_COUNT_FOR_FOLDER(int plugIn_id);
+
+GET_FOLDER_ID_LIST getFunction_DataConnector_GET_FOLDER_ID_LIST(int plugIn_id);
+
+GET_ACCOUNT_ID_LIST getFunction_DataConnector_GET_ACCOUNT_ID_LIST(int plugIn_id);
+
+WRITE_ITEMS_TO_FILE getFunction_DataConnector_WRITE_ITEMS_TO_FILE(int plugIn_id);
+
+ADD_FILE_WROTE_ITEMS_TO_DATASTORE getFunction_DataConnector_ADD_FILE_WROTE_ITEM_TO_DATASTORE(int plugIn_id);
+
+GET_CHANED_ITEM_FOR_FOLDER_ADD getFunction_DataConnector_GET_CHANED_ITEM_FOR_FOLDER_ADD(int plugIn_id);
+
+GET_CHANED_ITEM_FOR_FOLDER_DEL getFunction_DataConnector_GET_CHANED_ITEM_FOR_FOLDER_DEL(int plugIn_id);
+
+GET_CHANED_ITEM_FOR_FOLDER_UPDATE getFunction_DataConnector_GET_CHANED_ITEM_FOR_FOLDER_UPDATE(int plugIn_id);
+
+GET_LAST_CHANGEPOINT getFunction_DataConnector_GET_LAST_CHANGEPOINT(int plugIn_id);
+
+StartListening_ChangeNoti getFunction_DataConnector_StartListening_ChangeNoti(int plugIn_id);
+
+SetCallBack_AddItem getFunction_DataConnector_SetCallBack_AddItem(int plugIn_id);
+
+SetCallBack_DeleteItem getFunction_DataConnector_SetCallBack_DeleteItem(int plugIn_id);
+
+SetCallBack_UpdateItem getFunction_DataConnector_SetCallBack_UpdateItem(int plugIn_id);
+
+SetCallBack_GetAccountIDList getFunction_DataConnector_SetCallBack_GetAccountIDList(int plugIn_id);
+
+GET_MAX_ITEM_COUNT getFunction_DataConnector_GET_MAX_ITEM_COUNT(int plugIn_id);
+
+GET_MAX_FIELD_LENGTH getFunction_DataConnector_GET_MAX_FIELD_LENGTH(int plugIn_id);
+
+GET_MAX_FIELD_COUNT getFunction_DataConnector_GET_MAX_FIELD_COUNT(int plugIn_id);
+
+GET_FIELD_VALUE getFunction_DataConnector_GET_FIELD_VALUE(int plugIn_id);
+
+GET_IS_SUPPORT_FEATURE getFunction_DataConnector_GET_IS_SUPPORT_FEATURE(int plugIn_id);
+
+#endif /* PLUGIN_DATACONNECTOR_H_ */
diff --git a/framework/include/PlugIn/PlugIn_DataConverter.h b/framework/include/PlugIn/PlugIn_DataConverter.h
new file mode 100755
index 0000000..0145e25
--- /dev/null
+++ b/framework/include/PlugIn/PlugIn_DataConverter.h
@@ -0,0 +1,96 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef PLUGIN_DATACONVERTER_H_
+#define PLUGIN_DATACONVERTER_H_
+
+#include "PlugIn_Struct.h"
+#include "PlugIn_Error.h"
+#include "DataAdapter/EXT_DACI_Errors.h"
+#include "DataConverter_Resource.h"
+
+#define MAX_PLUGIN_DATACONVERTER 10
+
+typedef DACI_RETURN(*Converter) (const void *agent_data, void **service_data);
+typedef DACI_RETURN(*Replace_Converter) (void *old_service_data, const void *agent_data, void **new_service_data);
+typedef DACI_RETURN(*Reverse_Converter) (void *service_data, void **agent_data);
+
+typedef void *(*Alloc_Object) ();
+typedef int (*Free_Object) (void *in_object);
+typedef void *(*Set_Value) (void *in_object, int key, char *extension_key, void *set_value);
+typedef void *(*Get_Value) (void *in_object, int key, char *extension_key);
+typedef Object_Info *(*Get_Obj_Info) ();
+typedef int (*Free_Obj_Info) (Object_Info *obj_info);
+
+typedef struct {
+ Converter pFunc_Converter;
+ Replace_Converter pFunc_Replace_Converter;
+ Reverse_Converter pFunc_Reverse_Converter;
+ Alloc_Object pFunc_Alloc_Object;
+ Free_Object pFunc_Free_Object;
+ Set_Value pFunc_Set_Value;
+ Get_Value pFunc_Get_Value;
+ Get_Obj_Info pFunc_Get_Obj_Info;
+ Free_Obj_Info pFunc_Free_Obj_Info;
+} DataConverter_Func_Set;
+
+typedef struct {
+ PlugIn_Info_t plugIn_info;
+ DataConverter_Func_Set func_Set;
+} PlugIn_DataConverter;
+
+DataConverter_Func_Set getDataConverter_Func_Set(void *plugIn_handle, PLUGIN_ERROR * error_code);
+
+PLUGIN_ERROR registerPlugIn_DataConverter(PlugIn_DataConverter plugIn);
+
+Converter getFunction_DataConverter_Converter(int plugIn_id);
+
+Replace_Converter getFunction_DataConverter_Replace_Converter(int plugIn_id);
+
+Reverse_Converter getFunction_DataConverter_Reverse_Converter(int plugIn_id);
+
+Alloc_Object getFunction_DataConverter_Alloc_Object(int plugIn_id);
+
+Free_Object getFunction_DataConverter_Free_Object(int plugIn_id);
+
+Set_Value getFunction_DataConverter_Set_Value_To_Object(int plugIn_id);
+
+Get_Value getFunction_DataConverter_Get_Value_To_Object(int plugIn_id);
+
+Get_Obj_Info getFunction_DataConverter_Get_Obj_Info(int plugIn_id);
+
+Free_Obj_Info getFunction_DataConverter_Free_Obj_Info(int plugIn_id);
+
+#endif /* PLUGIN_DATACONVERTER_H_ */
diff --git a/framework/include/PlugIn/PlugIn_DeviceInfo.h b/framework/include/PlugIn/PlugIn_DeviceInfo.h
new file mode 100755
index 0000000..cde45ee
--- /dev/null
+++ b/framework/include/PlugIn/PlugIn_DeviceInfo.h
@@ -0,0 +1,84 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef PLUGIN_DEVICEINFO_H_
+#define PLUGIN_DEVICEINFO_H_
+
+#include <glib.h>
+
+#include "PlugIn_Struct.h"
+#include "PlugIn_Error.h"
+#include "Device/EXT_DCI_DevExecutor.h"
+
+#define MAX_PLUGIN_DEVICEINFO 10
+
+typedef int (*Load_DevInfo) (GList **devInfo);
+typedef int (*Get_DevInfo) (GList *devInfo, char *info_name, char **value);
+typedef int (*Clear_DevInfo) (GList **devInfo);
+typedef int (*PM_Lock_State) (PM_State state, PM_Lock_State_Flag flag, unsigned int timeout);
+typedef int (*PM_Unlock_State) (PM_State state, PM_Unlock_State_Flag flag);
+
+typedef struct {
+ Load_DevInfo pFunc_Load_DevInfo;
+ Get_DevInfo pFunc_Get_DevInfo;
+ Clear_DevInfo pFunc_Clear_DevInfo;
+
+ /* execute function */
+ PM_Lock_State pFunc_PM_Lock_State;
+ PM_Unlock_State pFunc_PM_Unlock_State;
+} DeviceInfo_Func_Set;
+
+typedef struct {
+ PlugIn_Info_t plugIn_info;
+ DeviceInfo_Func_Set func_Set;
+} PlugIn_DeviceInfo;
+
+DeviceInfo_Func_Set getDeviceInfo_Func_Set(void *plugIn_handle, PLUGIN_ERROR * error_code);
+
+PLUGIN_ERROR registerPlugIn_DeviceInfo(PlugIn_DeviceInfo plugIn);
+
+int isExsist_DeviceInfo_PlugIn(int *plugIn_id);
+
+Load_DevInfo getFunction_DeviceInfo_Load_DevInfo(int plugIn_id);
+
+Get_DevInfo getFunction_DeviceInfo_Get_DevInfo(int plugIn_id);
+
+Clear_DevInfo getFunction_DeviceInfo_Clear_DevInfo(int plugIn_id);
+
+PM_Lock_State getFunction_PM_Lock_State(int plugIn_id);
+
+PM_Unlock_State getFunction_PM_Unlock_State(int plugIn_id);
+
+#endif /* PLUGIN_DEVICEINFO_H_ */
diff --git a/framework/include/PlugIn/PlugIn_Error.h b/framework/include/PlugIn/PlugIn_Error.h
new file mode 100755
index 0000000..6022371
--- /dev/null
+++ b/framework/include/PlugIn/PlugIn_Error.h
@@ -0,0 +1,51 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef PLUGIN_ERROR_H_
+#define PLUGIN_ERROR_H_
+
+/**
+ @brief Error Code about Operation result concern with Plug-In
+ */
+typedef enum {
+ PLUGIN_SUCCESS, /**< when Plug In Operation is succeed */
+ PLUGIN_FAIL, /**< when Plug In Operation is failed */
+ PLUGIN_LOAD_FAIL,
+ PLUGIN_DEPENDENCY_FAIL, /**< when Plug In Operation is failed because dependency */
+ PLUGIN_FULL_CAPACITY,
+ PLUGIN_INVALID_PARAM
+} PLUGIN_ERROR;
+
+#endif /* PLUGIN_ERROR_H_ */
diff --git a/framework/include/PlugIn/PlugIn_Interface/Account_Interface.h b/framework/include/PlugIn/PlugIn_Interface/Account_Interface.h
new file mode 100755
index 0000000..ceeda53
--- /dev/null
+++ b/framework/include/PlugIn/PlugIn_Interface/Account_Interface.h
@@ -0,0 +1,126 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef ACCOUNT_INTERFACE_H_
+#define ACCOUNT_INTERFACE_H_
+
+/**
+ * @file Account_Interface.h
+ * @brief Interface list in this header will be implemented plugIn developer.
+ * Implementation will operate F/W Account module.
+ */
+
+/**
+ * @brief Setting Account Repository name
+ * @remarks Repository means mapping storage, between service account ID and F/W account ID
+ * @param[in] agent_name means repository name - described in F/W config file <Agent-Key>
+ */
+void Set_AccountReposioryName(const char *agent_name);
+
+/**
+ * @brief Add account to Platform
+ * @remarks mapping platform account id with f/w account_id
+ * @param[in] fw_account_id F/W account ID
+ * @param[in] email account's email address
+ * @param[in] password account's password
+ * @param[in] create_mode whether create new Platform account or only mapping f/w account id with existed platform account
+ */
+void Add_PlatformAccount(int fw_account_id, char *email, char *password, int create_mode);
+
+/**
+ * @brief Mapping F/W account ID with service account ID
+ * @remarks You must register non-volatile storage not memory. ex) File, DataBase..
+ * @param[in] fw_account_id F/W account ID
+ * @param[in] service_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] service_account_id service account ID
+ */
+void Set_PlatformAccount_Service(int fw_account_id, int service_type, int service_account_id);
+
+/**
+ * @brief Mapping relationship is off - F/W account ID with platform account ID
+ * @remarks You must remove from storage.
+ * @param[in] fw_account_id F/W account ID
+ */
+void Del_PlatformAccount(int fw_account_id);
+
+/**
+ * @brief Mapping relationship is off - F/W account ID with service account ID
+ * @remarks You must remove from storage.
+ * @param[in] fw_account_id F/W account ID
+ * @param[in] service_type service type - service data connector pluIn's ID described in F/W config file
+ */
+void Del_PlatformAccount_Service(int fw_account_id, int service_type);
+
+/**
+ * @brief whether F/W account ID has the service account ID
+ * @param[in] fw_account_id F/W account ID
+ * @param[in] service_type service type - service data connector pluIn's ID described in F/W config file
+ * @return 1 if has, otherwise 0
+ * @retval 1 if has
+ * @retval 0 if has not
+ */
+int Has_PlatformAccount_Service(int fw_account_id, int service_type);
+
+/**
+ * @brief get service account ID mapped with F/W account ID
+ * @param[in] service_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] fw_account_id F/W account ID
+ * @return service account id if it exist mapping relationship, otherwise -100
+ * @retval service account id if it exist mapping relationship
+ * @retval -100 not exist mapping relationship
+ */
+int Get_Service_AccountID(int service_type, int fw_account_id);
+
+/**
+ * @brief get F/W account ID mapped with service account ID
+ * @param[in] service_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] service_account_id service account ID
+ * @param[in] index possible mapping one service account with multiple F/W account, so need index of F/W account.
+ * @return F/W account id if it exist mapping relationship, otherwise -1
+ * @retval F/W account id if it exist mapping relationship
+ * @retval -1 not exist mapping relationship
+ */
+int Get_FW_AccountID(int service_type, int service_account_id, int index);
+
+/**
+ * @brief Get service account information
+ * @remarks account information type must be defined in account plugIn.
+ * @param[in] fw_account_id F/W account id
+ * @param[in] service_type service type - service data connector pluIn's ID described in F/W config file
+ * @return Account Information* defined in account plugIn on success, otherwise null pointer
+ */
+void *Get_Service_AccountInfo(int fw_account_id, int service_type);
+
+#endif /* ACCOUNT_INTERFACE_H_ */
diff --git a/framework/include/PlugIn/PlugIn_Interface/DataConnector_Interface.h b/framework/include/PlugIn/PlugIn_Interface/DataConnector_Interface.h
new file mode 100755
index 0000000..924b145
--- /dev/null
+++ b/framework/include/PlugIn/PlugIn_Interface/DataConnector_Interface.h
@@ -0,0 +1,367 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef DATACONNECTOR_INTERFACE_H_
+#define DATACONNECTOR_INTERFACE_H_
+
+#include "agent-framework/DACI/EXT_DACI_Errors.h"
+
+#include "DataConnector_Resource.h"
+
+/**
+ * @file DataConnector_Interface.h
+ * @brief Interface list in this header will be implemented plugIn developer.
+ * Implementation will operate F/W DataAdapter module.
+ */
+
+/*
+ * @brief service opening work
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Service_Open();
+
+/*
+ * @brief service closing work
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Service_Close();
+
+/*
+ * @brief start transaction for service storage
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Begin_Transaction();
+
+/*
+ * @brief end transaction for service storage
+ * @param[in] is_success 1 : commit, 0 : rollback
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN End_Transaction(int is_success);
+
+/*
+ * @brief insert item into service storage
+ * @param[in] account_id service account id
+ * @param[in] folder_id service folder_id
+ * @param[in] data service structure *
+ * @param[out] item_id success : service item_id, fail : 0
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Add_Item(int account_id, char *folder_id, void *data, char **item_id);
+
+/*
+ * @brief update item from service storage
+ * @param[in] account_id service account id
+ * @param[in] folder_id service folder_id
+ * @param[in] item_id service item_id
+ * @param[in] data service structure *
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Update_Item(int account_id, char *folder_id, char *item_id, void *data);
+
+/*
+ * @brief delete item from service storage
+ * @param[in] account_id service account id
+ * @param[in] folder_id service folder_id
+ * @param[in] item_id service id of item expected to be deleted
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Del_Item(int account_id, char *folder_id, char *item_id);
+
+/*
+ * @brief delete all items from service storage
+ * @param[in] account_id service account id
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Del_All_Items(int account_id);
+
+/*
+ * @brief get item from service storage
+ * @param[in] account_id service account id
+ * @param[in] folder_id service folder id
+ * @param[in] item_id expected to get service item id
+ * @param[out] data success : item info, fail : 0
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Get_Item(int account_id, char *folder_id, char *item_id, void **data);
+
+/*
+ * @brief insert folder into service storage
+ * @param[in] account_id service account id
+ * @param[in] folder_name folder name
+ * @param[in] folder_type folder type
+ * @param[out] folder_id success : folder_id, fail : 0
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Add_Folder(int account_id, char *folder_name, int folder_type, char **folder_id);
+
+/*
+ * @brief delete folder from service storage
+ * @param[in] account_id service account id
+ * @param[in] folder_id service folder_id
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Del_Folder(int account_id, char *folder_id);
+
+/*
+ * @brief get folder from service storage
+ * @param[in] account_id service account id
+ * @param[in] folder_id service folder id
+ * @param[out] out_folder_name success : folder name, fail : 0
+ * @param[out] out_folder_type success : folder type, fail : -1
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Get_Folder(int account_id, char *folder_id, char **out_folder_name, int *out_folder_type);
+
+/*
+ * @brief execute data into service
+ * @param[in] account_id service account id
+ * @param[in] execute_key execute key
+ * @param[in] execute_values execute values
+ * @param[out] result extension result info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Execute(int account_ID, const char *execute_key, void *execute_values, void **result);
+
+/*
+ * @brief get item used count
+ * @return operation result
+ * @retval current item count success
+ * @retval error value fail : minus
+ */
+int Get_Used_Item_Count();
+
+/*
+ * @brief get item used count for folder
+ * @param[in] account_id service account id
+ * @param[in] folder_id service folder id
+ * @return operation result
+ * @retval current item count success
+ * @retval error value fail : minus
+ */
+int Get_Used_Item_Count_For_Folder(int account_id, char *folder_id);
+
+/*
+ * @brief get folder id list of a account
+ * @param[in] account_id service account id
+ * @param[out] folder_count success : folder count, fail or not exist : 0
+ * @param[out] folder_type_list success : list, fail or not exist : null pointer
+ * @return operation result
+ * @retval folder id list success
+ * @retval error value fail or not exist : null pointer
+ */
+char **Get_Folder_ID_List(int account_id, int *folder_count, int **folder_type_list);
+
+/*
+ * @brief get all account id list that service has currently
+ * @param[out] count success : account id count, fail or not exist : 0
+ * @return operation result
+ * @retval account id list success
+ * @retval error value fail or not exist : null pointer
+ */
+int *Get_Account_ID_List(int *count);
+
+/*
+ * @brief write data store items to file
+ * @param[in] account_id service account id
+ * @param[out] file_path written file_path
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail :minus
+ */
+DACI_RETURN Write_Items_To_File(int account_ID, char **file_path);
+
+/*
+ * @brief add file wrote item to data store
+ * @param[in] account_id service account_id
+ * @param[in] file_path file_path
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail : minus
+ */
+DACI_RETURN Add_File_Wrote_Items_To_Datastore(int account_ID, const char *file_path);
+
+/*
+ * @brief get added item list after specific point
+ * @param[in] account_id service account id
+ * @param[in] folder_id service folder id
+ * @param[in] changepoint specific point
+ * @param[out] changeCount added item count
+ * @return operation result
+ * @retval added item info list if exist
+ * @retval null pointer fail or not exist
+ */
+Item_Node *Get_Changed_ITEM_For_Folder_Add(int account_id, const char *folder_id, int changepoint, int *changeCount);
+
+/*
+ * @brief get deleted item list after specific point
+ * @param[in] account_id service account id
+ * @param[in] folder_id service folder id
+ * @param[in] changepoint specific point
+ * @param[out] changeCount deleted item count
+ * @return operation result
+ * @retval deleted item info list if exist
+ * @retval null pointer fail or not exist
+ */
+Item_Node *Get_Changed_ITEM_For_Folder_Del(int account_id, const char *folder_id, int changepoint, int *changeCount);
+
+/*
+ * @brief get updated item list after specific point
+ * @param[in] account_id service account id
+ * @param[in] folder_id service folder id
+ * @param[in] changepoint specific point
+ * @param[out] changeCount updated item count
+ * @return operation result
+ * @retval updated item info list if exist
+ * @retval null pointer fail or not exist
+ */
+Item_Node *Get_Changed_ITEM_For_Folder_Update(int account_id, const char *folder_id, int changepoint, int *changeCount);
+
+/*
+ * @brief get last storage change point information
+ * @return operation result
+ * @retval last storage change point information
+ */
+int Get_Last_ChangePoint();
+
+/*
+ * @brief check notification for the storage change
+ * @param[in] data user data
+ */
+void StartListening_ChangeNoti(void *data);
+
+/*
+ * @brief set callback function to handle added item to storage
+ * @param[in] callback callback function - this function is provided from F/W
+ */
+void SetCallBack_AddItem(CALLBACK_ADD_ITEM callback);
+
+/*
+ * @brief set callback function to handle deleted item to storage
+ * @param[in] callback callback function - this function is provided from F/W
+ */
+void SetCallBack_DeleteItem(CALLBACK_DEL_ITEM callback);
+
+/*
+ * @brief set callback function to handle updated item to storage
+ * @param[in] callback callback function - this function is provided from F/W
+ */
+void SetCallBack_UpdateItem(CALLBACK_UPDATE_ITEM callback);
+
+/*
+ * @brief set callback function to get service account id list mapped f/w account id
+ * @param[in] callback callback function - this function is provided from F/W
+ */
+void SetCallBack_GetAccountIDList(GET_ACCOUNTIDLIST callback);
+
+/*
+ * @brief get max item count per folder
+ * @param[in] folder_type folder type provided plug-in
+ * @return operation result
+ * @retval max item count success
+ * @retval -1 fail
+ */
+int Get_MAX_Item_Count(int folder_type);
+
+/*
+ * @brief get service data's available field length
+ * @param[in] field_name field_name provided data connector plug-In
+ * @param[in] child_field_name child_field_name provided data connector plug-In
+ * @return operation result
+ * @retval available field length success
+ * @retval -1 fail
+ */
+int Get_MAX_Field_Length(int field_name, int child_field_name);
+
+/*
+ * @brief get service data's available field count
+ * @param[in] field_name field_name provided data connector plug-In
+ * @param[in] child_field_name child_field_name provided data connector plug-In
+ * @return operation result
+ * @retval available field count success
+ * @retval -1 fail
+ */
+int Get_MAX_Field_Count(int field_name, int child_field_name);
+
+/*
+ * @brief get service data's available field value's domain
+ * @param[in] field_name field_name provided data connector plug-In
+ * @param[in] child_field_name child_field_name provided data connector plug-In
+ * @param[out] str_val when domain value is string
+ * @param[out] num_val1 when domain value is integer (ex minimum value)
+ * @param[out] num_val2 when domain value is integer (ex maximum value)
+ * @return operation result
+ * @retval 1 success
+ * @retval -1 fail
+ */
+int Get_Field_Value(int field_name, int child_field_name, char **str_val, int *num_val1, int *num_val2);
+
+/*
+ * @brief get service data's available field count
+ * @param[in] feature feature provided data connector plug-In
+ * @return operation result
+ * @retval 1 support
+ * @retval 0 not support
+ * @retval -1 fail
+ */
+int Get_Is_Support_Feature(int feature);
+
+#endif /* DATACONNECTOR_INTERFACE_H_ */
diff --git a/framework/include/PlugIn/PlugIn_Interface/DataConnector_Resource.h b/framework/include/PlugIn/PlugIn_Interface/DataConnector_Resource.h
new file mode 100755
index 0000000..48001a2
--- /dev/null
+++ b/framework/include/PlugIn/PlugIn_Interface/DataConnector_Resource.h
@@ -0,0 +1,63 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef DATACONNECTOR_RESOURCE_H_
+#define DATACONNECTOR_RESOURCE_H_
+
+/**
+ * @file DataConnector_Resource.h
+ * @brief Item id list container
+ */
+
+/**
+ * @brief Structure of Item ID Node - Linked List
+ */
+struct Item_Node {
+ char *item_id; /**< item id */
+ struct Item_Node *next; /**< next pointer */
+};
+
+typedef struct Item_Node Item_Node;
+
+typedef int (*CALLBACK_ADD_ITEM) (int accountID, int index, char *itemID, int itemType, char *folderID, int folderType);
+
+typedef int (*CALLBACK_DEL_ITEM) (int accountID, int index, char *itemID, int itemType);
+
+typedef int (*CALLBACK_UPDATE_ITEM) (int accountID, int index, char *itemID, int itemType);
+
+typedef int *(*GET_ACCOUNTIDLIST) (int service_type, int *cnt);
+
+
+#endif /* DATACONNECTOR_RESOURCE_H_ */
diff --git a/framework/include/PlugIn/PlugIn_Interface/DataConverter_Interface.h b/framework/include/PlugIn/PlugIn_Interface/DataConverter_Interface.h
new file mode 100644
index 0000000..b0533fb
--- /dev/null
+++ b/framework/include/PlugIn/PlugIn_Interface/DataConverter_Interface.h
@@ -0,0 +1,140 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef DATACONVERTER_INTERFACE_H_
+#define DATACONVERTER_INTERFACE_H_
+
+#include "agent-framework/DACI/EXT_DACI_Errors.h"
+
+#include "DataConverter_Resource.h"
+
+/**
+ * @file DataConverter_Interface.h
+ * @brief Interface list in this header will be implemented plugIn developer.
+ * Implementation will operate DataAdapter module.
+ */
+
+/**
+ * @brief convert agent type data to service structure format data
+ * @remarks agent data's type can be v-object. (vcard, vcalendar .. )
+ * @param[in] agent_data agent data
+ * @param[out] service_data created service data
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERRORS fail
+ */
+DACI_RETURN Converter(const void *agent_data, void **service_data);
+
+/**
+ * @brief convert result of the merge agent data with old service data to service structure format data
+ * @remarks agent data's type can be v-object. (vcard, vcalendar .. )
+ * @param[in] old_service_data old_service_data
+ * @param[in] agent_data agent data
+ * @param[out] new_service_data created service data
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERRORS fail
+ */
+DACI_RETURN Replace_Converter(void *old_service_data, const void *agent_data, void **new_service_data);
+
+/**
+ * @brief convert service structure format data to agent type data
+ * @remarks agent data's type can be v-object. (vcard, vcalendar .. )
+ * @param[in] service_data created service data
+ * @param[out] agent_data agent data
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERRORS fail
+ */
+DACI_RETURN Reverse_Converter(void *service_data, void **agent_data);
+
+/*
+ * @brief allocate internal object for content type
+ * @return operation result
+ * @retval internal struct pointer success
+ * @retval null pointer fail
+ */
+void *Alloc_Object();
+
+/*
+ * @brief free internal object for content type
+ * @param[in] in_object internal object pointer
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERRORS fail
+ */
+int Free_Object(void *in_object);
+
+/*
+ * @brief set value for internal object
+ * @param[in] in_object internal object pointer
+ * @param[in] key key
+ * @param[in] extension_key extension key
+ * @param[in] set_value value
+ * @return operation result
+ * @retval new object pointer success
+ * @retval null pointer fail
+ */
+void *Set_Value(void *in_object, int key, char *extension_key, void *set_value);
+
+/*
+ * @brief allocate internal object for content type
+ * @param[in] in_object internal object pointer
+ * @param[in] key key
+ * @param[in] extension_key extension key
+ * @return operation result
+ * @retval value pointer success
+ * @retval 0 fail
+ */
+void *Get_Value(void *in_object, int key, char *extension_key);
+
+/*
+ * @brief get meta infomation of internal object
+ * @return operation result
+ * @retval value pointer success
+ * @retval 0 fail
+ */
+Object_Info *Get_Obj_Info();
+
+/*
+ * @brief free infomation of internal object
+ * @param[in] obj_info object info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERRORS fail
+ */
+int Free_Obj_Info(Object_Info *obj_info);
+
+#endif /* DATACONVERTER_INTERFACE_H_ */
diff --git a/framework/include/PlugIn/PlugIn_Interface/DeviceInfo_Interface.h b/framework/include/PlugIn/PlugIn_Interface/DeviceInfo_Interface.h
new file mode 100644
index 0000000..886f7f8
--- /dev/null
+++ b/framework/include/PlugIn/PlugIn_Interface/DeviceInfo_Interface.h
@@ -0,0 +1,109 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef DEVICEINFO_INTERFACE_H_
+#define DEVICEINFO_INTERFACE_H_
+
+#include <glib.h>
+#include "agent-framework/Device/EXT_DCI_Common.h"
+
+/**
+ * @file DeviceInfo_Interface.h
+ * @brief Defines plug-in interfaces about device information
+ */
+
+/**
+ * @brief Device information structure
+ * @remarks This structure is member of list (devInfo)
+ * Key(info_name) - value(value) pair
+ */
+typedef struct {
+ char *info_name;
+ char *value;
+} dici_dev_info;
+
+/**
+ * @brief Get device information in the system and load this information on the memory
+ * @param[out] devInfo List of dici_dev_info structures
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Load_DevInfo(GList **devInfo);
+
+/**
+ * @brief Get device information on the memory that user want to know
+ * @param[in] devInfo List of dici_dev_info structures
+ * @param[in] info_name Name of device information
+ * @param[out] value Value of device information
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Get_DevInfo(GList *devInfo, char *info_name, char **value);
+
+/**
+ * @brief Clear device information on the memory (free memory)
+ * @param[in] defInfo List of dici_dev_info structures
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Clear_DevInfo(GList **devInfo);
+
+/**
+ * @brief Lock a particular power-state as the current power-state
+ * @remarks If parameter 'timeout' value is 0, state of power manager is always lock until calling PM_Unlock_State()
+ * @param[in] The power state which user want to lock
+ * @param[in] Set if user want to go the requested lock state directly
+ * @param[in] Specifies lock-timeout in milliseconds
+ * @return Operation result
+ * @retval 0 Successful
+ * @retval -1 Operation failed
+ * @see /Device/EXT_DCI_Common.h
+ */
+int PM_Lock_State(PM_State state, PM_Lock_State_Flag flag, unsigned int timeout);
+
+/**
+ * @brief Unlock the power-state
+ * @param[in] Specifies the power state which user want to unlock
+ * @param[in] Set if user want to go to the requested state directly after unlocking (not supported yet)
+ * @return Operation result
+ * @retval 0 Succesful
+ * @retval -1 Operation failed
+ */
+int PM_Unlock_State(PM_State state, PM_Unlock_State_Flag flag);
+
+#endif /* DEVICEINFO_INTERFACE_H_ */
diff --git a/framework/include/PlugIn/PlugIn_Interface/NetworkAccess_Interface.h b/framework/include/PlugIn/PlugIn_Interface/NetworkAccess_Interface.h
new file mode 100644
index 0000000..12321d0
--- /dev/null
+++ b/framework/include/PlugIn/PlugIn_Interface/NetworkAccess_Interface.h
@@ -0,0 +1,172 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef NETWORKACCESS_INTERFACE_H_
+#define NETWORKACCESS_INTERFACE_H_
+
+#include <glib.h>
+
+/**
+ * @file NetworkAccess_Interface.h
+ * @brief Defines plug-in interfaces about network access
+ */
+
+/**
+ * @brief Open network connection
+ * @param[out] session Network session information
+ * @param[in] proxy Proxy information
+ * @param[in] timeout User preferred time-out seconds used in sending message (ex> 30 means 30seconds)
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Open_Connection(void **session, char *proxy, int timeout);
+
+/**
+ * @brief Bind header information for each network protocol
+ * @param[in] header_info Header information for each network protocol
+ * @param[out] header_binding Header information bound each network protocol
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Header_Binding(GList *header_info, void **header_binding);
+
+/**
+ * @brief Send message to server and receive message from the server
+ * @param[in] session Network session information
+ * @param[out] header_binding Header binding information
+ * @param[in] send_msg Body message
+ * @param[in] send_msg_length Length of body message
+ * @param[out] recv_msg_size The size of received message from the server
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ * @retval -1 Cancel message
+ * @retval -8 Try again
+ * @retval -408 request timeout
+ */
+int Send_Message(void *session, void **header_binding, char *send_msg, unsigned int send_msg_length, unsigned int *recv_msg_size);
+
+/**
+ * @brief Divide header/body information using received message from the server
+ * @param[in] msg Received message from the server
+ * @param[in] msg_size The size of received message from the server
+ * @param[out] recv_header Header information of received message from the server
+ * @param[out] recv_msg Body information of received message from the server
+ * @param[out] recv_msg_length The length of body information
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Header_Unbinding(void *msg, unsigned int msg_size, GList **recv_header, unsigned char **recv_msg, unsigned int *recv_msg_length);
+
+/**
+ * @brief Close network connection
+ * @param[in] session Network session information
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Close_Connection(void *session);
+
+/**
+ * @brief Cancel operation about message being sent to the server
+ * @param[in] session Network session information
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Cancel_Message(void *session);
+
+/**
+ * @brief Just send message to the server (do not receive message from the server)
+ * @param[in] session Network session information
+ * @param[out] header_binding Header binding information
+ * @param[in] send_msg Body message
+ * @param[in] send_msg_length Length of body message
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Just_Send_Message(void *session, void **header_binding, char *send_msg, unsigned int send_msg_length);
+
+/**
+ * @brief Get network header information about specific keyword
+ * @param[in] header_info List of network header information (key-value pair)
+ * @param[in] key Specific keyword of header information that user want to know
+ * @param[out] value Value for the key
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ * @see Header_Unbinding()
+ */
+int Get_Header_Info(GList *header_info, char *key, char **value);
+
+/**
+ * @brief Set download information(download range) to download header information of specific network protocol
+ * @param[in] down_info Download header information of specific network protocol
+ * @param[in] current_down_range Download current range
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Set_Data_Download_Info(void *down_info, char *current_down_range);
+
+/**
+ * @brief Get download information(download range, filename) to download header information of specific network protocol
+ * @param[in] down_info Download header information of specific network protocol
+ * @param[out] total_down_size Total download size
+ * @param[out] current_down_range Current download range
+ * @param[out] down_file_name Download file name
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Get_Data_Download_Info(void *down_info, int *total_down_size, char **current_down_range, char **down_file_name);
+
+/**
+ * @brief Add user authentication information (id, password) to session and
+ * register authentication callback for 'authenticate' signal
+ * @param[in] session Network session information
+ * @param[in] id User id
+ * @param[in] password User password
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Add_Authentication_Info(void *session, char *id, char *password);
+
+#endif /* NETWORKACCESS_INTERFACE_H_ */
diff --git a/framework/include/PlugIn/PlugIn_Interface/PlatformMonitor_Interface.h b/framework/include/PlugIn/PlugIn_Interface/PlatformMonitor_Interface.h
new file mode 100644
index 0000000..4391d71
--- /dev/null
+++ b/framework/include/PlugIn/PlugIn_Interface/PlatformMonitor_Interface.h
@@ -0,0 +1,185 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef PLATFORMMONITOR_INTERFACE_H_
+#define PLATFORMMONITOR_INTERFACE_H_
+
+#include "PlatformMonitor_Resource.h"
+
+/**
+ * @file PlatformMonitor_Interface.h
+ * @brief Defines plug-in interfaces about service platform notification
+ */
+
+/**
+ * @brief Data structure to register at main loop of sync-agent-framework
+ */
+typedef struct {
+ char *pkg_name;
+ char *app_id;
+ void *user_data;
+} pm_register_data_t;
+
+/**
+ * @brief Check the current network status/connection type and
+ * register network notification callback function(used in sync-agent-framework) to network platform
+ * @param[in] data User data (meaningless data)
+ */
+void Init_Network_Status_Noti_Handler(void *data);
+
+/**
+ * @brief Unregister network notification callback function(used in sync-agent-framework) to network platform
+ */
+int Terminate_Network_Status_Noti_Handler(void);
+
+/**
+ * @brief Initialize to receive SAN notification from the service
+ * @remarks Connect to the service and register notification callback function to the service
+ * @param[in] data User data (meaningless data)
+ */
+void Init_Syncml_SAN_Noti_Handler(void *data);
+
+/**
+ * @brief Unregister notification callback function that was previously registered to the service and disconnect to the service
+ */
+int Terminate_Syncml_SAN_Noti_Handler(void);
+
+/**
+ * @brief Add SAN message to the service
+ * @param[in] add_item Item to add to the service
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval -1 Operation failed
+ * @see /PlatformMonitor/EXT_PMCI_Struct.h - pmci_san_message_t
+ */
+int Add_Message(void *add_item);
+
+/**
+ * @brief Remove SAN message from service
+ * @param[in] remove_item_id Id of Item that user want to remove from service
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval -1 Operation failed
+ */
+int Remove_Message(int remove_item_id);
+
+/**
+ * @brief Initialize to receive alarm notification from the service
+ * @remarks Connect to the service and register notification callback function to the service
+ * @param[in] data Structure 'pm_register_data_t'
+ */
+void Init_Alarm_Noti_Handler(void *data);
+
+/**
+ * @brief Unregister notification callback function that was previously registered to the service and disconnect to the service
+ * @remarks Not supported yet
+ */
+int Terminate_Alarm_Noti_Handler();
+
+/**
+ * @brief Add alarm data to the service
+ * @param[in] add_item Item to add to the service
+ * @param[out] out_add_item_id Id of the newly item added to the service
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Add_Alarm(void *add_item, int *out_add_item_id);
+
+/**
+ * @brief Remove alarm data from the service
+ * @param[in] remove_item_id Id of Item that user want to remove from service
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval -1 Operation failed
+ */
+int Remove_Alarm(int remove_item_id);
+
+/**
+ * @brief Get item that user want to know from the service
+ * @param[in] get_item_id Id of the item that user want to know
+ * @param[out] out_get_item Item that user want to know
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ * @see /PlatformMonitor/EXT_PMCI_Struct.h - pmci_alarm_t
+ */
+int Get_Alarm(int get_item_id, void **out_get_item);
+
+/**
+ * @brief Register user callback function for network status to the service
+ * @remarks This api is used in sync-agent-framework
+ * @param[in] callback User callback function
+ */
+void SetCallBack_NetworkStatus(CALLBACK_NETWORK_STATUS callback);
+
+/**
+ * @brief Register user callback function for network cancel to the service
+ * @remarks This api is used in sync-agent-framework
+ * @param[in] callback User callback function
+ */
+void SetCallBack_NetworkAllCancel(CALLBACK_NETWORK_CANCEL callback);
+
+/**
+ * @brief Register user callback function for SAN incoming notification to the service
+ * @param[in] callback User callback function
+ */
+void SetCallBack_Syncml_SAN_Incoming(CALLBACK_SYNCML_SAN_INCOMING callback);
+
+/**
+ * @brief Register user callback function for SAN operation notification to the service
+ * @param[in] callback User callback function
+ */
+void SetCallBack_Syncml_SAN_Operation(CALLBACK_SYNCML_SAN_OPERATION callback);
+
+/**
+ * @brief Register user callback function for alarm notification to the service
+ * @param[in] callback User callback function
+ */
+void SetCallBack_Alarm(CALLBACK_ALARM callback);
+
+/**
+ * @brief Register user callback function for network on status to the service
+ * @param[in] callback User callback function
+ */
+void SetCallBack_Network_On(CALLBACK_NETWORK_ON callback);
+
+/**
+ * @brief Register user callback function for network off status to the service
+ * @param[in] callback User callback function
+ */
+void SetCallBack_Network_Off(CALLBACK_NETWORK_OFF callback);
+
+#endif /* PLATFORMMONITOR_INTERFACE_H_ */
diff --git a/framework/include/PlugIn/PlugIn_Mgr.h b/framework/include/PlugIn/PlugIn_Mgr.h
new file mode 100755
index 0000000..9a98fd1
--- /dev/null
+++ b/framework/include/PlugIn/PlugIn_Mgr.h
@@ -0,0 +1,76 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef PLUGIN_MGR_H_
+#define PLUGIN_MGR_H_
+
+#include "PlugIn_Error.h"
+
+typedef enum {
+ PLUGIN_DataConnector = 0,
+ PLUGIN_DataConverter,
+ PLUGIN_NetworkAccess,
+ PLUGIN_Account,
+ PLUGIN_DeviceInfo,
+ PLUGIN_MO,
+ PLUGIN_PlatformMonitor,
+
+ PLUGIN_DOMAIN_CNT
+} PLUGIN_DOMAIN;
+
+/**
+ @brief Load the Plug-In.
+
+ Received a Plug-In as a parameter will be loaded.
+
+ @param[in] plugin_path To Load Plug-In's path
+ @param[out] error Error Code
+ @return if it succeed plugIn handle, if it failed NULL pointer
+ */
+void *load_PlugIn(const char *plugin_path, PLUGIN_ERROR * error);
+
+/**
+ @brief UnLoad the Plug-In.
+
+ By default, Received a Plug-In as a parameter will be Unloaded.
+ but If another Plug-In is dependent on Plug-In, this function will be failed.
+
+ @param domain_name To Load Plug-In's domain name (ex) SA, DataConnector, NetworkAccess ...
+ @param plugin_name To Load Plug-In's name
+ @return results of the unload if it succeed, success code(PLUGIN_SUCCESS) will be returned.
+ */
+PLUGIN_ERROR unLoad_PlugIn(PLUGIN_DOMAIN domain, const char *plugin_name);
+
+#endif /* PLUGIN_MGR_H_ */
diff --git a/framework/include/PlugIn/PlugIn_NetworkAccess.h b/framework/include/PlugIn/PlugIn_NetworkAccess.h
new file mode 100755
index 0000000..de340b4
--- /dev/null
+++ b/framework/include/PlugIn/PlugIn_NetworkAccess.h
@@ -0,0 +1,108 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef PLUGIN_NETWORKACCESS_H_
+#define PLUGIN_NETWORKACCESS_H_
+
+#include <glib.h>
+
+#include "PlugIn_Struct.h"
+#include "PlugIn_Error.h"
+
+#define MAX_PLUGIN_NETWORKACCESS 10
+
+typedef int (*Open_Connection) (void **session, char *proxy, int timeout);
+typedef int (*Header_Binding) (GList *header_info, void **header_binding);
+typedef int (*Send_Message) (void *session, void **header_binding, char *send_msg, unsigned int send_msg_length, unsigned int *recv_msg_size);
+typedef int (*Header_Unbinding) (void *msg, unsigned int msg_size, GList **recv_header, unsigned char **recv_msg, unsigned int *recv_msg_length);
+typedef int (*Close_Connection) (void *session);
+typedef int (*Cancel_Message) (void *session);
+typedef int (*Just_Send_Message) (void *session, void **header_binding, char *send_msg, unsigned int send_msg_length);
+typedef int (*Get_Header_Info) (GList *header_info, char *key, char **value);
+typedef int (*Set_Data_Download_Info) (void *down_info, char *current_down_range);
+typedef int (*Get_Data_Download_Info) (void *down_info, int *total_down_size, char **current_down_range, char **down_file_name);
+typedef int (*Add_Authentication_Info) (void *session, char *id, char *password);
+
+typedef struct {
+ Open_Connection pFunc_Open_Connection;
+ Header_Binding pFunc_Header_Binding;
+ Send_Message pFunc_Send_Message;
+ Header_Unbinding pFunc_Header_Unbinding;
+ Close_Connection pFunc_Close_Connection;
+ Cancel_Message pFunc_Cancel_Message;
+ Just_Send_Message pFunc_Just_Send_Message;
+ Get_Header_Info pFunc_Get_Header_Info;
+ Set_Data_Download_Info pFunc_Set_Data_Down_Info;
+ Get_Data_Download_Info pFunc_Get_Data_Down_Info;
+ Add_Authentication_Info pFunc_Add_Authentication_Info;
+} NetworkAccess_Func_Set;
+
+typedef struct {
+ PlugIn_Info_t plugIn_info;
+ NetworkAccess_Func_Set func_Set;
+ int use_network;
+} PlugIn_NetworkAccess;
+
+NetworkAccess_Func_Set getNetworkAccess_Func_Set(void *plugIn_handle, PLUGIN_ERROR * error_code);
+
+PLUGIN_ERROR registerPlugIn_NetworkAccess(PlugIn_NetworkAccess plugIn);
+
+int use_Network(int plugIn_id);
+
+int get_NetworkAccess_PlugIn_ID_List(int **plugIn_id_list);
+
+Open_Connection getFunction_NetworkAccess_Open_Connection(int plugIn_id);
+
+Header_Binding getFunction_NetworkAccess_Header_Binding(int plugIn_id);
+
+Send_Message getFunction_NetworkAccess_Send_Message(int plugIn_id);
+
+Header_Unbinding getFunction_NetworkAccess_Header_Unbinding(int plugIn_id);
+
+Close_Connection getFunction_NetworkAccess_Close_Connection(int plugIn_id);
+
+Cancel_Message getFunction_NetworkAccess_Cancel_Message(int plugIn_id);
+
+Just_Send_Message getFunction_NetworkAccess_Just_Send_Message(int plugIn_id);
+
+Get_Header_Info getFunction_NetworkAccess_Get_Header_Info(int plugIn_id);
+
+Set_Data_Download_Info getFunction_NetworkAccess_Set_Data_Download_Info(int plugIn_id);
+
+Get_Data_Download_Info getFunction_NetworkAccess_Get_Data_Download_Info(int plugIn_id);
+
+Add_Authentication_Info getFunction_NetworkAccess_Add_Authentication_Info(int plugIn_id);
+
+#endif /* PLUGIN_NETWORKACCESS_H_ */
diff --git a/framework/include/PlugIn/PlugIn_PlatformMonitor.h b/framework/include/PlugIn/PlugIn_PlatformMonitor.h
new file mode 100755
index 0000000..14fe256
--- /dev/null
+++ b/framework/include/PlugIn/PlugIn_PlatformMonitor.h
@@ -0,0 +1,158 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef PLUGIN_PLATFORMMONITOR_H_
+#define PLUGIN_PLATFORMMONITOR_H_
+
+#include <glib.h>
+
+#include "PlugIn_Struct.h"
+#include "PlugIn_Error.h"
+#include "PlatformMonitor_Resource.h"
+
+#define MAX_PLUGIN_PLATFORMMONITOR 10
+
+/* for register FW main loop */
+typedef struct {
+ char *pkg_name;
+ char *app_id;
+ void *user_data;
+} pm_register_data_t;
+
+/* register FW g_main_loop */
+
+/* FW Common Notification */
+typedef void (*Init_Network_Status_Noti_Handler) (void *data);
+
+typedef int (*Terminate_Network_Status_Noti_Handler) (void);
+
+/* Specific Service Notification */
+typedef void (*Init_Syncml_SAN_Noti_Handler) (void *data);
+typedef int (*Terminate_Syncml_SAN_Noti_Handler) (void);
+typedef int (*Add_Message) (void *add_item);
+typedef int (*Remove_Message) (int remove_item_id);
+
+/* Alarm noti */
+typedef void (*Init_Alarm_Noti_Handler) (void *data);
+typedef int (*Terminate_Alarm_Noti_Handler) ();
+typedef int (*Add_Alarm) (void *add_item, int *out_add_item_id);
+typedef int (*Remove_Alarm) (int remove_item_id);
+typedef int (*Get_Alarm) (int get_item_id, void **out_get_item);
+
+/* Set Callback */
+typedef void (*SetCallBack_NetworkStatus) (CALLBACK_NETWORK_STATUS callback);
+typedef void (*SetCallBack_NetworkAllCancel) (CALLBACK_NETWORK_CANCEL callback);
+typedef void (*SetCallBack_Syncml_SAN_Incoming) (CALLBACK_SYNCML_SAN_INCOMING callback);
+typedef void (*SetCallBack_Syncml_SAN_Operation) (CALLBACK_SYNCML_SAN_OPERATION callback);
+typedef void (*SetCallBack_Alarm) (CALLBACK_ALARM callback);
+typedef void (*SetCallBack_Network_On) (CALLBACK_NETWORK_ON callback);
+typedef void (*SetCallBack_Network_Off) (CALLBACK_NETWORK_OFF callback);
+
+typedef struct {
+ Init_Network_Status_Noti_Handler pFunc_Init_Network_Status_Noti_Handler;
+ Terminate_Network_Status_Noti_Handler pFunc_Terminate_Network_Status_Noti_Handler;
+
+ Init_Syncml_SAN_Noti_Handler pFunc_Init_Syncml_SAN_Noti_Handler;
+ Terminate_Syncml_SAN_Noti_Handler pFunc_Terminate_Syncml_SAN_Noti_Handler;
+ Add_Message pFunc_Add_Message;
+ Remove_Message pFunc_Remove_Message;
+
+ Init_Alarm_Noti_Handler pFunc_Init_Alarm_Noti_Handler;
+ Terminate_Alarm_Noti_Handler pFunc_Terminate_Alarm_Noti_Handler;
+ Add_Alarm pFunc_Add_Alarm;
+ Remove_Alarm pFunc_Remove_Alarm;
+ Get_Alarm pFunc_Get_Alarm;
+
+ SetCallBack_NetworkStatus pFunc_SetCallBack_NetworkStatus;
+ SetCallBack_NetworkAllCancel pFunc_SetCallBack_NetworkAllCancel;
+
+ SetCallBack_Syncml_SAN_Incoming pFunc_SetCallBack_Syncml_SAN_Incoming;
+ SetCallBack_Syncml_SAN_Operation pFunc_SetCallBack_Syncml_SAN_Operation;
+
+ SetCallBack_Alarm pFunc_SetCallBack_Alarm;
+
+ SetCallBack_Network_On pFunc_SetCallBack_Network_On;
+ SetCallBack_Network_Off pFunc_SetCallBack_Network_Off;
+
+} PlatformMonitor_Func_Set;
+
+typedef struct {
+ PlugIn_Info_t plugIn_info;
+ PlatformMonitor_Func_Set func_Set;
+} PlugIn_PlatformMonitor;
+
+PlatformMonitor_Func_Set getPlatformMonitor_Func_Set(void *plugIn_handle, PLUGIN_ERROR * error_code);
+
+PLUGIN_ERROR registerPlugIn_PlatformMonitor(PlugIn_PlatformMonitor plugIn);
+
+int get_PlatformMonitor_PlugIn_Id();
+
+Init_Network_Status_Noti_Handler getFunction_PlatformMonitor_Init_Network_Status_Noti_Handler(int plugIn_id);
+
+Terminate_Network_Status_Noti_Handler getFunction_PlatformMonitor_Terminate_Network_Status_Noti_Handler(int plugIn_id);
+
+Init_Syncml_SAN_Noti_Handler getFunction_PlatformMonitor_Init_Syncml_SAN_Noti_Handler(int plugIn_id);
+
+Terminate_Syncml_SAN_Noti_Handler getFunction_PlatformMonitor_Terminate_Symcml_SAN_Noti_Handler(int plugIn_id);
+
+Add_Message getFunction_PlatformMonitor_Add_Message(int plugIn_id);
+
+Remove_Message getFunction_PlatformMonitor_Remove_Message(int plugIn_id);
+
+Init_Alarm_Noti_Handler getFunction_PlatformMonitor_Init_Alarm_Noti_Handler(int plugIn_id);
+
+Terminate_Alarm_Noti_Handler getFunction_PlatformMonitor_Terminate_Alarm_Noti_Handler(int plugIn_id);
+
+Add_Alarm getFunction_PlatformMonitor_Add_Alarm(int plugIn_id);
+
+Remove_Alarm getFunction_PlatformMonitor_Remove_Alarm(int plugIn_id);
+
+Get_Alarm getFunction_PlatformMonitor_Get_Alarm(int plugIn_id);
+
+SetCallBack_NetworkStatus getFunction_PlatformMonitor_SetCallBack_NetworkStatus(int plugIn_id);
+
+SetCallBack_NetworkAllCancel getFunction_PlatformMonitor_SetCallBack_NetworkAllCancel(int plugIn_id);
+
+SetCallBack_Syncml_SAN_Incoming getFunction_PlatformMonitor_SetCallBack_Syncml_SAN_Incoming(int plugIn_id);
+
+SetCallBack_Syncml_SAN_Operation getFunction_PlatformMonitor_SetCallBack_Syncml_SAN_Operation(int plugIn_id);
+
+SetCallBack_Alarm getFunction_PlatformMonitor_SetCallBack_Alarm(int plugIn_id);
+
+SetCallBack_Network_On getFunction_PlatformMonitor_SetCallBack_Network_On(int plugIn_id);
+
+SetCallBack_Network_Off getFunction_PlatformMonitor_SetCallBack_Network_Off(int plugIn_id);
+
+#endif /* PLUGIN_PLATFORMMONITOR_H_ */
diff --git a/framework/include/PlugIn/PlugIn_Struct.h b/framework/include/PlugIn/PlugIn_Struct.h
new file mode 100755
index 0000000..46eae3e
--- /dev/null
+++ b/framework/include/PlugIn/PlugIn_Struct.h
@@ -0,0 +1,49 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef PLUGIN_STRUCT_H_
+#define PLUGIN_STRUCT_H_
+
+/**
+ @brief This structure represents one of the PlugIn.
+ */
+struct PlugIn_Info {
+ int plugIn_id;
+ void *plugIn_handle;
+};
+
+typedef struct PlugIn_Info PlugIn_Info_t;
+
+#endif /* PLUGIN_STRUCT_H_ */
diff --git a/framework/include/SyncAgent_Info.h b/framework/include/SyncAgent_Info.h
new file mode 100755
index 0000000..86d2cf2
--- /dev/null
+++ b/framework/include/SyncAgent_Info.h
@@ -0,0 +1,64 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Jungwook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef SYNCAGENT_COMMON_H_
+#define SYNCAGENT_COMMON_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+typedef enum {
+ FW_CONTACT = 0,
+ FW_CALENDAR,
+ FW_MEMO,
+ FW_EMAIL,
+ FW_CONTACT_GROUP,
+ FW_SMS,
+ FW_CALL_LOG,
+ FW_BOOKMARK,
+ FW_ALARM,
+ FW_DRM,
+ FW_ACCOUNT_EMAIL,
+ FW_ACCOUNT_EAS,
+
+ FW_CONTENT_COUNT
+} FW_CONTENT_TYPE;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SYNCAGENT_COMMON_H_ */
diff --git a/framework/include/Utility/fw_alloc.h b/framework/include/Utility/fw_alloc.h
new file mode 100644
index 0000000..4062107
--- /dev/null
+++ b/framework/include/Utility/fw_alloc.h
@@ -0,0 +1,108 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef FW_ALLOC_H_
+#define FW_ALLOC_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* data structure alignment */
+#define FW_ALIGN(n, m) (((n) + ((m) - 1)) & ~((m) - 1))
+
+#define FW_ALIGN16(n) FW_ALIGN(n, 2)
+#define FW_ALIGN32(n) FW_ALIGN(n, 4)
+#define FW_ALIGN64(n) FW_ALIGN(n, 8)
+
+/* memory allocation */
+#ifdef NDEBUG
+#include <string.h>
+#include <stdlib.h>
+
+/* release version */
+ static inline void *fw_malloc(size_t bytes) {
+ return malloc(bytes);
+ } static inline void *fw_calloc(size_t nmemb, size_t size) {
+ return calloc(nmemb, size);
+ }
+
+ static inline void *fw_realloc(void *ptr, size_t bytes) {
+ return realloc(ptr, bytes);
+ }
+
+ static inline char *fw_strdup(const char *src) {
+ return strdup(src);
+ }
+
+ static inline char *fw_strndup(const char *src, unsigned int n) {
+ return strndup(src, n);
+ }
+
+#define fw_free free
+
+#else
+/* debug version */
+#define fw_malloc(bytes) \
+ _fw_malloc(bytes, __FILE__, __LINE__)
+#define fw_calloc(nmemb, size) \
+ _fw_calloc((nmemb) * (size), __FILE__, __LINE__)
+#define fw_realloc(ptr, bytes) \
+ _fw_realloc(ptr, bytes, __FILE__, __LINE__)
+#define fw_free(ptr) \
+ _fw_free(ptr)
+#define fw_free_no_info \
+ _fw_free_no_info
+
+#define fw_strdup(src) \
+ _fw_strdup(src, __FILE__, __LINE__)
+#define fw_strndup(src, n) \
+ _fw_strndup(src, n, __FILE__, __LINE__)
+
+ void *_fw_malloc(unsigned int bytes, const char *file, int line);
+ void *_fw_calloc(unsigned int bytes, const char *file, int line);
+ void *_fw_realloc(void *ptr, unsigned int bytes, const char *file, int line);
+ void _fw_free(void *ptr);
+
+/* TODO */
+ char *_fw_strdup(const char *src, const char *file, int line);
+ char *_fw_strndup(const char *src, unsigned int n, const char *file, int line);
+
+#endif /* no DEBUG_ALLOC */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* FW_ALLOC_H_ */
diff --git a/framework/include/Utility/fw_alloc_internal.h b/framework/include/Utility/fw_alloc_internal.h
new file mode 100644
index 0000000..c548951
--- /dev/null
+++ b/framework/include/Utility/fw_alloc_internal.h
@@ -0,0 +1,82 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef FW_ALLOC_INTERNAL_H_
+#define FW_ALLOC_INTERNAL_H_
+
+#include <pthread.h>
+#include <glib.h>
+#include <stdbool.h>
+#include "Utility/fw_list.h"
+
+#include "fw_define.h"
+
+#define ALLOC_FRONT_REDZONE_SIZE 8
+#define ALLOC_REAR_REDZONE_SIZE 8
+#define ALLOC_FRONT_REDZONE_PATTERN 0xa7
+#define ALLOC_REAR_REDZONE_PATTERN 0x9d
+
+/* internal structure */
+typedef struct alloc_debug_info_s alloc_debug_info_t;
+struct alloc_debug_info_s {
+ const char *file;
+ time_t time;
+ unsigned int line;
+ unsigned int size;
+};
+
+/* get pointer interface */
+FW_STATIC FW_INLINE void *get_realbytes(void *pBytes);
+FW_STATIC FW_INLINE alloc_debug_info_t *get_debug_info(void *pRealbytes);
+FW_STATIC FW_INLINE void *get_front_redzone(void *pRealbytes);
+FW_STATIC FW_INLINE void *get_bytes(void *pRealbytes);
+FW_STATIC FW_INLINE void *get_rear_redzone(void *pRealbytes, unsigned int bytes);
+FW_STATIC FW_INLINE fw_list_node_t *get_my_list_node(void *pRealbytes);
+
+/* checking redzone */
+FW_STATIC FW_INLINE bool check_redzone(void *pRealbytes);
+FW_STATIC FW_INLINE bool check_front_redzone(void *pRealbytes);
+FW_STATIC FW_INLINE bool check_rear_redzone(void *pRealbytes);
+FW_STATIC FW_INLINE bool check_redzone_with_pattern(char *redzone, char pattern, unsigned int pattern_size);
+
+/* alloc and init interface */
+FW_STATIC FW_INLINE void _init_debug_info(alloc_debug_info_t *debug_info, unsigned int byte_size, const char *file, int line);
+FW_STATIC bool init_realbytes(void *pRealbytes, unsigned int bytes, const char *file, int line);
+FW_STATIC void *_alloc_init_realbytes(unsigned int bytes, const char *file, int line);
+
+/* free interface */
+FW_STATIC void _free_realbytes(void *pRealbytes);
+
+#endif /* FW_ALLOC_INTERNAL_H_ */
diff --git a/framework/include/Utility/fw_assert.h b/framework/include/Utility/fw_assert.h
new file mode 100644
index 0000000..da9413a
--- /dev/null
+++ b/framework/include/Utility/fw_assert.h
@@ -0,0 +1,96 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef FW_ASSERT_H_
+#define FW_ASSERT_H_
+
+#include <stdlib.h>
+#include <assert.h>
+#include <errno.h>
+#include "fw_log.h"
+
+/**
+ * @file fw_assert.h
+ * @brief Provides assertion on exception case
+ */
+
+/**
+ * @brief this macro checks errno and abort if errno != 0
+ * @param[in] text string to print out on errno != 0 case
+ * @code
+#include "agent-framework/Utility/fw_assert.h"
+#include <stdio.h>
+
+ int main()
+ {
+ //try something
+ FILE* fp = fopen("ABCD.txt", "r");
+
+ //checking errno == 0
+ //if errno != 0, then the program aborted and print "ABCD.txt open failed" in log file
+ fw_errno_abort("ABCD.txt open failed");
+ }
+ * @endcode
+ */
+#define fw_errno_abort(text) do {\
+ if (errno != 0) {\
+ FW_LOGE("(errno_abort) text : %s, string error (errno = %d) : %s", text, errno, strerror(errno));\
+ abort();\
+ } \
+ } while (0)
+
+/**
+ * @brief this macro checks whether condition failed or not and abort on condition failed case
+ * @param[in] condition checking condition
+ * @param[in] text string to print out on condition failed case
+ * @code
+#include "agent-framework/Utility/fw_assert.h"
+
+ int main()
+ {
+ //checking condition 1 !=2 is true or false
+ //if the condition is false, then the program aborted and print "1 is not same as 2" in log file
+ fw_assert_condition(1 != 2, "1 is not same as 2");
+ }
+ * @endcode
+ */
+#define fw_assert_condition(condition, text) do {\
+ if (!(condition)) {\
+ FW_LOGE("(assertion failed) text : %s, condition failed at : %s", text, #condition);\
+ abort();\
+ } \
+ } while (0)
+
+#endif /* FW_ASSERT_H_ */
diff --git a/framework/include/Utility/fw_async_queue.h b/framework/include/Utility/fw_async_queue.h
new file mode 100644
index 0000000..b225d45
--- /dev/null
+++ b/framework/include/Utility/fw_async_queue.h
@@ -0,0 +1,112 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef FW_ASYNC_QUEUE_H_
+#define FW_ASYNC_QUEUE_H_
+
+#include <glib.h>
+
+/**
+ * @file fw_async_queue.h
+ * @brief provide DataStructure - asynchronous Queue
+ */
+
+/**
+ * @brief determine priority
+ * @param[in] msg1 item
+ * @param[in] msg2 compare item
+ * @param[in] user_data user_data
+ * @return
+ * @see fw_async_queue_send_msg_with_compare_priority()
+ */
+typedef int (*compare_priority_func) (const void *msg1, const void *msg2, void *user_data);
+
+/**
+ * @brief asynchronous Queue
+ */
+typedef struct fw_async_queue_s fw_async_queue_t;
+struct fw_async_queue_s {
+ GAsyncQueue *pQueue; /**< real queue data structure */
+};
+
+/**
+ * @brief create empty asynchronous Queue
+ * @return created asynchronous queue on success, otherwise a null pointer.
+ */
+fw_async_queue_t *fw_async_queue_alloc();
+
+/**
+ * @brief destroy asynchronous Queue
+ * @param[in] pQueue asynchronous Queue
+ */
+void fw_async_queue_destroy(fw_async_queue_t *pQueue);
+
+/**
+ * @brief lock asynchronous Queue
+ * @param[in] pQueue asynchronous Queue
+ */
+void fw_async_queue_lock(fw_async_queue_t *pQueue);
+
+/**
+ * @brief unlock asynchronous Queue
+ * @param[in] pQueue asynchronous Queue
+ */
+void fw_async_queue_unlock(fw_async_queue_t *pQueue);
+
+/**
+ * @brief pop item from asynchronous Queue
+ * @remarks blocking until enter item to Queue
+ * @param[in] pQueue asynchronous Queue
+ * return item on success, otherwise null pointer
+ */
+void *fw_async_queue_receive_msg(fw_async_queue_t *pQueue);
+
+/**
+ * @brief send item to asynchronous Queue
+ * @param[in] pQueue asynchronous Queue
+ * @param[in] msg item
+ */
+void fw_async_queue_send_msg(fw_async_queue_t *pQueue, void *msg);
+
+/**
+ * @brief send item to asynchronous Queue with priority
+ * @param[in] pQueue asynchronous Queue
+ * @param[in] msg item
+ * @param[in] cpf priority for callback function
+ * @param[in] user_data user_data
+ */
+void fw_async_queue_send_msg_with_compare_priority(fw_async_queue_t *pQueue, void *msg, compare_priority_func cpf, void *user_data);
+
+#endif /* FW_ASYNC_QUEUE_H_ */
diff --git a/framework/include/Utility/fw_cache.h b/framework/include/Utility/fw_cache.h
new file mode 100644
index 0000000..1e4c040
--- /dev/null
+++ b/framework/include/Utility/fw_cache.h
@@ -0,0 +1,129 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef FW_CACHE_H_
+#define FW_CACHE_H_
+
+/**
+ * @file fw_cache.h
+ * @brief Provides cache service such as create, destroy, reload and etc
+ */
+
+/**
+ * @brief Constructor used to initialize allocated objects
+ * @param[in] key key to allocate
+ * @return operation result
+ * @retval object pointer to cache success
+ * @retval 0 fail
+ */
+typedef void *cache_constructor_t (const char *key);
+
+/**
+ * @brief Destructor used to clean up allocated objects before they are
+ * @param[in] key key to allocate
+ * @param[in] obj object pointer
+ */
+typedef void cache_destructor_t (const char *key, void *obj);
+
+/**
+ * @brief Reloader used to reload allocated objects
+ * @param[in] key key to allocate
+ * @return operation result
+ * @retval object pointer to cache success
+ * @retval 0 fail
+ */
+typedef void *cache_reloader_t (const char *key);
+
+/**
+ * @brief Create a cache.
+ *
+ * you should register only once per process
+ *
+ * @param[in] constructor the function to be called to initialize memory when we need to allocate more memory from the os.
+ * @param[in] destructor destructor the function to be called before we release the memory back to the os.
+ * @param[in] reloader reloader the function to be called when we need to reload from the os.
+ * @return operation result
+ * @retval 1 success
+ * @retval 0 fail
+ */
+int FW_Create_Cache(cache_constructor_t *constructor, cache_destructor_t *destructor, cache_reloader_t *reloader);
+
+/**
+ * @brief Destroy a cache.
+ *
+ * you should register only once per process
+ *
+ * @return operation result
+ * @retval 1 success
+ * @retval 0 fail
+ */
+int FW_Destroy_Cache();
+
+/**
+ * @brief Allocate a cache object and register has table
+ *
+ * That corresponds to the cache_name of the constructor callback function should be written.
+ *
+ * @param[in] cache_name cache name (is used hash table key)
+ * @return operation result
+ * @retval 1 success
+ * @retval 0 fail
+ */
+void *FW_Use_Cache_Info(const char *cache_name);
+
+/**
+ * @brief Return an object back to the cache.
+ *
+ * That corresponds to the cache_name of the destructor callback function should be written.
+ *
+ * @param[in] cache_name cache name (is used hash table key)
+ * @return operation result
+ * @retval 1 success
+ * @retval 0 fail
+ */
+int FW_Return_Cache_Info(const char *cache_name);
+
+/**
+ * @brief Reload an object to the cache
+ *
+ * That corresponds to the cache_name of the reloader callback function should be written.
+ *
+ * @param[in] cache_name cache name (is used hash table key)
+ * @retval 1 success
+ * @retval 0 fail
+ */
+void *FW_Reload_Cache_Info(const char *cache_name);
+
+#endif /* FW_CACHE_H_ */
diff --git a/framework/include/Utility/fw_common.h b/framework/include/Utility/fw_common.h
new file mode 100644
index 0000000..09d235c
--- /dev/null
+++ b/framework/include/Utility/fw_common.h
@@ -0,0 +1,71 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef FW_COMMON_H_
+#define FW_COMMON_H_
+
+/* TODO: 종류별로 옮겨져야 한다. */
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <glib.h>
+
+#define FW_SLIST GSList
+
+#define fw_slist_sort(list, compare_func) g_slist_sort(list, compare_func)
+#define fw_slist_find(list, data) g_slist_find(list, data)
+#define fw_slist_prepend(list, data) g_slist_prepend(list, data)
+#define fw_slist_append(list, data) g_slist_append(list, data)
+#define fw_slist_remove(list, data) g_slist_remove(list, data)
+#define fw_slist_find_custom(list, data, func) g_slist_find_custom(list, data, func)
+#define fw_slist_insert_sorted(list, data, func) g_slist_insert_sorted(list, data, func)
+#define fw_slist_foreach(list, func, user_data) g_slist_foreach(list, func, user_data)
+#define fw_slist_free(list) g_slist_free(list)
+#define fw_slist_remove_link(list, link) g_slist_remove_link(list, link)
+#define fw_slist_next(list) g_slist_next(iist)
+
+#define FW_HASH_TABLE GHashTable
+
+#define fw_hash_table_new(hash_func, equal_func) g_hash_table_new(hash_func, equal_func)
+#define fw_hash_table_destory(hash_table) g_hash_table_destroy(hash_table)
+#define fw_hash_table_lookup(hasn_table, key) g_hash_table_lookup(hasn_table, key)
+#define fw_hash_table_insert(hash_table, key, valaue) g_hash_table_insert(hash_table, key, value)
+#define fw_hash_table_remove(hash_table, key) g_hash_table_remove(hash_table, key)
+
+#include <stdbool.h>
+#define FW_BOOL bool
+
+#endif /* FW_COMMON_H_ */
diff --git a/framework/include/Utility/fw_compress.h b/framework/include/Utility/fw_compress.h
new file mode 100644
index 0000000..71ebfb3
--- /dev/null
+++ b/framework/include/Utility/fw_compress.h
@@ -0,0 +1,78 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef FW_COMPRESS_H_
+#define FW_COMPRESS_H_
+
+/**
+ * @file fw_compress.h
+ * @brief Provides folder de/compress operations
+ */
+
+/**
+ * @brief Enumeration of compress result
+ */
+typedef enum {
+ FW_COMPRESS_SUCCESS = 1,
+ FW_COMPRESS_FAIL
+} FW_COMPRESS_RESULT;
+
+/**
+ * @brief Enumeration of compress type
+ */
+typedef enum {
+ FW_COMPRESS_TYPE_TAR = 1,
+ FW_COMPRESS_TYPE_ZIP
+} FW_COMPRESS_TYPE;
+
+/**
+ * @brief Compresses folder into desired format
+ * @param[in] type Type of compress in FW_COMPRESS_TYPE type of value
+ * @param[in] input_directory_path Folder path to compress
+ * @param[in] output_file_path Path to put comressed file
+ # @return FW_COMPRESS_RESULT type of value
+ */
+FW_COMPRESS_RESULT FW_COMPRESS(FW_COMPRESS_TYPE type, const char *input_directory_path, const char *output_file_path);
+
+/**
+ * @brief Decreases reference count of parameter spec
+ * @param[in] type Type of compress in FW_COMPRESS_TYPE type of value
+ * @param[in] input_file_path Compressed file path to decompress
+ * @param[in] output_direcory_path Path to put decompressed folder
+# @return FW_COMPRESS_RESULT type of value
+ */
+FW_COMPRESS_RESULT FW_UNCOMPRESS(FW_COMPRESS_TYPE type, const char *input_file_path, const char *output_direcory_path);
+
+#endif /* FW_COMPRESS_H_ */
diff --git a/framework/include/Utility/fw_list.h b/framework/include/Utility/fw_list.h
new file mode 100644
index 0000000..b45d397
--- /dev/null
+++ b/framework/include/Utility/fw_list.h
@@ -0,0 +1,70 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef FW_LIST_H_
+#define FW_LIST_H_
+
+/**
+ * @file fw_async_queue.h
+ * @brief provide DataStructure - Linked List
+ */
+
+#define prefetch(link)
+
+#define fw_list_iter(iter, head_ptr) \
+for (iter = (head_ptr)->next; (prefetch(iter->next) iter != (head_ptr)); \
+ iter = iter->next)
+
+
+/**
+ * @brief Node structure of Double Linked List
+ */
+typedef struct fw_list_node_s fw_list_node_t;
+struct fw_list_node_s {
+ fw_list_node_t *next;
+ fw_list_node_t *prev;
+};
+
+void fw_list_add_node(fw_list_node_t *new_node, fw_list_node_t *head_ptr);
+
+void fw_list_delete_node(fw_list_node_t *target_node);
+
+void fw_list_move_node(fw_list_node_t *list, fw_list_node_t *head_ptr);
+
+int fw_list_node_count(const fw_list_node_t *head_ptr);
+
+void fw_list_init(fw_list_node_t *node_ptr);
+
+#endif /* FW_LIST_H_ */
diff --git a/framework/include/Utility/fw_log.h b/framework/include/Utility/fw_log.h
new file mode 100644
index 0000000..03aecf4
--- /dev/null
+++ b/framework/include/Utility/fw_log.h
@@ -0,0 +1,152 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef LOG_H_
+#define LOG_H_
+
+/**
+ * @file fw_log.h
+ * @brief Provides various of DLOG wrappers
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @brief Enumeration of log priority level
+ */
+ typedef enum fw_log_priority_e {
+ FW_LOG_UNKNOWN = 0,
+ /**< Unknown level */
+ FW_LOG_DEFAULT, /**< Default level */
+ FW_LOG_VERBOSE, /**< Verbose level */
+ FW_LOG_DEBUG, /**< Debug level */
+ FW_LOG_INFO, /**< Info level */
+ FW_LOG_WARN, /**< Warn level */
+ FW_LOG_ERROR, /**< Error level */
+ FW_LOG_FATAL, /**< Fatal level */
+ FW_LOG_SILENT /**< Silent level */
+ } fw_log_priority_t;
+
+/**
+ * @brief Terminal option for character coloring
+ */
+#define FW_TM_OPT_RED_WORD "\033[31m"
+#define FW_TM_OPT_GREEN_WORD "\033[32m"
+#define FW_TM_OPT_YELLOW_WORD "\033[33m"
+#define FW_TM_OPT_BLUE_WORD "\033[34m"
+#define FW_TM_OPT_PURPLE_WORD "\033[35m"
+#define FW_TM_OPT_WHITE_WORD "\033[37m"
+
+/**
+ * @brief Terminal option for background coloring
+ */
+#define FW_TM_OPT_RED_BACKGROUND "\033[41m"
+#define FW_TM_OPT_GREEN_BACKGROUND "\033[42m"
+#define FW_TM_OPT_YELLOW_BACKGROUND "\033[43m"
+#define FW_TM_OPT_BLUE_BACKGROUND "\033[44m"
+#define FW_TM_OPT_PURPLE_BACKGROUND "\033[45m"
+#define FW_TM_OPT_WHITE_BACKGROUND "\033[47m"
+
+/* common interface */
+#ifndef NDEBUG
+
+/**
+ * @brief Macro with pre-defined priority level
+ */
+#define FW_LOGV(...) FW_LOG(FW_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)
+#define FW_LOGD(...) FW_LOG(FW_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
+#define FW_LOGI(...) FW_LOG(FW_LOG_INFO, LOG_TAG, __VA_ARGS__)
+
+#else
+
+/**
+ * @brief Macro with pre-defined priority level
+ */
+#define FW_LOGV(...)
+#define FW_LOGD(...)
+#define FW_LOGI(...)
+
+#endif /* NDEBUG */
+
+/**
+ * @brief Macro with pre-defined priority level
+ */
+#define FW_LOGW(...) FW_LOG(FW_LOG_WARN, LOG_TAG, __VA_ARGS__)
+#define FW_LOGE(...) FW_LOG(FW_LOG_ERROR, LOG_TAG, __VA_ARGS__)
+#define FW_LOGF(...) FW_LOG(FW_LOG_FATAL, LOG_TAG, __VA_ARGS__)
+
+/**
+ * @brief Macro with pre-defined priority level and terminal option
+ */
+#ifndef NDEBUG
+#define FW_LOGV_WITH_TERMINAL_OPTION(TM_OPT, ...) FW_LOG_WITH_TERMINAL_OPTION(FW_LOG_VERBOSE, LOG_TAG, TM_OPT, __VA_ARGS__)
+#else
+#define FW_LOGV_WITH_TERMINAL_OPTION(TM_OPT, ...)
+#endif
+#define FW_LOGD_WITH_TERMINAL_OPTION(TM_OPT, ...) FW_LOG_WITH_TERMINAL_OPTION(FW_LOG_DEBUG, LOG_TAG, TM_OPT, __VA_ARGS__)
+#define FW_LOGI_WITH_TERMINAL_OPTION(TM_OPT, ...) FW_LOG_WITH_TERMINAL_OPTION(FW_LOG_INFO, LOG_TAG, TM_OPT, __VA_ARGS__)
+#define FW_LOGW_WITH_TERMINAL_OPTION(TM_OPT, ...) FW_LOG_WITH_TERMINAL_OPTION(FW_LOG_WARN, LOG_TAG, TM_OPT, __VA_ARGS__)
+#define FW_LOGE_WITH_TERMINAL_OPTION(TM_OPT, ...) FW_LOG_WITH_TERMINAL_OPTION(FW_LOG_ERROR, LOG_TAG, TM_OPT, __VA_ARGS__)
+#define FW_LOGF_WITH_TERMINAL_OPTION(TM_OPT, ...) FW_LOG_WITH_TERMINAL_OPTION(FW_LOG_FATAL, LOG_TAG, TM_OPT, __VA_ARGS__)
+
+/**
+ * @brief Macro with no concern about file/funn name and line number
+ */
+#define FW_LOG(LOG_PRIORITY, TAG, FORMAT...) \
+ _fw_log(LOG_PRIORITY, TAG, 0, __FILE__, __func__, __LINE__, FORMAT)
+#define FW_LOG_WITH_TERMINAL_OPTION(LOG_PRIORITY, TAG, TM_OPT, FORMAT...) \
+ _fw_log(LOG_PRIORITY, TAG, TM_OPT, __FILE__, __func__, __LINE__, FORMAT)
+
+/* internal function */
+
+/**
+ * @brief Decreases reference count of parameter spec
+ * @param[in] prio Priority in fw_log_priority_t type
+ * @param[in] log_tag Log tag to be displayed under
+ * @param[in] terminal_option Terminal option such as character color or background color
+ * @param[in] file_path Source file path
+ * @param[in] func_name Func name
+ * @param[in] line Line number
+ * @param[in] format Printf format
+ * @param[in] ... VA_LIST
+ */
+ void _fw_log(int prio, const char *log_tag, const char *terminal_option, const char *file_path, const char *func_name, const unsigned int line, const char *format, ...);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* LOG_H_ */
diff --git a/framework/include/Utility/fw_mainloop.h b/framework/include/Utility/fw_mainloop.h
new file mode 100644
index 0000000..c3c306a
--- /dev/null
+++ b/framework/include/Utility/fw_mainloop.h
@@ -0,0 +1,49 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef FW_MAINLOOP_H_
+#define FW_MAINLOOP_H_
+
+typedef void (*Callback_Rutine) (void *data);
+
+void register_Callback2MainLoop(Callback_Rutine callback, void *data);
+
+void run_MainLoop();
+
+void stop_MainLoop();
+
+int isRunning_MainLoop();
+
+#endif /* FW_MAINLOOP_H_ */
diff --git a/framework/include/Utility/fw_ref.h b/framework/include/Utility/fw_ref.h
new file mode 100644
index 0000000..bd88359
--- /dev/null
+++ b/framework/include/Utility/fw_ref.h
@@ -0,0 +1,110 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef FW_REF_H_
+#define FW_REF_H_
+
+#include <stdbool.h>
+
+/**
+ * @file fw_ref.h
+ * @brief Provides conversion service from regular object to referenced object
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @brief Function which is called when need to alloc some object
+ * @param[in] void Object to alloc
+ */
+ typedef void *(*ALLOC_FUNCTION) (void);
+
+/**
+ * @brief Function which is called when need to free some object
+ * @param[in] void* Object to free
+ */
+ typedef void (*FREE_FUNCTION) (void *);
+
+/**
+ * @brief Structure of referenced object
+ */
+ typedef struct refObject_s {
+ int refcount; /**< Reference count */
+ void *data; /**< Void pointer for original regular object */
+ FREE_FUNCTION free_func;/**< Free function */
+ } refObject_t;
+
+/**
+ * @brief Creates referenced object using given data with void pointer and function pointer for free logic
+ * @param[in] data Data to maintain reference information for
+ * @param[in] data_free_func Function pointer for free logic
+ * @return Referenced object in refObject_t type of structure
+ */
+ refObject_t *create_refObject(void *data, FREE_FUNCTION data_free_func);
+
+/**
+ * @brief Returns referenced object using already referenced object and just increase reference count
+ * @param[in] object Referenced object to increase ref count by 1
+ * @return Referenced object in refObject_t type of structure
+ */
+ refObject_t *getRef(refObject_t *object);
+
+/**
+ * @brief Returns original object taking from referenced object
+ * @param[in] object Referenced object to take original object from
+ */
+ void *getData(refObject_t *object);
+
+/**
+ * @brief Compares if two refereced object has same original object
+ * @param[in] object1 Referenced object to compare with
+ * @param[in] object2 Referenced object to compare with
+ * @return 1 when two are same, otherwise 0
+ */
+ bool same_ref(refObject_t *object1, refObject_t *object2);
+
+/**
+ * @brief Decrease reference count of given referenced object
+ * @remarks The object will be freed in case reference count becomes 0
+ * @param[in] pRef Referenced object to decrease ref count by 1
+ */
+ void unref_refObject(refObject_t *pRef);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* FW_REF_H_ */
diff --git a/framework/include/Utility/fw_sequential_id_provider.h b/framework/include/Utility/fw_sequential_id_provider.h
new file mode 100644
index 0000000..368cd29
--- /dev/null
+++ b/framework/include/Utility/fw_sequential_id_provider.h
@@ -0,0 +1,156 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef FW_SEQUENTIAL_ID_PROVIDER_H_
+#define FW_SEQUENTIAL_ID_PROVIDER_H_
+
+#include <stdbool.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file fw_sequential_id_provider.h
+ * @brief Support to generate unique ID
+ */
+
+/**
+ * @brief Enumerations of error codes for Id provider
+ */
+ typedef enum id_provider_error id_provider_error_t;
+ enum id_provider_error {
+ ID_PROVIDER_OK = 0, /**< successful */
+
+ ID_PROVIDER_NOT_EXIST_ID, /**< not exist id */
+ ID_PROVIDER_OUT_OF_ID_RANGE, /**< out of id range */
+ ID_PROVIDER_NOT_ENOUGH_ID, /**< full assigned */
+ ID_PROVIDER_NOT_EXIST_PAGE, /**< already exist page */
+ ID_PROVIDER_NOT_ENOUGH_MEMORY, /**< not enough memory */
+ ID_PROVIDER_ALREADY_TRACKING_MODE_ON, /**< already tracking mode on status */
+ ID_PROVIDER_ALREADY_TRACKING_MODE_OFF, /**< already tracking mode off status */
+ ID_PROVIDER_PERSISTENT_CREATE_ERROR, /**< storage create fail */
+ ID_PROVIDER_PERSISTENT_NOT_EXIST_PAGE /**< not exist page in storage */
+ };
+
+/**
+ * @brief Structure of ID Provider
+ */
+ typedef struct id_provider id_provider_t;
+
+/**
+ * @brief create new id provider and register to F/W storage
+ * @param[in] code ID of id provider - this described in F/W configuration file
+ * @param[in] id_max max ID count possible id provider generate - this described in F/W configuration file
+ * @param[in] log2_page_size
+ * @return ID_PROVIDER_OK on success, otherwise a error code.
+ * @see id_provider_create()
+ */
+ id_provider_error_t id_persistent_provider_create(unsigned int code, unsigned int id_max, unsigned int log2_page_size);
+
+/**
+ * @brief load id provider from F/W id_provider_tbl
+ * @param[in] code ID of id provider - this described in F/W configuration file
+ * @param[in] support_thread_safety whether thread safety or not
+ * @return id_provider_t * on success, otherwise a null pointer.
+ */
+ id_provider_t *id_persistent_provider_load(unsigned int code, bool support_thread_safety);
+
+/**
+ * @brief register updated id provider to F/W id_provider_tbl
+ * @param[in] pId_provider updated ID provider structure
+ * @return ID_PROVIDER_OK on success, otherwise a error code.
+ */
+ id_provider_error_t id_persistent_provider_update(id_provider_t *pId_provider);
+
+/**
+ * @brief create new id provider
+ * @remarks very similar to @ref id_persistent_provider_create(). this function use only memory but F/W storage.
+ * @param[in] id_max max ID count possible id provider generate - this described in F/W configuration file
+ * @param[in] log2_page_size
+ * @param[in] support_thread_safety whether thread safety or not
+ * @return id_provider_t * on success, otherwise a null pointer.
+ * @see id_persistent_provider_create()
+ */
+ id_provider_t *id_provider_create(unsigned int id_max, unsigned int log2_page_size, bool support_thread_safety);
+
+/**
+ * @brief destroy id provider
+ * @remarks common interface for both persistence mode and memory mode
+ * @param[in] pId_provider expected to destroyed id provider
+ */
+ void id_provider_destroy(id_provider_t *pId_provider);
+
+/**
+ * @brief tracking bit of id provider -> ON
+ * @param[in] pId_provider id provider
+ * @return ID_PROVIDER_OK on success, otherwise a error code.
+ */
+ id_provider_error_t id_provider_tracking_mode_on(id_provider_t *pId_provider);
+
+/**
+ * @brief tracking bit of id provider -> OFF
+ * @param[in] pId_provider id provider
+ * @return ID_PROVIDER_OK on success, otherwise a error code.
+ */
+ id_provider_error_t id_provider_tracking_mode_off(id_provider_t *pId_provider);
+
+/**
+ * @brief generate new unique ID
+ * @param[in] pId_provider id provider
+ * @param[out] new_id generated unique ID
+ * @return id_provider_t * on success, otherwise a null pointer.
+ */
+ id_provider_error_t id_provider_provide_id(id_provider_t *pId_provider, unsigned int *new_id);
+
+/**
+ * @brief delete unique ID
+ * @param[in] pId_provider id provider
+ * @param[in] id expected to deleted ID
+ * @return id_provider_t * on success, otherwise a null pointer.
+ */
+ id_provider_error_t id_provider_delete_id(id_provider_t *pId_provider, unsigned int id);
+
+/**
+ * @brief get number of IDs that can be issued
+ * @param[in] pId_provider id provider
+ * @return number of IDs
+ */
+ unsigned int id_provider_get_total_free_cnt(id_provider_t *pId_provider);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* FW_SEQUENTIAL_ID_PROVIDER_H_ */
diff --git a/framework/include/Utility/fw_sequential_id_provider_internal.h b/framework/include/Utility/fw_sequential_id_provider_internal.h
new file mode 100644
index 0000000..9c9e103
--- /dev/null
+++ b/framework/include/Utility/fw_sequential_id_provider_internal.h
@@ -0,0 +1,175 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef FW_SEQUENTIAL_ID_PROVIDER_INTERNAL_H_
+#define FW_SEQUENTIAL_ID_PROVIDER_INTERNAL_H_
+
+#include <glib.h>
+#include "fw_list.h"
+#include "fw_sequential_id_provider.h"
+
+#define ID_PAGE_CNT(ID_MAX_LIMIT, BITS_PER_PAGE) (((ID_MAX_LIMIT) + 1 + (BITS_PER_PAGE) - 1))/(BITS_PER_PAGE) /* since 0, 1, ... ID_MAX_LIMIT */
+#define BITS_PER_PAGE(PAGE_SIZE) ((PAGE_SIZE) * 8)
+#define BITS_PER_PAGE_MASK(BITS_PER_PAGE) ((BITS_PER_PAGE) - 1)
+#define DIVIDE_INT_ROUND_UP(NUM1, NUM2) (((NUM1) + (NUM2) - 1)/(NUM2))
+
+unsigned int __calculate_free_bit_cnt(char *bits, unsigned int bit_cnt);
+inline bool __is_bit_on(unsigned int offset, char *bits);
+inline bool __is_bit_off(unsigned int offset, char *bits);
+inline void __set_bit_on(unsigned int offset, char *bits);
+inline void __set_bit_off(unsigned int offset, char *bits);
+
+typedef unsigned int id_page_flag_t;
+#define ID_PAGE_FLAG_UNKNOWN 0x00
+#define ID_PAGE_FLAG_UNCHANGED 0x01
+#define ID_PAGE_FLAG_ADD 0x02
+#define ID_PAGE_FLAG_DELETE 0x04
+#define ID_PAGE_FLAG_UPDATE 0x08
+
+typedef struct id_page id_page_t;
+struct id_page {
+ fw_list_node_t link;
+ id_page_flag_t flag;
+ unsigned int page_index;
+ unsigned int free_bit_cnt;
+ unsigned int page_bit_cnt;
+ char *bits;
+};
+
+id_page_t *id_page_alloc(id_page_flag_t flag, unsigned int page_index, unsigned int free_bit_cnt, unsigned int page_bit_cnt, char *bits);
+id_page_t *id_page_alloc_new_page(unsigned int page_index, unsigned int page_bit_cnt);
+id_page_t *id_page_load(unsigned int code, unsigned int page_index, unsigned int page_bit_cnt);
+void id_page_free(id_page_t *pId_page);
+
+inline bool id_page_is_empty(id_page_t *pId_page);
+inline void id_page_set_flag(id_page_t *pId_page, id_page_flag_t flag);
+inline id_page_flag_t id_page_get_flag(id_page_t *pId_page);
+inline bool id_page_has_same_flag(id_page_t *pId_page, id_page_flag_t flag);
+
+inline bool id_page_is_unknown_flag(id_page_t *pId_page);
+inline bool id_page_is_add_flag(id_page_t *pId_page);
+inline bool id_page_is_delete_flag(id_page_t *pId_page);
+inline bool id_page_is_update_flag(id_page_t *pId_page);
+inline bool id_page_is_unchanged_flag(id_page_t *pId_page);
+
+inline unsigned int id_page_get_page_index(id_page_t *pId_page);
+inline void id_page_set_page_index(id_page_t *pId_page, unsigned int index);
+
+inline bool id_page_is_bit_on(id_page_t *pId_page, unsigned int offset);
+inline bool id_page_is_bit_off(id_page_t *pId_page, unsigned int offset);
+/* return true when success */
+inline bool id_page_set_bit_on(id_page_t *pId_page, unsigned int offset);
+/* return true when success */
+inline bool id_page_set_bit_off(id_page_t *pId_page, unsigned int offset);
+
+bool id_page_find_next_free_offset(id_page_t *id_page, unsigned int search_start_offset, unsigned int *next_free_offset);
+
+typedef struct id_provider_change_tracking_s id_provider_change_tracking_t;
+struct id_provider_change_tracking_s {
+ fw_list_node_t id_page_add_list_head;
+ fw_list_node_t id_page_update_list_head;
+ fw_list_node_t id_page_delete_list_head;
+ fw_list_node_t id_page_unchanged_list_head;
+};
+
+id_provider_change_tracking_t *id_provider_change_tracking_alloc();
+void id_provider_change_tracking_free(id_provider_change_tracking_t *pTracking);
+inline fw_list_node_t *id_provider_change_tracking_get_list(id_provider_change_tracking_t *pTracking, id_page_flag_t flag);
+
+struct id_provider {
+ bool persistent_mode;
+ unsigned int code; /* only used in persistent mode */
+
+ bool tracking;
+
+ bool support_thread_safety;
+ GMutex *mutex;
+ unsigned int id_max;
+
+ unsigned int log2_page_size;
+ unsigned int page_size;
+ unsigned int bits_per_page;
+
+ unsigned int last_id;
+
+ unsigned int total_free_cnt;
+
+ unsigned int id_page_cnt;
+ id_page_t **id_page_array;
+
+ id_provider_change_tracking_t *pTracking;
+};
+
+id_provider_t *id_provider_create_internal(bool persistent_mode, unsigned int code, unsigned int total_free_bit_cnt, unsigned int id_max, unsigned int log2_page_size, bool support_thread_safety);
+
+/* initial routine */
+inline void id_provider_init_routine();
+
+/* lock interface */
+inline void id_provider_lock(id_provider_t *pId_provider);
+inline void id_provider_unlock(id_provider_t *pId_provider);
+
+/* validation of id & page index */
+inline bool id_provider_is_valid_id_range(id_provider_t *pId_provider, unsigned int id);
+inline bool id_provider_is_valid_page_index(id_provider_t *pId_provider, unsigned int id_page_index);
+
+/* calculation */
+inline bool id_provider_is_last_page_index(id_provider_t *pId_provider, unsigned int id_page_index);
+inline unsigned int id_provider_calculate_id_page_array_index(id_provider_t *pId_provider, unsigned int id);
+inline id_provider_error_t id_provider_calculate_page_cnt_for_id_page(id_provider_t *pId_provider, unsigned int id_page_index, unsigned int *page_cnt);
+inline unsigned int id_provider_calculate_offset_in_page(unsigned int id, unsigned int bits_per_page);
+inline unsigned int id_provider_calculate_id(id_provider_t *pProvider, unsigned int id_page_index, unsigned int offset);
+
+/* fetch id page */
+inline id_provider_error_t id_provider_fetch_id_page_by_index(id_provider_t *pId_provider, unsigned int index, id_page_t **ppId_page);
+inline id_provider_error_t id_provider_fetch_id_page(id_provider_t *pId_provider, unsigned int id, id_page_t **ppId_page);
+
+/* id page management */
+inline id_provider_error_t id_provider_set_id_page_index(id_provider_t *pId_provider, id_page_t *pId_page, unsigned int index);
+
+void id_provider_move_id_page(id_provider_t *pId_provider, id_page_t *id_page, id_page_flag_t next);
+void id_provider_remove_id_page(id_provider_t *pId_provider, id_page_t *id_page);
+id_page_t *id_provider_add_id_page(id_provider_t *pId_provider, unsigned int page_index);
+id_provider_error_t id_provider_load_id_page(id_provider_t *pId_provider, unsigned int page_index, id_page_t **id_page);
+
+bool id_provider_set_id_page_bit_on(id_provider_t *pId_provider, id_page_t *id_page, unsigned int offset);
+bool id_provider_set_id_page_bit_off(id_provider_t *pId_provider, id_page_t *id_page, unsigned int offset);
+
+void id_provider_reset_tracking_info(id_provider_t *pId_provider);
+
+/* alloc & free */
+void id_provider_destroy_id_page_array(unsigned int id_page_cnt, id_page_t **id_page_array);
+
+#endif /* FW_SEQUENTIAL_ID_PROVIDER_INTERNAL_H_ */
diff --git a/framework/include/Utility/fw_thread.h b/framework/include/Utility/fw_thread.h
new file mode 100644
index 0000000..f816599
--- /dev/null
+++ b/framework/include/Utility/fw_thread.h
@@ -0,0 +1,74 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef FW_THREAD_H_
+#define FW_THREAD_H_
+
+#include <pthread.h>
+#include <signal.h>
+
+/* for pthread.h */
+#define FW_THREAD_T pthread_t
+#define FW_THREAD_MUTEX_T pthread_mutex_t
+#define FW_THREAD_COND_T pthread_cond_t
+#define FW_THREAD_KET_T pthread_key_t
+
+#define fw_thread_mutex_lock(mutex) pthread_mutex_lock(mutex)
+#define fw_thread_mutex_unlock(mutex) pthread_mutex_unlock(mutex)
+#define fw_thread_create(thread_id, attr, start_function, arg) pthread_create(thread_id, attr, start_function, arg)
+#define fw_thread_detach(thread_id) pthread_detach(thread_id)
+#define fw_thread_cond_signal(cond) pthread_cond_signal(cond)
+#define fw_thread_cond_wait(cond, mutex) pthread_cond_wait(cond, mutex)
+#define fw_thread_kill(thread_id, signo) pthread_kill(thread_id, signo)
+#define fw_thread_self() pthread_self()
+#define fw_thread_exit(retval) pthread_exit(retval)
+#define fw_thread_setspecific(key, value) pthread_setspecific(key, value)
+#define fw_thread_sigmask(how, new_mask, signo) pthread_sigmask(how, new_mask, signo)
+
+pthread_mutex_t *fw_alloc_init_mutex();
+void fw_free_mutex(pthread_mutex_t *mutex);
+
+pthread_cond_t *fw_alloc_init_thread_cond();
+void fw_free_thread_cond(pthread_cond_t *thread_cond);
+
+/* for signal.h */
+#define FW_SIGSET_T sigset_t
+#define FW_SIGACTION_T struct sigaction
+
+#define fw_sigaction(signum, act, oldact) sigaction(signum, act, oldact)
+#define fw_sigemptyset(set) sigemptyset(set)
+#define fw_sigaddset(set, signum) sigaddset(set, signum)
+
+#endif /* FW_THREAD_H_ */
diff --git a/framework/include/Utility/fw_time.h b/framework/include/Utility/fw_time.h
new file mode 100644
index 0000000..5143a5a
--- /dev/null
+++ b/framework/include/Utility/fw_time.h
@@ -0,0 +1,63 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef FW_TIME_H_
+#define FW_TIME_H_
+
+#include <time.h>
+
+/**
+ * @file fw_time.h
+ * @brief Provides time manipulation functionality
+ */
+
+#define FW_TIME_T time_t
+
+#define fw_time(t) time(t)
+
+#define FW_TM struct tm
+
+#define fw_localtime(time) localtime(time)
+
+#define fw_mktime(tm_time) mktime(tm_time)
+
+/**
+ * @brief Convert time stamp in second to UTC time stampà
+ * @param[in] seconds Time stamp in second
+ * @return UTC time stamp
+ */
+int FW_Convert_Seconds_To_UTC(int seconds);
+
+#endif /* FW_TIME_H_ */
diff --git a/framework/include/Utility/fw_timer.h b/framework/include/Utility/fw_timer.h
new file mode 100644
index 0000000..0f4dfbe
--- /dev/null
+++ b/framework/include/Utility/fw_timer.h
@@ -0,0 +1,71 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef FW_TIMER_H_
+#define FW_TIMER_H_
+
+#include <sys/time.h>
+#include "fw_list.h"
+
+#define FW_TIMER_MAX_LABEL_LEN 512
+
+typedef struct fw_timer_element_s fw_timer_element_t;
+typedef struct fw_timer_s fw_timer_t;
+
+typedef enum {
+ FW_TIMER_OK = 0,
+ FW_TIMER_OUT_OF_MEMORY,
+ FW_TIMER_INVALID_TIMER,
+ FW_TIMER_GETTIME_ERROR
+} FW_ERROR;
+
+struct fw_timer_element_s {
+ fw_list_node_t link;
+ struct timeval start_time;
+ struct timeval finish_time;
+ char label[FW_TIMER_MAX_LABEL_LEN + 1];
+};
+
+struct fw_timer_s {
+ fw_list_node_t element_head;
+};
+
+fw_timer_t *fw_timer_alloc();
+FW_ERROR fw_timer_start(fw_timer_t *pTimer, char *label);
+FW_ERROR fw_timer_finish(fw_timer_t *pTimer, char *label, double *passed_sec);
+FW_ERROR fw_timer_print(fw_timer_t *pTimer);
+FW_ERROR fw_timer_free(fw_timer_t *pTimer);
+
+#endif /* FW_TIMER_H_ */
diff --git a/framework/include/agent-framework/Account/Account_Error.h b/framework/include/agent-framework/Account/Account_Error.h
new file mode 100755
index 0000000..3bf87e6
--- /dev/null
+++ b/framework/include/agent-framework/Account/Account_Error.h
@@ -0,0 +1,61 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef ACCOUNT_ERROR_H_
+#define ACCOUNT_ERROR_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file Account_Error.h
+ * @brief Definition of framework error codes for Account module
+ */
+
+/**
+ * @brief Enumerations of error codes for Account module
+ */
+ typedef enum {
+ ACCOUNT_SUCCESS, /**< when Account Operation is succeed */
+ ACCOUNT_FAIL, /**< when Account Operation is failed */
+ ACCOUNT_EMPTY, /**< when Account is not exist */
+ ACCOUNT_CHANGED /**< when Account storage changed */
+ } ACCOUNT_ERROR;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* ACCOUNT_ERROR_H_ */
diff --git a/framework/include/agent-framework/DACI/DACI_Agent_Handler_Manager.h b/framework/include/agent-framework/DACI/DACI_Agent_Handler_Manager.h
new file mode 100755
index 0000000..5317d9e
--- /dev/null
+++ b/framework/include/agent-framework/DACI/DACI_Agent_Handler_Manager.h
@@ -0,0 +1,767 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ * Heeyoung Hwang <heeyoung1008.hwang@samsung.com>
+ */
+
+#ifndef DACI_AGENT_HANDLER_MANAGER_H_
+#define DACI_AGENT_HANDLER_MANAGER_H_
+
+#include "DACI_Common.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file DACI_Agent_Handler_Manager.h
+ * @brief Interface list to use framework Common DataBase
+ */
+
+/**
+ * @brief Structure of managing database connection
+ */
+ typedef struct {
+ GHashTable *daci_handlerTable; /**< agent db handler hash table */
+ pthread_mutex_t *daci_handlerTable_mutex;
+ /**< mutex for agent db handler hash table */
+ } daci_handler_mgr;
+
+/*
+ * @brief alloc the agent db handler manager
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_DB_HANDLER_MGR fail
+ */
+ DACI_RETURN DACI_Alloc_AgentDB_Handler_Mgr();
+
+/*
+ * @brief free the agent db handler manager
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_DB_HANDLER_MGR fail
+ */
+ DACI_RETURN DACI_Free_AgentDB_Handler_Mgr();
+
+/*
+ * @brief delete all accounts data from Email-Service, Contacts-Service database, Calendar-Service database, Agent database
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERRORS fail
+ */
+ DACI_RETURN DACI_Clear_All_Database_Account();
+
+/*
+ * @brief delete one account data from Email-Service, Contacts-Service database, Calendar-Service database, Agent database
+ * @param[in] accountId account id of SyncAgent
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_DELETE_LAST_ACCOUNT success ( delete last account )
+ * @retval DACI_ERRORS fail
+ */
+ DACI_RETURN DACI_Delete_All_Database_Account(int accountId);
+
+/*
+ * @brief open Agent database
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_OPEN_FAILED fail
+ */
+ DACI_RETURN DACI_Open_Agent();
+
+/*
+ * @brief close Agent database
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_CLOSE_FAILED fail
+ */
+ DACI_RETURN DACI_Close_Agent();
+
+/*
+ * @brief create Agent database
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_CLOSE_FAILED fail
+ */
+ DACI_RETURN DACI_Create_Agent_Default_Table();
+
+/*
+* @brief start Agent database transaction
+* @return operation result
+* @retval DACI_SUCCESS success
+* @retval DACI_ERR_TRANSACTION_FAILED fail
+*/
+ DACI_RETURN DACI_Begin_Transaction();
+
+/*
+* @brief finish Agent database transaction
+* @param[in] transaction commit or rollback transaction
+* @return operation result
+* @retval DACI_SUCCESS success
+* @retval DACI_ERR_TRANSACTION_FAILED fail
+*/
+ DACI_RETURN DACI_End_Transaction(DACI_TRANSACTION transaction);
+
+/*
+ * @brief insert account into account_tbl
+ * @param[in] account account info
+ * @return operation result
+ * @retval accountId success
+ * @retval -1 fail
+ */
+ int DACI_Add_Account(daci_account *account);
+
+/*
+ * @brief delete account data from Agent database
+ * @param[in] accountId accountId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Delete_Account(int accountId);
+
+/*
+ * @brief set emailAddress to account_tbl
+ * @param[in] accountId accountId
+ * @param[in] emailAddress new emailAddress
+ * @param[in] accessName access module name
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Set_Account_Email_Address(int accountId, char *emailAddress, char *accessName);
+
+/*
+ * @brief set password to account_tbl
+ * @param[in] accountId accountId
+ * @param[in] password new password
+ * @param[in] accessName access module name
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Set_Account_Password(int accountId, char *password, char *accessName);
+
+/*
+ * @brief get all accountId from account_tbl
+ * @param[out] count count of accountId
+ * @return operation result
+ * @retval array of ccountId success
+ * @retval 0 fail
+ */
+ int *DACI_Get_Account_Account_Id_List(int *count);
+
+/*
+ * @brief get emailAddress from account_tbl
+ * @param[in] accountId accountId
+ * @return operation result
+ * @retval emailAddress success
+ * @retval 0 fail
+ */
+ char *DACI_Get_Account_Email_Address(int accountId);
+
+/*
+ * @brief get password from account_tbl
+ * @param[in] accountId accountId
+ * @return operation result
+ * @retval password success
+ * @retval 0 fail
+ */
+ char *DACI_Get_Account_Password(int accountId);
+
+/*
+ * @brief checking whether the accountId exist in account_tbl
+ * @param[in] accountId accountId
+ * @return checking result
+ * @retval 1 exist
+ * @retval 0 (or error value) not exist
+ */
+ int DACI_IsExist_Account(int accountId);
+
+/*
+ * @brief insert folder into folder_tbl
+ * @param[in] folder array of folder info
+ * @param[out] count count of folder info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Add_Folder(daci_folder *folder, int count);
+
+/*
+ * @brief delete folder from folder_tbl by folderId
+ * @param[in] folderId folderId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Delete_Folder_By_Folder_Id(char *folderId);
+
+/*
+ * @brief get folderId from folder_tbl
+ * @param[in] accountId accountId
+ * @param[in] itemTypeId itemTypeId
+ * @param[in] serviceId serviceId
+ * @param[in] folderTypeId folderTypeId
+ * @return operation result
+ * @retval folderId success
+ * @retval 0 fail
+ */
+ char *DACI_Get_Folder_Folder_Id_By_Service_Id(int accountId, int itemTypeId, char *serviceId, int folderTypeId);
+
+/*
+ * @brief get folderId from folder_tbl by folderTypeId
+ * @param[in] accountId accountId
+ * @param[in] itemTypeId itemTypeId
+ * @param[in] folderTypeId folderTypeId
+ * @return operation result
+ * @retval folderId success
+ * @retval 0 fail
+ */
+ daci_id_list *DACI_Get_Folder_Folder_Id_By_Folder_Type_Id(int accountId, int itemTypeId, int folderTypeId);
+
+/*
+ * @brief get serviceId from folder_tbl
+ * @param[in] folderId folderId
+ * @return operation result
+ * @retval serviceId success
+ * @retval 0 fail
+ */
+ char *DACI_Get_Folder_Service_Id(char *folderId);
+
+/*
+ * @brief get all folder_id_list from folder_tbl by data_store_id
+ * get all the folders in account and data store
+ * @param[in] account_id account_id
+ * @param[in] itemTypeId itemTypeId
+ * @return operation result
+ * @retval array of folder_id success
+ * @retval 0 fail
+ */
+ daci_id_list *DACI_Get_Folder_Folder_Id_List_By_Item_Type_Id(int account_id, int itemTypeId);
+
+/*
+ * @brief get item from folder_tbl
+ * belonging to different account of folder get folder with the same service_id
+ * @param[in] accountId accountId
+ * @param[in] folderId folderId
+ * @param[in] count count of item info
+ * @return operation result
+ * @retval array of folder info success
+ * @retval 0 fail
+ */
+ daci_folder *DACI_Get_Folder_Mapping_Service_Id(int accountId, char *folderId, int *count);
+
+/*
+ * @brief insert item into item_tbl
+ * @param[in] item array of item info
+ * @param[in] count count of item info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Add_Item(daci_item *item, int count);
+
+/*
+ * @brief delete item from item_tbl by itemId
+ * @param[in] itemId itemId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Delete_Item_By_Item_Id(char *itemId);
+
+/*
+ * @brief delete item from item_tbl by accountId and itemTypeId
+ * @param[in] accountId accountId
+ * @param[in] itemTypeId itemTypeId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Delete_Item_By_Item_Type_Id(int accountId, int itemTypeId);
+
+/*
+ * @brief get itemId from item_tbl
+ * @param[in] accountId accountId
+ * @param[in] serviceId serviceId
+ * @param[in] itemTypeId itemTypeId
+ * @return operation result
+ * @retval itemId success
+ * @retval 0 fail
+ */
+ char *DACI_Get_Item_Item_Id(int accountId, char *serviceId, int itemTypeId);
+
+/*
+ * @brief get serviceId from item_tbl
+ * @param[in] itemId itemId
+ * @return operation result
+ * @retval serviceId success
+ * @retval 0 fail
+ */
+ char *DACI_Get_Item_Service_Id(char *itemId);
+
+/*
+ * @brief get item information from item_tbl
+ * @param[in] itemId itemId
+ * @return operation result
+ * @retval item info success
+ * @retval 0 fail
+ */
+ daci_item *DACI_Get_Item(char *itemId);
+
+/*
+ * @brief get all id in folder from item_tbl
+ * @param[in] folderId folderId
+ * @param[in] columnName columnName (COLUMN_NAME_ITEM_ID or COLUMN_NAME_SERVICE_ID)
+ * @return operation result
+ * @retval array of item id success
+ * @retval 0 fail
+ */
+ daci_id_list *DACI_Get_Item_Id_List(char *folderId, DACI_COLUMN_NAME columnName);
+
+/*
+ * @brief get item from item_tbl by accountId
+ * get all the items in account
+ * @param[in] accountId accountId
+ * @param[in] itemTypeId itemTypeId
+ * @param[in] count count of item info
+ * @return operation result
+ * @retval array of item info success
+ * @retval 0 fail
+ */
+ daci_item *DACI_Get_item_By_Account_Id(int accountId, int itemTypeId, int *count);
+
+/*
+ * @brief get item data from item_tbl and account_item_changelog_tbl
+ * Among the items that belong to the itemTypeId, Search for item info belong to the changelog
+ * @param[in] accountId accountId
+ * @param[in] itemTypeId itemTypeId
+ * @param[in] count count of item data
+ * @return operation result
+ * @retval array of item data success
+ * @retval 0 fail
+ */
+ daci_item_info *DACI_Get_Item_Info_By_Item_Type_Id(int accountId, int itemTypeId, int *count);
+
+/*
+ * @brief get item from item_tbl
+ * belonging to different account of item get item with the same service_id
+ * @param[in] accountId accountId
+ * @param[in] itemId itemId
+ * @param[in] count count of item info
+ * @return operation result
+ * @retval array of item info success
+ * @retval 0 fail
+ */
+ daci_item *DACI_Get_item_Mapping_Service_Id(int accountId, char *itemId, int *count);
+
+/*
+ * @brief get all id from item_tbl
+ * @param[in] data_store_id data_store_id
+ * @return operation result
+ * @retval array of item id success
+ * @retval 0 fail
+ */
+ daci_id_list *DACI_Get_Item_Id_List_By_Data_Store_Id(int data_store_id);
+
+/*
+ * @brief get item id list
+ * @param[in] account_id F/W account id
+ * @param[in] data_store_id data_store_id
+ * @return operation result
+ * @retval array of item id success
+ * @retval 0 fail or not exist
+ */
+ daci_id_list *DACI_Get_Item_Id_List_By_Data_Store_Id_with_AccountID(int account_id, int data_store_id);
+
+/*
+ * @brief get item id list from item_tbl and account_item_changelog_tbl
+ * Among the items that belong to the data_store_id, Search for item info belong to the changelog by operation_id
+ * @param[in] account_id account_id
+ * @param[in] data_store_id data_store_id
+ * @param[in] operation_id operation_id
+ * @return operation result
+ * @retval array of item id success
+ * @retval 0 fail
+ */
+ daci_id_list *DACI_Get_Item_Id_List_By_Operation_Id(int account_id, int data_store_id, int operation_id);
+
+/*
+ * @brief checking whether the itemId exist in item_tbl
+ * @param[in] itemId itemId
+ * @return checking result
+ * @retval 1 exist
+ * @retval 0(or error value) not exist
+ */
+ int DACI_IsExist_Item(char *itemId);
+
+/*
+ * @brief insert config into config_tbl
+ * @param[in] config config info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Add_Config(daci_config *config);
+
+/*
+ * @brief delete config from config_tbl by key
+ * @param[in] configId configId
+ * @param[in] key key
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Delete_Config_By_Key(int configId, char *key);
+
+/*
+ * @brief get config info from config_tbl by accountId
+ * get all the config in account
+ * @param[in] configId configId
+ * @param[in] count count of config info
+ * @return operation result
+ * @retval array of config info success
+ * @retval 0 fail
+ */
+ daci_config *DACI_Get_Config_By_Config_Id(int configId, int *count);
+
+/*
+ * @brief get config info from config_tbl by key
+ * @param[in] config config info (configId, key)
+ * @param[out] config config info (configId, key, value, type)
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Get_Config_By_Key(daci_config *config);
+
+/*
+ * @brief checking whether config of the config exist in config_tbl
+ * @param[in] configId configId
+ * @param[in] key key
+ * @return checking result
+ * @retval 1 exist
+ * @retval 0(or error value) not exist
+ */
+ int DACI_IsExist_Config(int configId, char *key);
+
+/*
+ * @brief insert or update config into config_tbl
+ * checking whether the config exist in config_tbl
+ * If it does not exist, insert config into config_tbl
+ * If it existed, update config into config_tbl
+ * @param[in] config config info
+ * @param[in] count count of config info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Update_Config(daci_config *config, int count);
+
+/*
+ * @brief insert itemChangelog into account_item_changelog_tbl
+ * @param[in] accountId accountId
+ * @param[in] itemChangelog array of itemChangelog info
+ * @param[in] count count of itemChangelog info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Add_Item_Changelog(int accountId, daci_item_changelog *itemChangelog, int count);
+
+/*
+ * @brief delete itemChangelog from account_item_changelog_tbl by itemId
+ * @param[in] accountId accountId
+ * @param[in] itemId itemId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Delete_Item_Changelog_By_Item_Id(int accountId, char *itemId);
+
+/*
+ * @brief delete itemChangelog from account_item_changelog_tbl by itemId list
+ * @param[in] accountId accountId
+ * @param[in] itemIdList array of itemId
+ * @param[in] count count of itemId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Delete_Item_Changelog_By_Item_Id_List(int accountId, char **itemIdList, int count);
+
+/*
+ * @brief delete itemChangelog from account_item_changelog_tbl by itemTypeId
+ * @param[in] accountId accountId
+ * @param[in] itemTypeId itemTypeId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Delete_Item_Changelog_By_Item_Type_Id(int accountId, int itemTypeId);
+
+/*
+ * @brief set operationId and syncStatus to account_item_changelog_tbl
+ * @param[in] accountId accountId
+ * @param[in] itemChangelog itemChangelog info (operationId, syncStatus, accessName, itemId)
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Set_Item_Changelog_Operation_Id(int accountId, daci_item_changelog *itemChangelog);
+
+/*
+ * @brief set syncStatus to account_item_changelog_tbl
+ * @param[in] accountId accountId
+ * @param[in] itemChangelog itemChangelog info (syncStatus, accessName, itemId)
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Set_Item_Changelog_Sync_Status(int accountId, daci_item_changelog *itemChangelog);
+
+/*
+ * @brief set SYNC_WAIT to account_item_changelog_tbl
+ * Among the items that match to the itemTypeId and belong to the folder
+ * If it existed in account_item_changelog_tbl, set SYNC_WAIT to account_item_changelog_tbl
+ * @param[in] accountId accountId
+ * @param[in] folderIdList array of folderId
+ * @param[in] folderIdCount count of folderId
+ * @param[in] itemTypeIdList array of itemTypeId
+ * @param[in] itemTypeIdCount count of itemTypeId
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Set_Item_Changelog_Wait_Status(int accountId, char **folderIdList, int folderIdCount, int *itemTypeIdList, int itemTypeIdCount);
+
+/*
+ * @brief get itemChangelog info from account_item_changelog_tbl by itemId
+ * @param[in] accountId accountId
+ * @param[in] itemChangelog itemChangelog info (itemId)
+ * @param[out] itemChangelog itemChangelog info (itemId, operationId, syncStatus, accessName)
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Get_Item_Changelog_By_Item_Id(int accountId, daci_item_changelog *itemChangelog);
+
+/*
+ * @brief checking whether the itemId exist in account_item_changelog_tbl
+ * @param[in] accountId accountId
+ * @param[in] itemId itemId
+ * @return checking result
+ * @retval 1 exist
+ * @retval 0(or error value) not exist
+ */
+ int DACI_IsExist_Item_Changelog(int accountId, char *itemId);
+
+/*
+ * @brief insert anchor into last_anchor_tbl
+ * @param[in] lastAnchor lastAnchor info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Add_Last_Anchor(daci_last_anchor *lastAnchor);
+
+/*
+ * @brief set last_anchor_server and last_anchor_client to last_anchor_tbl
+ * @param[in] lastAnchor lastAnchor info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Set_Last_Anchor(daci_last_anchor *lastAnchor);
+
+/*
+ * @brief get last_anchor_server and last_anchor_client from last_anchor_tbl by itemTypeId
+ * @param[in] accountId accountId
+ * @param[in] itemTypeId itemTypeId
+ * @param[out] count count of lastAnchor info
+ * @return operation result
+ * @retval lastAnchor info success
+ * @retval 0 fail
+ */
+ daci_last_anchor *DACI_Get_Last_Anchor_By_Item_Type_Id(int accountId, int itemTypeId, int *count);
+
+/*
+ * @brief insert mapping into mapping_tbl
+ * @param[in] mapping mapping info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Add_Mapping(daci_mapping *mapping);
+
+/*
+ * @brief delete mapping from mapping_tbl by luid
+ * @param[in] accountId accountId
+ * @param[in] luid luid
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Delete_Mapping_By_Luid(int accountId, char *luid);
+
+/*
+ * @brief get all mapping info from mapping_tbl by accountId
+ * get all the mapping info in account
+ * @param[in] accountId accountId
+ * @param[out] count count of mapping info
+ * @return operation result
+ * @retval array of mapping info success
+ * @retval 0 fail
+ */
+ daci_mapping *DACI_Get_Mapping_By_Account_Id(int accountId, int *count);
+
+/*
+ * @brief get luid from mapping_tbl by guid
+ * @param[in] accountId accountId
+* @param[in] luid luid
+ * @return operation result
+ * @retval guid guid
+ * @retval 0 fail
+ */
+ char *DACI_Get_Mapping_Guid(int accountId, char *luid);
+
+/*
+ * @brief checking whether account exist in mapping_tbl
+ * @param[in] accountId accountId
+ * @return checking result
+ * @retval 1 exist
+ * @retval 0(or error value) not exist
+ */
+ int DACI_IsExist_Mapping_By_Account_Id(int accountId);
+
+/*
+ * @brief insert id_provider into id_provider_tbl
+ * @param[in] id_provider id_provider info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Add_ID_Provider(daci_id_provider *id_provider);
+
+/*
+ * @brief get id_provider from id_provider_tbl
+ * @param[in] id_provider_code id_provider_code
+ * @param[out] id_provider id_provider info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Get_ID_Provider(unsigned int id_provider_code, daci_id_provider **id_provider);
+
+/*
+ * @brief update id_provider in id_provider_tbl
+ * @param[in] id_provider id_provider info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Update_ID_Provider(daci_id_provider *id_provider);
+
+/*
+ * @brief insert id_page into id_page_tbl
+ * @param[in] id_page id_page info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Add_ID_Page(daci_id_page *id_page, unsigned int page_byte_size);
+
+/*
+ * @brief delete id_page from id_page_tbl by page_index
+ * @param[in] id_provider_code id_provider_code
+ * @param[in] page_index page_index
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Delete_ID_Page(unsigned int id_provider_code, unsigned int page_index);
+
+/*
+ * @brief insert id_page into id_page_tbl
+ * @param[in] id_provider_code id_provider_code
+ * @param[in] page_index page_index
+ * @param[out] page_bit page_bit
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Get_ID_Page(unsigned int id_provider_code, unsigned int page_index, char **page_bit);
+
+/*
+ * @brief insert id_page into id_page_tbl
+ * @param[in] id_page id_page info
+ * @param[in] page_byte_size page_bit's byte size
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+ DACI_RETURN DACI_Update_ID_Page(daci_id_page *id_page, unsigned int page_byte_size);
+
+/*
+ * @brief add the handler pointer to handler hash table
+ * @param[in] key unique key to distinguish handler pointer
+ * @param[in] pHandler db handler pointer
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_DB_HANDLER_MGR fail
+ */
+ DACI_RETURN add_agentHandler(unsigned int key, DACI_HANDLER *pHandler);
+
+/*
+ * @brief add the handler pointer to handler hash table
+ * @param[in] key unique key to distinguish handler pointer
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_DB_HANDLER_MGR fail
+ */
+ DACI_RETURN remove_agentHandler(unsigned int key);
+
+/*
+ * @brief add the handler pointer to handler hash table
+ * @param[in] key unique key to distinguish handler pointer
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERR_DB_HANDLER_MGR fail
+ */
+ DACI_HANDLER *get_agentHandler(unsigned int key);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* DACI_AGENT_HANDLER_MANAGER_H_ */
diff --git a/framework/include/agent-framework/DACI/DACI_Common.h b/framework/include/agent-framework/DACI/DACI_Common.h
new file mode 100755
index 0000000..280e067
--- /dev/null
+++ b/framework/include/agent-framework/DACI/DACI_Common.h
@@ -0,0 +1,359 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ * Heeyoung Hwang <heeyoung1008.hwang@samsung.com>
+ */
+
+#ifndef DACI_COMMON_H_
+#define DACI_COMMON_H_
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+#include <malloc.h>
+#include <glib.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <sys/stat.h>
+#include <sqlite3.h>
+
+#include "EXT_DACI_Errors.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file DACI_Common.h
+ * @brief Common factor of Framework common database
+ */
+
+#define MO_HANDLER sqlite3
+
+#define DACI_HANDLER sqlite3
+
+#define DACI_RETRY_COUNT 10
+
+#define DACI_MAX_QUERY_LENGTH 2048
+
+#define DACI_MAX_ACCOUNT 10
+
+#define DACI_FOLDER_TYPE_COUNT 19
+
+#define DACI_ITEM_TYPE_COUNT 6
+
+#define DACI_OPERATION_TYPE_COUNT 3
+
+#define DACI_MEMORY_SET(ptr) memset(ptr, 0x00, sizeof(ptr));
+
+#define DACI_MEMORY_MALLOC(type, size, count) (type)malloc(size*count)
+
+#define DACI_MEMORY_CALLOC(type, size, count) (type)calloc(count, size)
+
+#define DACI_MEMORY_FREE(src) \
+ if (src != NULL) { \
+ free(src); \
+ src = NULL; \
+ } \
+
+#define DACI_STRDUP(src) (src == NULL) ? NULL : strdup(src);
+
+#define DACI_ATOI(src) (src == NULL) ? 0 : atoi(src);
+
+#define DACI_GET_THREAD_ID pthread_self()
+
+/**
+ * @brief rename sqlite3 connection
+ */
+ typedef sqlite3_stmt *daci_stmt;
+
+/**
+ * @brief Enumerations of database peak type
+ */
+ typedef enum {
+ PEAK_TYPE_ON = 601, /**< peak type on */
+ PEAK_TYPE_ON_N_OFF, /**< peak type N off */
+ PEAK_TYPE_OFF /**< peak type off */
+ } DACI_PEAK_TYPE;
+
+/**
+ * @brief Enumerations of database transaction
+ */
+ typedef enum {
+ TRANSACTION_COMMIT, /**< means commit */
+ TRANSACTION_ROLLBACK
+ /**< means rollback */
+ } DACI_TRANSACTION;
+
+/**
+ * @brief Enumerations of common db's table list
+ */
+ typedef enum {
+ TABLE_NAME_ACCOUNT, /**< means account_tbl */
+ TABLE_NAME_FOLDER, /**< means folder_tbl */
+ TABLE_NAME_ITEM, /**< means item_tbl */
+ TABLE_NAME_CONFIG, /**< means config_tbl */
+ TABLE_NAME_ACCOUNT_ITEM_CHANGELOG, /**< means account_item_changelog_tbl */
+ TABLE_NAME_LAST_ANCHOR, /**< means last_anchor_tbl */
+ TABLE_NAME_MAPPING, /**< means mapping_tbl */
+ TABLE_NAME_ID_PROVIDER, /**< means id_provider_tbl */
+ TABLE_NAME_ID_PAGE, /**< means id_page_tbl */
+
+ TABLE_NAME_MAX /**< count of common database's tables */
+ } DACI_TABLE_NAME;
+
+/**
+ * @brief Enumerations of common column
+ */
+ typedef enum {
+ COLUMN_NAME_ACCOUNT_ID, /**< means column, account_id */
+ COLUMN_NAME_ITEM_ID, /**< means column, item_id */
+ COLUMN_NAME_SERVICE_ID, /**< means column, service_id */
+ COLUMN_NAME_ACCESS_NAME, /**< means column, access_name */
+
+ COLUMN_NAME_MAX /**< count of common columns */
+ } DACI_COLUMN_NAME;
+
+/**
+ * @brief Enumerations of structure type concern of DACI
+ */
+ typedef enum {
+ STRUCT_TYPE_ACCOUNT, /**< means structure, daci_account */
+ STRUCT_TYPE_FOLDER, /**< means structure, daci_folder */
+ STRUCT_TYPE_ITEM, /**< means structure, daci_item */
+ STRUCT_TYPE_CONFIG, /**< means structure, daci_config */
+ STRUCT_TYPE_ITEM_CHANGELOG, /**< means structure, daci_item_changelog */
+ STRUCT_TYPE_LAST_ANCHOR, /**< means structure, daci_last_anchor */
+ STRUCT_TYPE_MAPPING, /**< means structure, daci_mapping */
+ STRUCT_TYPE_ITEM_INFO, /**< means structure, daci_item_info */
+ STRUCT_TYPE_ID_LIST, /**< means structure, daci_id_list */
+
+ STRUCT_TYPE_MAX /**< count of enumeration */
+ } DACI_STRUCT_TYPE;
+
+/**
+ * @brief Structure of table - mapped column of account_tbl
+ */
+ typedef struct {
+ int account_id; /**< account_id */
+ char *email_address; /**< email_address */
+ char *password; /**< password */
+ bool enable; /**< enable */
+ char *accessName;
+ /**< name of accessor */
+ } daci_account;
+
+/**
+ * @brief Structure of table - mapped column of folder_tbl
+ */
+ typedef struct {
+ char *folder_id; /**< F/W folder id */
+ int data_store_id;
+ /**< service data connector pluIn's ID described in F/W config file */
+ int account_id; /**< F/W account id */
+ int folder_type_id;
+ /**< data connector plugIn has this folder type id */
+ char *service_id;
+ /**< service folder id */
+ char *parent_folder_id;
+ /**< parent folder id if exist hierarchy */
+ char *access_name;
+ /**< name of accessor */
+ } daci_folder;
+
+/**
+ * @brief Structure of table - mapped column of item_tbl
+ */
+ typedef struct {
+ char *item_id; /**< F/W item id */
+ int data_store_id;
+ /**< service data connector pluIn's ID described in F/W config file */
+ int account_id; /**< F/W account id */
+ char *folder_id; /**< F/W folder id */
+ char *service_id;
+ /**< service item id */
+ char *access_name; /**< name of accessor */
+ } daci_item;
+
+/**
+ * @brief Structure of table - mapped column of config_tbl
+ */
+ typedef struct {
+ int config_id; /**< configuration id, this means account id */
+ char *key; /**< configuration key */
+ char *value; /**< configuration value */
+ char *type; /**< configuration type */
+ char *access_name; /**< name of accessor */
+ } daci_config;
+
+/**
+ * @brief Structure of table - mapped column of account_item_changelog_tbl
+ */
+ typedef struct {
+ char *item_id; /**< F/W item id */
+ int operation_id; /**< operation id - add, delete, update */
+ char *status; /**< user defined status of item */
+ char *access_name; /**< name of accessor */
+ } daci_item_changelog;
+
+/**
+ * @brief Structure of table - mapped column of last_anchor_tbl
+ */
+ typedef struct {
+ int account_id; /**< F/W account id */
+ int data_store_id; /**< service data connector pluIn's ID described in F/W config file */
+ char *last_anchor_server; /**< last anchor that server has */
+ char *last_anchor_client; /**< last anchor that client has */
+ char *access_name; /**< name of accessor */
+ } daci_last_anchor;
+
+/**
+ * @brief Structure of table - mapped column of mapping_tbl
+ */
+ typedef struct {
+ int account_id; /**< F/W account id */
+ int data_store_id; /**< service data connector pluIn's ID described in F/W config file */
+ char *luid; /**< Locally unique identifier */
+ char *guid;
+ /**< Globally unique identifier */
+ char *access_name; /**< name of accessor */
+ } daci_mapping;
+
+/**
+ * @brief Structure of Item information
+ */
+ typedef struct {
+ char *itemId; /**< F/W item id */
+ int itemTypeId; /**< service data connector pluIn's ID described in F/W config file */
+ char *serviceId; /**< service item id */
+ int operationId; /**< operation type - add, delete, update */
+ char *syncStatus; /**< user defined status of item */
+ } daci_item_info;
+
+/**
+ * @brief Structure of Item id's container
+ */
+ typedef struct {
+ int count; /**< count of id */
+ char **id; /**< real id list */
+ } daci_id_list;
+
+/**
+ * @brief Structure of table - mapped column of id_provider_tbl
+ */
+ typedef struct {
+ unsigned int id_provider_code; /**< ID of id provider - this described in F/W configuration file */
+ unsigned int id_capacity; /**< max ID count possible id provider generate - this described in F/W configuration file */
+ unsigned int bit_per_page;
+ /**< most number of bit per one page */
+ unsigned int last_id; /**< current last provided ID */
+ unsigned int free_bit_cnt;
+ /**< the number of IDs that can be issued */
+ } daci_id_provider;
+
+/**
+ * @brief Structure of table - mapped column of id_page_tbl
+ */
+ typedef struct {
+ unsigned int page_index;/**< index of page */
+ unsigned int id_provider_code; /**< ID of id provider - this described in F/W configuration file */
+ char *page_bit; /**< real construction of ID issued */
+ } daci_id_page;
+
+/*
+ * @brief free memory daci_account structure
+ * @param[in] account daci_account structure
+ * @param[in] count structure count
+ */
+ void DACI_Free_Memory_Account(daci_account *account, int count);
+
+/*
+ * @brief free memory daci_folder structure
+ * @param[in] folder daci_folder structure
+ * @param[in] count structure count
+ */
+ void DACI_Free_Memory_Folder(daci_folder *folder, int count);
+
+/*
+ * @brief free memory daci_item structure
+ * @param[in] item daci_item structure
+ * @param[in] count structure count
+ */
+ void DACI_Free_Memory_Item(daci_item *item, int count);
+
+/*
+ * @brief free memory daci_config structure
+ * @param[in] config daci_config structure
+ * @param[in] count structure count
+ */
+ void DACI_Free_Memory_Config(daci_config *config, int count);
+
+/*
+ * @brief free memory daci_item_changelog structure
+ * @param[in] itemChangelog daci_item_changelog structure
+ * @param[in] count structure count
+ */
+ void DACI_Free_Memory_Item_Changelog(daci_item_changelog *itemChangelog, int count);
+
+/*
+ * @brief free memory daci_last_anchor structure
+ * @param[in] lastAnchor daci_last_anchor structure
+ * @param[in] count structure count
+ */
+ void DACI_Free_Memory_Last_Anchor(daci_last_anchor *lastAnchor, int count);
+
+/*
+ * @brief free memory daci_mapping structure
+ * @param[in] mapping daci_mapping structure
+ * @param[in] count structure count
+ */
+ void DACI_Free_Memory_Mapping(daci_mapping *mapping, int count);
+
+/*
+ * @brief free memory daci_item_info structure
+ * @param[in] itemInfo daci_item_info structure
+ * @param[in] count structure count
+ */
+ void DACI_Free_Memory_Item_Info(daci_item_info *itemInfo, int count);
+
+/*
+ * @brief free memory daci_id_list structure
+ * @param[in] idList daci_id_list structure
+ */
+ void DACI_Free_Memory_Id_List(daci_id_list *idList);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* DACI_COMMON_H_ */
diff --git a/framework/include/agent-framework/DACI/EXT_DACI_Errors.h b/framework/include/agent-framework/DACI/EXT_DACI_Errors.h
new file mode 100755
index 0000000..c98e131
--- /dev/null
+++ b/framework/include/agent-framework/DACI/EXT_DACI_Errors.h
@@ -0,0 +1,81 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ * Heeyoung Hwang <heeyoung1008.hwang@samsung.com>
+ */
+
+#ifndef EXT_DACI_ERRORS_H_
+#define EXT_DACI_ERRORS_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file EXT_DACI_Errors.h
+ * @brief Definition of framework error codes for DACI
+ */
+
+/**
+ * @brief Enumerations of error codes for DACI
+ */
+ typedef enum _DACI_RETURN {
+ DACI_SUCCESS = 1, /**< successful */
+ DACI_ERRORS = -800, /**< fail */
+ DACI_NOT_FOUND_PLUG_IN = -801, /**< not found data connector or converter plugIn */
+ DACI_ERR_OPEN_FAILED = -802, /**< database open fail */
+ DACI_ERR_CLOSE_FAILED = -803, /**< database close fail */
+ DACI_ERR_TRANSACTION_FAILED = -804, /**< transaction fail */
+ DACI_ERR_CREATE_TABLE_FAILED = -805, /**< create table fail */
+ DACI_ERR_DROP_TABLE_FAILED = -806, /**< drop table fail */
+ DACI_ERR_QUERY_FAILED = -807, /**< process query fail */
+ DACI_ERR_NOT_OPENED = -808, /**< database not opened so fail */
+ DACI_ERR_ACCOUNT_FULL = -809, /**< exist full account */
+ DACI_ERR_DELETE_LAST_ACCOUNT = -810, /**< */
+ DACI_ERR_PRIMARY_KEY_NOT_UNIQUE = -811, /**< already exist primary key */
+ DACI_ERR_DB_HANDLER_MGR = -812, /**< database connection fail - get or create */
+ DACI_ERR_ALREADY_EXIST = -813, /**< */
+ DACI_ERR_INVALID_CONTENT = -814, /**< */
+ DACI_ERR_MEMORY_FULL = -815, /**< memory full */
+ DACI_ERR_SUB_DATA_EXIST = -816, /**< item not empty */
+ DACI_ERR_LOCKED = -817, /**< database lock */
+ DACI_ERR_MORE_DATA = -818, /**< query result has more data, used when iterating */
+ DACI_ERR_NO_DATA = -819, /**< query result not found */
+ DACI_ERR_NOT_SUPPORTED = -820, /**< */
+ DACI_ERR_NOT_EXECUTE = -821, /**< */
+ } DACI_RETURN;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* EXT_DACI_ERRORS_H_ */
diff --git a/framework/include/agent-framework/Device/EXT_DCI_Common.h b/framework/include/agent-framework/Device/EXT_DCI_Common.h
new file mode 100755
index 0000000..f7e7546
--- /dev/null
+++ b/framework/include/agent-framework/Device/EXT_DCI_Common.h
@@ -0,0 +1,75 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef DICI_COMMON_H_
+#define DICI_COMMON_H_
+
+#include "EXT_DCI_Errors.h"
+
+/**
+ * @file EXT_DCI_Common.h
+ * @brief Defines enumerations for device execution
+ */
+
+/**
+ * @brief Enumerations for state of power manager
+ */
+typedef enum {
+ LCD_NORMAL = 0,
+ LCD_DIM,
+ LCD_OFF,
+ SUSPEND,
+ POWER_OFF,
+ SETALL
+} PM_State;
+
+/**
+ * @brief Enumerations for lock state of power manager
+ */
+typedef enum {
+ GOTO_STATE_NOW = 0,
+ STAY_CUR_STATE
+} PM_Lock_State_Flag;
+
+/**
+ * @brief Enumerations for unlock state of power manager
+ */
+typedef enum {
+ SLEEP_MARGIN = 0,
+ RESET_TIMER,
+ KEEP_TIMER
+} PM_Unlock_State_Flag;
+
+#endif /* DICI_COMMON_H_ */
diff --git a/framework/include/agent-framework/Device/EXT_DCI_DevExecutor.h b/framework/include/agent-framework/Device/EXT_DCI_DevExecutor.h
new file mode 100755
index 0000000..1894545
--- /dev/null
+++ b/framework/include/agent-framework/Device/EXT_DCI_DevExecutor.h
@@ -0,0 +1,79 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ * SeongWon Shim <seongwon.shim@samsung.com>
+ */
+
+#ifndef EXT_DCI_DEVEXECUTOR_H_
+#define EXT_DCI_DEVEXECUTOR_H_
+
+#include "EXT_DCI_Common.h"
+
+/**
+ * @file EXT_DCI_DevExecutor.h
+ * @brief Defines device execution APIs
+ */
+
+/**
+ * @brief Lock a particular power-state as the current power-state
+ * @remarks If parameter 'timeout' value is 0, state of power manager is always lock until calling DCI_PM_Unlock_State()
+ * @param[in] device_plugIn_id Device PlugIn ID
+ * @param[in] state LCD_NORMAL, LCD_DIM, LCD_OFF, SUSPEND, POWER_OFF, SETALL
+ * @param[in] flag GOTO_STATE_NOW, STAY_CUR_STATE
+ * @param[in] timeout lock-timeout in milliseconds
+ * @return Operation result
+ * @retval DICI_SUCCESS Successful
+ * @retval DCI_FAIL Operation failed
+ *
+ * @code
+DCI_RETURN res = DCI_PM_Lock_State(1, LCD_OFF , STAY_CUR_STATE, 0);
+ * @endcode
+ */
+DCI_RETURN DCI_PM_Lock_State(int device_plugIn_id, PM_State state, PM_Lock_State_Flag flag, unsigned int timeout);
+
+/**
+ * @brief Unlock the power-state
+ * @param[in] device_plugIn_id Device PlugIn ID
+ * @param[in] state LCD_NORMAL, LCD_DIM, LCD_OFF, SUSPEND, POWER_OFF, SETALL
+ * @param[in] flag SLEEP_MARGIN, RESET_TIMER, KEEP_TIMER
+ * @return Operation result
+ * @retval DICI_SUCCESS Successful
+ * @retval DCI_FAIL Operation failed
+ *
+ * @code
+ DCI_RETURN res = DCI_PM_Unlock_State(1, LCD_OFF , RESET_TIMER);
+ * @endcode
+ */
+DCI_RETURN DCI_PM_Unlock_State(int device_plugIn_id, PM_State state, PM_Unlock_State_Flag flag);
+
+#endif /* EXT_DCI_DEVEXECUTOR_H_ */
diff --git a/framework/include/agent-framework/Device/EXT_DCI_DevInfo.h b/framework/include/agent-framework/Device/EXT_DCI_DevInfo.h
new file mode 100755
index 0000000..132bcbb
--- /dev/null
+++ b/framework/include/agent-framework/Device/EXT_DCI_DevInfo.h
@@ -0,0 +1,95 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef EXT_DCI_H_
+#define EXT_DCI_H_
+
+#include "EXT_DCI_Common.h"
+
+/**
+ * @file EXT_DCI_DevInfo.h
+ * @brief Defines device information APIs
+ */
+
+/**
+ * @brief Load device information on the memory
+ * @remarks Run only once at the beginning of the process
+ * @param[in] device_plugIn_id Device plugIn ID
+ * @return Operation result
+ * @retval DICI_SUCCESS Successful
+ * @retval DCI_FAIL Operation failed
+ *
+ * @code
+DCI_RETURN res = DICI_Init(1);
+ * @endcode
+ */
+DCI_RETURN DCI_Init(int device_plugIn_id);
+
+/**
+ * @brief Get particular device information on the memory
+ * @remarks Device information supported by sync-agent-framework (2012.03.19)
+ * DevID(device id), Man(manufacture), Mod(model id or model number), SwV(software version),
+ * HwV(hardware version), FwV(firmware version), OEM(original equipment manufacturer),
+ * DevTyp(device type), Lang(language), DTDV(DTD version), PDAV(PDA version),
+ * CSCV(CSC version), ModemV(modem version), KernelV(kernal version), OPCO(OPCO information)
+ * @param[in] device_plugIn_id Device plugIn ID
+ * @param[in] info_name Name of device information (see remarks)
+ * @param[out] value Value of device information
+ * @return Operation result
+ * @retval DICI_SUCCESS Successful
+ * @retval DICI_FAIL Operation failed
+ * @pre The application should be called DCI_Init()
+ *
+ * @code
+ char *value;
+ DCI_RETURN res = DICI_Get_DevInfo(1, "DevID", &value);
+ * @endcode
+ */
+DCI_RETURN DCI_Get_DevInfo(int device_plugIn_id, char *info_name, char **value);
+
+/**
+ * @brief Free memory for device information on the memory
+ * @param[in] device_plugIn_id Device plugIn ID
+ * @return Operation result
+ * @retval DICI_SUCCESS Successful
+ * @retval DICI_FAIL Operation failed
+ *
+ * @code
+DCI_RETURN res = DICI_Destroy(1);
+ * @endcode
+ */
+DCI_RETURN DCI_Destroy(int device_plugIn_id);
+
+#endif /* EXT_DCI_H_ */
diff --git a/framework/include/agent-framework/Device/EXT_DCI_Errors.h b/framework/include/agent-framework/Device/EXT_DCI_Errors.h
new file mode 100755
index 0000000..03859b3
--- /dev/null
+++ b/framework/include/agent-framework/Device/EXT_DCI_Errors.h
@@ -0,0 +1,55 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef EXT_DCI_ERRORS_H_
+#define EXT_DCI_ERRORS_H_
+
+/**
+ * @file EXT_DCI_Errors.h
+ * @brief Defines DCI errors
+ */
+
+/**
+ * @brief Enumerations for the DCI errors
+ */
+typedef enum {
+ DCI_SUCCESS = 1,
+ DCI_FAIL = -1,
+
+ DCI_NOT_EXIST_DEVINFO = -2,
+ DCI_DEVINFO_VALUE_IS_NULL = -3,
+} DCI_RETURN;
+
+#endif /* EXT_DCI_ERRORS_H_ */
diff --git a/framework/include/agent-framework/FSAPI/FSAPI_operation.h b/framework/include/agent-framework/FSAPI/FSAPI_operation.h
new file mode 100644
index 0000000..ed90aa1
--- /dev/null
+++ b/framework/include/agent-framework/FSAPI/FSAPI_operation.h
@@ -0,0 +1,216 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef FSAPI_OPERATION_H_
+#define FSAPI_OPERATION_H_
+
+#include <stdbool.h>
+#include <glib.h>
+#include <glib/gstdio.h>
+
+/**
+ * @file FSAPI_operation.h
+ * @brief Provides file system related operations such as file/folder create, delete, read, write and etc..
+ */
+
+/**
+ * @brief Check whether given file path is existing or not
+ * @remarks file path can be either a file or a folder.
+ * @param[in] filename File path you want to check
+ * @return 1 when the instance you want to check exists, otherwise 0
+ */
+int FSAPI_isExisting(const char *filename);
+
+/**
+ * @brief Provides free size and total size of file system which your file path exists on
+ * @param[in] root File path you want to check
+ * @param[out] sizeFree Free size of file system in bytes
+ * @param[out] sizeTotal Total size of file system in bytes
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_memSize(const char *root, long double *sizeFree, long double *sizeTotal);
+
+/**
+ * @brief Provides size of your file
+ * @param[in] filename File path you want to check
+ * @param[out] size Size of requested file in bytes
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileSize(const char *filename, unsigned long *size);
+
+/**
+ * @brief Provides date information of your file in character stream
+ * @remarks The return char stream format is "Y:m:d H:M:S".
+ * The Date info stream should be freed when no more in use.
+ * @param[in] filename File path you want to check
+ * @param[out] time_string Double pointer of the char variable you want to load file date info on
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileDate(const char *filename, char **time_string);
+
+/**
+ * @brief Provides file copy operation
+ * @remarks Operation will fail if destination already exists.
+ * @param[in] source Source file path
+ * @param[in] dest Destination file path
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileCopy(const char *source, const char *dest);
+
+/**
+ * @brief Provides file delete operation
+ * @param[in] filename File path to delete
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileDelete(const char *filename);
+
+/**
+ * @brief Provides file move operation
+ * @remarks Operation will fail if destination already exists.
+ * @param[in] source Source file path
+ * @param[in] dest Destination file path
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileMove(const char *source, const char *dest);
+
+/**
+ * @brief Provides file rename operation
+ * @remarks Operation will fail if destination already exists.
+ * @param[in] source Source file path
+ * @param[in] dest Destination file path
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileRename(const char *source, const char *dest);
+
+/**
+ * @brief Provides file read operation (Keeps file descriptor until reaching end of file)
+ * @remarks Need to call repeatedly with proper 'required_length' until you get TRUE value of the bool option 'isFinal'.
+ * Provided contents 'required_contents' should be freed when no more in use.
+ * @param[in] filename File path which you want to read
+ * @param[in] required_length Size to read
+ * @param[out] required_contents Char variable to load file contents on
+ * @param[out] size_return Size of invoked file contents
+ * @param[out] isFinal Boolean value to indicate whether end of file reached or not
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileRead(const char *filename, char **required_contents, unsigned long required_length, unsigned long *size_return, bool *isFinal);
+
+/**
+ * @brief Provides file read operation (Entire contents at once)
+ * @remarks Provided 'required_contents' should be freed when no more in use.
+ * @param[in] filename File path which you want to read
+ * @param[out] required_contents Char variable to load file contents on
+ * @param[out] size_return Size of invoked file contents
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileReadWhole(const char *filename, char **required_contents, unsigned long *size_return);
+
+/**
+ * @brief Provides free operation for file contents loaded from FSAPI_fileRead, FSAPI_fileReadWhole
+ * @param[in] requested_contents File contents to free
+ */
+int FSAPI_fileRead_Free(char **requested_contents);
+
+/**
+ * @brief Provides file write operation (Keeps file descriptor until finish order)
+ * @remarks Writes given contents to given file until 'isFinal' option enabled.
+ * Destination file won't be appeared until you give 'isFinal' option.
+ * Useful when writing several chunks into new file in one task.
+ * @param[in] filename File path which you want to write
+ * @param[in] contents Contents to write
+ * @param[in] length Size of the contents
+ * @param[in] isFinal Option to order operation finish
+ * @param[in] overwrite Option to order overwriting
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileWrite(const char *filename, const char *contents, unsigned long length, bool isFinal, bool overwrite);
+
+/**
+ * @brief Provides file write operation (Entire contents at once)
+ * @param[in] filename File path which you want to write
+ * @param[in] contents Contents to write
+ * @param[in] length Size of the contents
+ * @param[in] overwrite Option to order overwriting
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileWriteWhole(const char *filename, const char *contents, unsigned long length, bool overwrite);
+
+/**
+ * @brief Provides file append operation
+ * @remarks Appends given contents to given file.
+ * If given file not existing, create first and start appending.
+ * @param[in] filename File path which you want to write
+ * @param[in] contents Contents to write
+ * @param[in] length Size of the contents
+ * @param[in] overwrite Option to order overwriting
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_fileAppend(const char *filename, const char *contents, unsigned long length, bool overwrite);
+
+/**
+ * @brief Provides folder create operation
+ * @remarks All parents folder will be created along
+ * in case any upper parents folders in the ordered folder path not existing.
+ * @param[in] foldername Folder path to create
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_folderCreate(const char *foldername);
+
+/**
+ * @brief Provides folder delete operation
+ * @remarks Operation will fail in case the requested folder is not empty if 'recusive' option not given.
+ * @param[in] foldername Folder path to delete
+ * @param[in] recursive Option to delete inside recursively
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_folderDelete(const char *foldername, bool recursive);
+
+/**
+ * @brief Provides folder delete operation without deleting root of the requested folder itself
+ * @param[in] foldername Folder path to delete inside
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_folderEmptyContents(const char *foldername);
+
+/**
+ * @brief Provides folder rename operation
+ * @remarks Operation will fail if destination already exists.
+ * @param[in] source Source file path
+ * @param[in] dest Destination file path
+ * @return 1 on success, otherwise 0
+ */
+int FSAPI_folderRename(const char *source, const char *dest);
+
+#endif /* FSAPI_OPERATION_H_ */
diff --git a/framework/include/agent-framework/NetworkAccess/EXT_NA_NetworkStatus.h b/framework/include/agent-framework/NetworkAccess/EXT_NA_NetworkStatus.h
new file mode 100755
index 0000000..362cfaf
--- /dev/null
+++ b/framework/include/agent-framework/NetworkAccess/EXT_NA_NetworkStatus.h
@@ -0,0 +1,67 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef EXT_NA_NETWORKSTATUS_H_
+#define EXT_NA_NETWORKSTATUS_H_
+
+/**
+ * @file EXT_NA_NetworkStatus.h
+ * @brief Defines network status/type provided by sync-agent-framework
+ */
+
+/**
+ * @brief Enumerations for the information about current network status provided by sync-agent-framework
+ */
+typedef enum {
+ NETWORK_UNKNOWN = 0, /** initial network status */
+ NETWORK_ON, /** network connection */
+ NETWORK_OFF, /** network disconnection */
+ NETWORK_CHANGE /** change ip/proxy information */
+} FW_NETWORK_STATUS;
+
+/**
+ * @brief Enumerations for the information about current network connection type provided by sync-agent-framework
+ */
+typedef enum {
+ NETWORK_NONE = 0, /** initial network type */
+ NETWORK_3G_ON, /** network UMTS on */
+ NETWORK_3G_OFF, /** network UMTS off */
+ NETWORK_WIFI_ON, /** network WIFI on */
+ NETWORK_WIFI_ON_NOT_CONNECTED, /** network WIFI on but not connected */
+ NETWORK_WIFI_OFF, /** network WIFI off */
+ NETWORK_WIFI_3G_ON, /** network UMTS and WIFI on */
+} FW_NETWORK_TYPE;
+
+#endif /* EXT_NA_NETWORKSTATUS_H_ */
diff --git a/framework/include/agent-framework/PlatformMonitor/EXT_PMCI_Struct.h b/framework/include/agent-framework/PlatformMonitor/EXT_PMCI_Struct.h
new file mode 100755
index 0000000..c114b3f
--- /dev/null
+++ b/framework/include/agent-framework/PlatformMonitor/EXT_PMCI_Struct.h
@@ -0,0 +1,130 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef EXT_PMCI_STRUCT_H_
+#define EXT_PMCI_STRUCT_H_
+
+#include <time.h>
+
+/**
+ * @file EXT_PMCI_Struct.h
+ * @brief Defines enumerations & structures for PMCI
+ */
+
+#define DAY_CNT 7
+
+/**
+ * @brief Enumerations for the day type
+ */
+typedef enum {
+ DAY_NO_TYPE = 0x00,
+ DAY_SUN = 0x01,
+ DAY_MON = 0x02,
+ DAY_TUE = 0x04,
+ DAY_WED = 0x08,
+ DAY_THU = 0x10,
+ DAY_FRI = 0x20,
+ DAY_SAT = 0x40
+} PMCI_DAY_TYPE;
+
+/**
+ * @brief Enumerations for the repeat type
+ */
+typedef enum {
+ REPEAT_NO_TYPE = 0,
+ ONCE = 1,
+ REPEAT,
+ REPEAT_WEEKLY,
+ REPEAT_MONTHLY,
+ REPEAT_ANNUALLY,
+} PMCI_REPEAT_TYPE;
+
+/**
+ * @brief Alarm structure provided by sync-agent-framework
+ * @see PMCI_Add_Item_To_Specific_Type(), SPECIFIC_TYPE_CALLBACK
+ */
+typedef struct {
+ /* start alarm time : time to start alarm at first.
+ * format: 2011-01-02T15:13:02Z
+ */
+ char *start_alarm_time;
+
+ /* repeat type */
+ PMCI_REPEAT_TYPE repeat_type;
+
+ /* repeat value
+ * 1) repeat_type: ONCE => repeat_value: do not mean
+ * 1) repeat_type: REPEAT => repeat_value: interval time (second)
+ * 2) repeat_type: etc => repeat_value: PMCI_DAY_TYPE
+ */
+ int repeat_value;
+
+ int isDisposable;
+} pmci_alarm_t;
+
+/**
+ * @brief Incoming data (SAN) structure provided by sync-agent-framework
+ * @remarks Notification data for 'SAN Incoming' operation
+ * @see SPECIFIC_TYPE_CALLBACK
+ */
+typedef struct {
+ const char *msgBody;
+ unsigned int msgSize;
+ int version;
+} pmci_san_incoming_t;
+
+/**
+ * @brief Operation data (SAN) structure provided by sync-agent-framework
+ * @remarks Notification data for 'SAN Operation' operation
+ * @see SPECIFIC_TYPE_CALLBACK
+ */
+typedef struct {
+ int msgId;
+ int extId;
+ void *user_param;
+} pmci_san_operation_t;
+
+/**
+ * @brief Message data (SAN) structure provided by sync-agent-framework
+ * @see PMCI_Add_Item_To_Specific_Type()
+ */
+/* SAN (send message) fw struct */
+typedef struct {
+ int extId;
+ int pinCode;
+ char *msgData;
+} pmci_san_message_t;
+
+#endif /* EXT_PMCI_STRUCT_H_ */
diff --git a/framework/include/agent-framework/PlugIn/Account_Interface.h b/framework/include/agent-framework/PlugIn/Account_Interface.h
new file mode 100755
index 0000000..ceeda53
--- /dev/null
+++ b/framework/include/agent-framework/PlugIn/Account_Interface.h
@@ -0,0 +1,126 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef ACCOUNT_INTERFACE_H_
+#define ACCOUNT_INTERFACE_H_
+
+/**
+ * @file Account_Interface.h
+ * @brief Interface list in this header will be implemented plugIn developer.
+ * Implementation will operate F/W Account module.
+ */
+
+/**
+ * @brief Setting Account Repository name
+ * @remarks Repository means mapping storage, between service account ID and F/W account ID
+ * @param[in] agent_name means repository name - described in F/W config file <Agent-Key>
+ */
+void Set_AccountReposioryName(const char *agent_name);
+
+/**
+ * @brief Add account to Platform
+ * @remarks mapping platform account id with f/w account_id
+ * @param[in] fw_account_id F/W account ID
+ * @param[in] email account's email address
+ * @param[in] password account's password
+ * @param[in] create_mode whether create new Platform account or only mapping f/w account id with existed platform account
+ */
+void Add_PlatformAccount(int fw_account_id, char *email, char *password, int create_mode);
+
+/**
+ * @brief Mapping F/W account ID with service account ID
+ * @remarks You must register non-volatile storage not memory. ex) File, DataBase..
+ * @param[in] fw_account_id F/W account ID
+ * @param[in] service_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] service_account_id service account ID
+ */
+void Set_PlatformAccount_Service(int fw_account_id, int service_type, int service_account_id);
+
+/**
+ * @brief Mapping relationship is off - F/W account ID with platform account ID
+ * @remarks You must remove from storage.
+ * @param[in] fw_account_id F/W account ID
+ */
+void Del_PlatformAccount(int fw_account_id);
+
+/**
+ * @brief Mapping relationship is off - F/W account ID with service account ID
+ * @remarks You must remove from storage.
+ * @param[in] fw_account_id F/W account ID
+ * @param[in] service_type service type - service data connector pluIn's ID described in F/W config file
+ */
+void Del_PlatformAccount_Service(int fw_account_id, int service_type);
+
+/**
+ * @brief whether F/W account ID has the service account ID
+ * @param[in] fw_account_id F/W account ID
+ * @param[in] service_type service type - service data connector pluIn's ID described in F/W config file
+ * @return 1 if has, otherwise 0
+ * @retval 1 if has
+ * @retval 0 if has not
+ */
+int Has_PlatformAccount_Service(int fw_account_id, int service_type);
+
+/**
+ * @brief get service account ID mapped with F/W account ID
+ * @param[in] service_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] fw_account_id F/W account ID
+ * @return service account id if it exist mapping relationship, otherwise -100
+ * @retval service account id if it exist mapping relationship
+ * @retval -100 not exist mapping relationship
+ */
+int Get_Service_AccountID(int service_type, int fw_account_id);
+
+/**
+ * @brief get F/W account ID mapped with service account ID
+ * @param[in] service_type service type - service data connector pluIn's ID described in F/W config file
+ * @param[in] service_account_id service account ID
+ * @param[in] index possible mapping one service account with multiple F/W account, so need index of F/W account.
+ * @return F/W account id if it exist mapping relationship, otherwise -1
+ * @retval F/W account id if it exist mapping relationship
+ * @retval -1 not exist mapping relationship
+ */
+int Get_FW_AccountID(int service_type, int service_account_id, int index);
+
+/**
+ * @brief Get service account information
+ * @remarks account information type must be defined in account plugIn.
+ * @param[in] fw_account_id F/W account id
+ * @param[in] service_type service type - service data connector pluIn's ID described in F/W config file
+ * @return Account Information* defined in account plugIn on success, otherwise null pointer
+ */
+void *Get_Service_AccountInfo(int fw_account_id, int service_type);
+
+#endif /* ACCOUNT_INTERFACE_H_ */
diff --git a/framework/include/agent-framework/PlugIn/DataConnector_Interface.h b/framework/include/agent-framework/PlugIn/DataConnector_Interface.h
new file mode 100755
index 0000000..924b145
--- /dev/null
+++ b/framework/include/agent-framework/PlugIn/DataConnector_Interface.h
@@ -0,0 +1,367 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef DATACONNECTOR_INTERFACE_H_
+#define DATACONNECTOR_INTERFACE_H_
+
+#include "agent-framework/DACI/EXT_DACI_Errors.h"
+
+#include "DataConnector_Resource.h"
+
+/**
+ * @file DataConnector_Interface.h
+ * @brief Interface list in this header will be implemented plugIn developer.
+ * Implementation will operate F/W DataAdapter module.
+ */
+
+/*
+ * @brief service opening work
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Service_Open();
+
+/*
+ * @brief service closing work
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Service_Close();
+
+/*
+ * @brief start transaction for service storage
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Begin_Transaction();
+
+/*
+ * @brief end transaction for service storage
+ * @param[in] is_success 1 : commit, 0 : rollback
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN End_Transaction(int is_success);
+
+/*
+ * @brief insert item into service storage
+ * @param[in] account_id service account id
+ * @param[in] folder_id service folder_id
+ * @param[in] data service structure *
+ * @param[out] item_id success : service item_id, fail : 0
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Add_Item(int account_id, char *folder_id, void *data, char **item_id);
+
+/*
+ * @brief update item from service storage
+ * @param[in] account_id service account id
+ * @param[in] folder_id service folder_id
+ * @param[in] item_id service item_id
+ * @param[in] data service structure *
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Update_Item(int account_id, char *folder_id, char *item_id, void *data);
+
+/*
+ * @brief delete item from service storage
+ * @param[in] account_id service account id
+ * @param[in] folder_id service folder_id
+ * @param[in] item_id service id of item expected to be deleted
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Del_Item(int account_id, char *folder_id, char *item_id);
+
+/*
+ * @brief delete all items from service storage
+ * @param[in] account_id service account id
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Del_All_Items(int account_id);
+
+/*
+ * @brief get item from service storage
+ * @param[in] account_id service account id
+ * @param[in] folder_id service folder id
+ * @param[in] item_id expected to get service item id
+ * @param[out] data success : item info, fail : 0
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Get_Item(int account_id, char *folder_id, char *item_id, void **data);
+
+/*
+ * @brief insert folder into service storage
+ * @param[in] account_id service account id
+ * @param[in] folder_name folder name
+ * @param[in] folder_type folder type
+ * @param[out] folder_id success : folder_id, fail : 0
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Add_Folder(int account_id, char *folder_name, int folder_type, char **folder_id);
+
+/*
+ * @brief delete folder from service storage
+ * @param[in] account_id service account id
+ * @param[in] folder_id service folder_id
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Del_Folder(int account_id, char *folder_id);
+
+/*
+ * @brief get folder from service storage
+ * @param[in] account_id service account id
+ * @param[in] folder_id service folder id
+ * @param[out] out_folder_name success : folder name, fail : 0
+ * @param[out] out_folder_type success : folder type, fail : -1
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Get_Folder(int account_id, char *folder_id, char **out_folder_name, int *out_folder_type);
+
+/*
+ * @brief execute data into service
+ * @param[in] account_id service account id
+ * @param[in] execute_key execute key
+ * @param[in] execute_values execute values
+ * @param[out] result extension result info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail
+ */
+DACI_RETURN Execute(int account_ID, const char *execute_key, void *execute_values, void **result);
+
+/*
+ * @brief get item used count
+ * @return operation result
+ * @retval current item count success
+ * @retval error value fail : minus
+ */
+int Get_Used_Item_Count();
+
+/*
+ * @brief get item used count for folder
+ * @param[in] account_id service account id
+ * @param[in] folder_id service folder id
+ * @return operation result
+ * @retval current item count success
+ * @retval error value fail : minus
+ */
+int Get_Used_Item_Count_For_Folder(int account_id, char *folder_id);
+
+/*
+ * @brief get folder id list of a account
+ * @param[in] account_id service account id
+ * @param[out] folder_count success : folder count, fail or not exist : 0
+ * @param[out] folder_type_list success : list, fail or not exist : null pointer
+ * @return operation result
+ * @retval folder id list success
+ * @retval error value fail or not exist : null pointer
+ */
+char **Get_Folder_ID_List(int account_id, int *folder_count, int **folder_type_list);
+
+/*
+ * @brief get all account id list that service has currently
+ * @param[out] count success : account id count, fail or not exist : 0
+ * @return operation result
+ * @retval account id list success
+ * @retval error value fail or not exist : null pointer
+ */
+int *Get_Account_ID_List(int *count);
+
+/*
+ * @brief write data store items to file
+ * @param[in] account_id service account id
+ * @param[out] file_path written file_path
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail :minus
+ */
+DACI_RETURN Write_Items_To_File(int account_ID, char **file_path);
+
+/*
+ * @brief add file wrote item to data store
+ * @param[in] account_id service account_id
+ * @param[in] file_path file_path
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval error value fail : minus
+ */
+DACI_RETURN Add_File_Wrote_Items_To_Datastore(int account_ID, const char *file_path);
+
+/*
+ * @brief get added item list after specific point
+ * @param[in] account_id service account id
+ * @param[in] folder_id service folder id
+ * @param[in] changepoint specific point
+ * @param[out] changeCount added item count
+ * @return operation result
+ * @retval added item info list if exist
+ * @retval null pointer fail or not exist
+ */
+Item_Node *Get_Changed_ITEM_For_Folder_Add(int account_id, const char *folder_id, int changepoint, int *changeCount);
+
+/*
+ * @brief get deleted item list after specific point
+ * @param[in] account_id service account id
+ * @param[in] folder_id service folder id
+ * @param[in] changepoint specific point
+ * @param[out] changeCount deleted item count
+ * @return operation result
+ * @retval deleted item info list if exist
+ * @retval null pointer fail or not exist
+ */
+Item_Node *Get_Changed_ITEM_For_Folder_Del(int account_id, const char *folder_id, int changepoint, int *changeCount);
+
+/*
+ * @brief get updated item list after specific point
+ * @param[in] account_id service account id
+ * @param[in] folder_id service folder id
+ * @param[in] changepoint specific point
+ * @param[out] changeCount updated item count
+ * @return operation result
+ * @retval updated item info list if exist
+ * @retval null pointer fail or not exist
+ */
+Item_Node *Get_Changed_ITEM_For_Folder_Update(int account_id, const char *folder_id, int changepoint, int *changeCount);
+
+/*
+ * @brief get last storage change point information
+ * @return operation result
+ * @retval last storage change point information
+ */
+int Get_Last_ChangePoint();
+
+/*
+ * @brief check notification for the storage change
+ * @param[in] data user data
+ */
+void StartListening_ChangeNoti(void *data);
+
+/*
+ * @brief set callback function to handle added item to storage
+ * @param[in] callback callback function - this function is provided from F/W
+ */
+void SetCallBack_AddItem(CALLBACK_ADD_ITEM callback);
+
+/*
+ * @brief set callback function to handle deleted item to storage
+ * @param[in] callback callback function - this function is provided from F/W
+ */
+void SetCallBack_DeleteItem(CALLBACK_DEL_ITEM callback);
+
+/*
+ * @brief set callback function to handle updated item to storage
+ * @param[in] callback callback function - this function is provided from F/W
+ */
+void SetCallBack_UpdateItem(CALLBACK_UPDATE_ITEM callback);
+
+/*
+ * @brief set callback function to get service account id list mapped f/w account id
+ * @param[in] callback callback function - this function is provided from F/W
+ */
+void SetCallBack_GetAccountIDList(GET_ACCOUNTIDLIST callback);
+
+/*
+ * @brief get max item count per folder
+ * @param[in] folder_type folder type provided plug-in
+ * @return operation result
+ * @retval max item count success
+ * @retval -1 fail
+ */
+int Get_MAX_Item_Count(int folder_type);
+
+/*
+ * @brief get service data's available field length
+ * @param[in] field_name field_name provided data connector plug-In
+ * @param[in] child_field_name child_field_name provided data connector plug-In
+ * @return operation result
+ * @retval available field length success
+ * @retval -1 fail
+ */
+int Get_MAX_Field_Length(int field_name, int child_field_name);
+
+/*
+ * @brief get service data's available field count
+ * @param[in] field_name field_name provided data connector plug-In
+ * @param[in] child_field_name child_field_name provided data connector plug-In
+ * @return operation result
+ * @retval available field count success
+ * @retval -1 fail
+ */
+int Get_MAX_Field_Count(int field_name, int child_field_name);
+
+/*
+ * @brief get service data's available field value's domain
+ * @param[in] field_name field_name provided data connector plug-In
+ * @param[in] child_field_name child_field_name provided data connector plug-In
+ * @param[out] str_val when domain value is string
+ * @param[out] num_val1 when domain value is integer (ex minimum value)
+ * @param[out] num_val2 when domain value is integer (ex maximum value)
+ * @return operation result
+ * @retval 1 success
+ * @retval -1 fail
+ */
+int Get_Field_Value(int field_name, int child_field_name, char **str_val, int *num_val1, int *num_val2);
+
+/*
+ * @brief get service data's available field count
+ * @param[in] feature feature provided data connector plug-In
+ * @return operation result
+ * @retval 1 support
+ * @retval 0 not support
+ * @retval -1 fail
+ */
+int Get_Is_Support_Feature(int feature);
+
+#endif /* DATACONNECTOR_INTERFACE_H_ */
diff --git a/framework/include/agent-framework/PlugIn/DataConnector_Resource.h b/framework/include/agent-framework/PlugIn/DataConnector_Resource.h
new file mode 100755
index 0000000..48001a2
--- /dev/null
+++ b/framework/include/agent-framework/PlugIn/DataConnector_Resource.h
@@ -0,0 +1,63 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef DATACONNECTOR_RESOURCE_H_
+#define DATACONNECTOR_RESOURCE_H_
+
+/**
+ * @file DataConnector_Resource.h
+ * @brief Item id list container
+ */
+
+/**
+ * @brief Structure of Item ID Node - Linked List
+ */
+struct Item_Node {
+ char *item_id; /**< item id */
+ struct Item_Node *next; /**< next pointer */
+};
+
+typedef struct Item_Node Item_Node;
+
+typedef int (*CALLBACK_ADD_ITEM) (int accountID, int index, char *itemID, int itemType, char *folderID, int folderType);
+
+typedef int (*CALLBACK_DEL_ITEM) (int accountID, int index, char *itemID, int itemType);
+
+typedef int (*CALLBACK_UPDATE_ITEM) (int accountID, int index, char *itemID, int itemType);
+
+typedef int *(*GET_ACCOUNTIDLIST) (int service_type, int *cnt);
+
+
+#endif /* DATACONNECTOR_RESOURCE_H_ */
diff --git a/framework/include/agent-framework/PlugIn/DataConverter_Interface.h b/framework/include/agent-framework/PlugIn/DataConverter_Interface.h
new file mode 100644
index 0000000..b0533fb
--- /dev/null
+++ b/framework/include/agent-framework/PlugIn/DataConverter_Interface.h
@@ -0,0 +1,140 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef DATACONVERTER_INTERFACE_H_
+#define DATACONVERTER_INTERFACE_H_
+
+#include "agent-framework/DACI/EXT_DACI_Errors.h"
+
+#include "DataConverter_Resource.h"
+
+/**
+ * @file DataConverter_Interface.h
+ * @brief Interface list in this header will be implemented plugIn developer.
+ * Implementation will operate DataAdapter module.
+ */
+
+/**
+ * @brief convert agent type data to service structure format data
+ * @remarks agent data's type can be v-object. (vcard, vcalendar .. )
+ * @param[in] agent_data agent data
+ * @param[out] service_data created service data
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERRORS fail
+ */
+DACI_RETURN Converter(const void *agent_data, void **service_data);
+
+/**
+ * @brief convert result of the merge agent data with old service data to service structure format data
+ * @remarks agent data's type can be v-object. (vcard, vcalendar .. )
+ * @param[in] old_service_data old_service_data
+ * @param[in] agent_data agent data
+ * @param[out] new_service_data created service data
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERRORS fail
+ */
+DACI_RETURN Replace_Converter(void *old_service_data, const void *agent_data, void **new_service_data);
+
+/**
+ * @brief convert service structure format data to agent type data
+ * @remarks agent data's type can be v-object. (vcard, vcalendar .. )
+ * @param[in] service_data created service data
+ * @param[out] agent_data agent data
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERRORS fail
+ */
+DACI_RETURN Reverse_Converter(void *service_data, void **agent_data);
+
+/*
+ * @brief allocate internal object for content type
+ * @return operation result
+ * @retval internal struct pointer success
+ * @retval null pointer fail
+ */
+void *Alloc_Object();
+
+/*
+ * @brief free internal object for content type
+ * @param[in] in_object internal object pointer
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERRORS fail
+ */
+int Free_Object(void *in_object);
+
+/*
+ * @brief set value for internal object
+ * @param[in] in_object internal object pointer
+ * @param[in] key key
+ * @param[in] extension_key extension key
+ * @param[in] set_value value
+ * @return operation result
+ * @retval new object pointer success
+ * @retval null pointer fail
+ */
+void *Set_Value(void *in_object, int key, char *extension_key, void *set_value);
+
+/*
+ * @brief allocate internal object for content type
+ * @param[in] in_object internal object pointer
+ * @param[in] key key
+ * @param[in] extension_key extension key
+ * @return operation result
+ * @retval value pointer success
+ * @retval 0 fail
+ */
+void *Get_Value(void *in_object, int key, char *extension_key);
+
+/*
+ * @brief get meta infomation of internal object
+ * @return operation result
+ * @retval value pointer success
+ * @retval 0 fail
+ */
+Object_Info *Get_Obj_Info();
+
+/*
+ * @brief free infomation of internal object
+ * @param[in] obj_info object info
+ * @return operation result
+ * @retval DACI_SUCCESS success
+ * @retval DACI_ERRORS fail
+ */
+int Free_Obj_Info(Object_Info *obj_info);
+
+#endif /* DATACONVERTER_INTERFACE_H_ */
diff --git a/framework/include/agent-framework/PlugIn/DataConverter_Resource.h b/framework/include/agent-framework/PlugIn/DataConverter_Resource.h
new file mode 100644
index 0000000..1022db1
--- /dev/null
+++ b/framework/include/agent-framework/PlugIn/DataConverter_Resource.h
@@ -0,0 +1,65 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef DATACONVERTER_RESOURCE_H_
+#define DATACONVERTER_RESOURCE_H_
+
+/**
+ * @file DataConverter_Resource.h
+ * @brief Support to share structure DataConverter plugIn with F/W
+ */
+
+/**
+ * @brief Structure of Converter plugin's object's field - linked list
+ */
+struct Field_Info {
+ char *field_name; /**< field name */
+ int field_child_cnt; /**< field's child count */
+ struct Field_Info *field_child_list; /**< next field info node */
+};
+
+/**
+ * @brief Structure of Converter plugin's Object info
+ */
+typedef struct {
+ char *type; /**< object type */
+ char *version; /**< object version */
+ int field_cnt; /**< field count */
+ struct Field_Info *field_list; /**< real field list **/
+} Object_Info;
+
+typedef struct Field_Info Field_Info;
+
+#endif /* DATACONVERTER_RESOURCE_H_ */
diff --git a/framework/include/agent-framework/PlugIn/DeviceInfo_Interface.h b/framework/include/agent-framework/PlugIn/DeviceInfo_Interface.h
new file mode 100644
index 0000000..886f7f8
--- /dev/null
+++ b/framework/include/agent-framework/PlugIn/DeviceInfo_Interface.h
@@ -0,0 +1,109 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef DEVICEINFO_INTERFACE_H_
+#define DEVICEINFO_INTERFACE_H_
+
+#include <glib.h>
+#include "agent-framework/Device/EXT_DCI_Common.h"
+
+/**
+ * @file DeviceInfo_Interface.h
+ * @brief Defines plug-in interfaces about device information
+ */
+
+/**
+ * @brief Device information structure
+ * @remarks This structure is member of list (devInfo)
+ * Key(info_name) - value(value) pair
+ */
+typedef struct {
+ char *info_name;
+ char *value;
+} dici_dev_info;
+
+/**
+ * @brief Get device information in the system and load this information on the memory
+ * @param[out] devInfo List of dici_dev_info structures
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Load_DevInfo(GList **devInfo);
+
+/**
+ * @brief Get device information on the memory that user want to know
+ * @param[in] devInfo List of dici_dev_info structures
+ * @param[in] info_name Name of device information
+ * @param[out] value Value of device information
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Get_DevInfo(GList *devInfo, char *info_name, char **value);
+
+/**
+ * @brief Clear device information on the memory (free memory)
+ * @param[in] defInfo List of dici_dev_info structures
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Clear_DevInfo(GList **devInfo);
+
+/**
+ * @brief Lock a particular power-state as the current power-state
+ * @remarks If parameter 'timeout' value is 0, state of power manager is always lock until calling PM_Unlock_State()
+ * @param[in] The power state which user want to lock
+ * @param[in] Set if user want to go the requested lock state directly
+ * @param[in] Specifies lock-timeout in milliseconds
+ * @return Operation result
+ * @retval 0 Successful
+ * @retval -1 Operation failed
+ * @see /Device/EXT_DCI_Common.h
+ */
+int PM_Lock_State(PM_State state, PM_Lock_State_Flag flag, unsigned int timeout);
+
+/**
+ * @brief Unlock the power-state
+ * @param[in] Specifies the power state which user want to unlock
+ * @param[in] Set if user want to go to the requested state directly after unlocking (not supported yet)
+ * @return Operation result
+ * @retval 0 Succesful
+ * @retval -1 Operation failed
+ */
+int PM_Unlock_State(PM_State state, PM_Unlock_State_Flag flag);
+
+#endif /* DEVICEINFO_INTERFACE_H_ */
diff --git a/framework/include/agent-framework/PlugIn/NetworkAccess_Interface.h b/framework/include/agent-framework/PlugIn/NetworkAccess_Interface.h
new file mode 100644
index 0000000..12321d0
--- /dev/null
+++ b/framework/include/agent-framework/PlugIn/NetworkAccess_Interface.h
@@ -0,0 +1,172 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef NETWORKACCESS_INTERFACE_H_
+#define NETWORKACCESS_INTERFACE_H_
+
+#include <glib.h>
+
+/**
+ * @file NetworkAccess_Interface.h
+ * @brief Defines plug-in interfaces about network access
+ */
+
+/**
+ * @brief Open network connection
+ * @param[out] session Network session information
+ * @param[in] proxy Proxy information
+ * @param[in] timeout User preferred time-out seconds used in sending message (ex> 30 means 30seconds)
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Open_Connection(void **session, char *proxy, int timeout);
+
+/**
+ * @brief Bind header information for each network protocol
+ * @param[in] header_info Header information for each network protocol
+ * @param[out] header_binding Header information bound each network protocol
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Header_Binding(GList *header_info, void **header_binding);
+
+/**
+ * @brief Send message to server and receive message from the server
+ * @param[in] session Network session information
+ * @param[out] header_binding Header binding information
+ * @param[in] send_msg Body message
+ * @param[in] send_msg_length Length of body message
+ * @param[out] recv_msg_size The size of received message from the server
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ * @retval -1 Cancel message
+ * @retval -8 Try again
+ * @retval -408 request timeout
+ */
+int Send_Message(void *session, void **header_binding, char *send_msg, unsigned int send_msg_length, unsigned int *recv_msg_size);
+
+/**
+ * @brief Divide header/body information using received message from the server
+ * @param[in] msg Received message from the server
+ * @param[in] msg_size The size of received message from the server
+ * @param[out] recv_header Header information of received message from the server
+ * @param[out] recv_msg Body information of received message from the server
+ * @param[out] recv_msg_length The length of body information
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Header_Unbinding(void *msg, unsigned int msg_size, GList **recv_header, unsigned char **recv_msg, unsigned int *recv_msg_length);
+
+/**
+ * @brief Close network connection
+ * @param[in] session Network session information
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Close_Connection(void *session);
+
+/**
+ * @brief Cancel operation about message being sent to the server
+ * @param[in] session Network session information
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Cancel_Message(void *session);
+
+/**
+ * @brief Just send message to the server (do not receive message from the server)
+ * @param[in] session Network session information
+ * @param[out] header_binding Header binding information
+ * @param[in] send_msg Body message
+ * @param[in] send_msg_length Length of body message
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Just_Send_Message(void *session, void **header_binding, char *send_msg, unsigned int send_msg_length);
+
+/**
+ * @brief Get network header information about specific keyword
+ * @param[in] header_info List of network header information (key-value pair)
+ * @param[in] key Specific keyword of header information that user want to know
+ * @param[out] value Value for the key
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ * @see Header_Unbinding()
+ */
+int Get_Header_Info(GList *header_info, char *key, char **value);
+
+/**
+ * @brief Set download information(download range) to download header information of specific network protocol
+ * @param[in] down_info Download header information of specific network protocol
+ * @param[in] current_down_range Download current range
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Set_Data_Download_Info(void *down_info, char *current_down_range);
+
+/**
+ * @brief Get download information(download range, filename) to download header information of specific network protocol
+ * @param[in] down_info Download header information of specific network protocol
+ * @param[out] total_down_size Total download size
+ * @param[out] current_down_range Current download range
+ * @param[out] down_file_name Download file name
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Get_Data_Download_Info(void *down_info, int *total_down_size, char **current_down_range, char **down_file_name);
+
+/**
+ * @brief Add user authentication information (id, password) to session and
+ * register authentication callback for 'authenticate' signal
+ * @param[in] session Network session information
+ * @param[in] id User id
+ * @param[in] password User password
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Add_Authentication_Info(void *session, char *id, char *password);
+
+#endif /* NETWORKACCESS_INTERFACE_H_ */
diff --git a/framework/include/agent-framework/PlugIn/PlatformMonitor_Interface.h b/framework/include/agent-framework/PlugIn/PlatformMonitor_Interface.h
new file mode 100644
index 0000000..4391d71
--- /dev/null
+++ b/framework/include/agent-framework/PlugIn/PlatformMonitor_Interface.h
@@ -0,0 +1,185 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef PLATFORMMONITOR_INTERFACE_H_
+#define PLATFORMMONITOR_INTERFACE_H_
+
+#include "PlatformMonitor_Resource.h"
+
+/**
+ * @file PlatformMonitor_Interface.h
+ * @brief Defines plug-in interfaces about service platform notification
+ */
+
+/**
+ * @brief Data structure to register at main loop of sync-agent-framework
+ */
+typedef struct {
+ char *pkg_name;
+ char *app_id;
+ void *user_data;
+} pm_register_data_t;
+
+/**
+ * @brief Check the current network status/connection type and
+ * register network notification callback function(used in sync-agent-framework) to network platform
+ * @param[in] data User data (meaningless data)
+ */
+void Init_Network_Status_Noti_Handler(void *data);
+
+/**
+ * @brief Unregister network notification callback function(used in sync-agent-framework) to network platform
+ */
+int Terminate_Network_Status_Noti_Handler(void);
+
+/**
+ * @brief Initialize to receive SAN notification from the service
+ * @remarks Connect to the service and register notification callback function to the service
+ * @param[in] data User data (meaningless data)
+ */
+void Init_Syncml_SAN_Noti_Handler(void *data);
+
+/**
+ * @brief Unregister notification callback function that was previously registered to the service and disconnect to the service
+ */
+int Terminate_Syncml_SAN_Noti_Handler(void);
+
+/**
+ * @brief Add SAN message to the service
+ * @param[in] add_item Item to add to the service
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval -1 Operation failed
+ * @see /PlatformMonitor/EXT_PMCI_Struct.h - pmci_san_message_t
+ */
+int Add_Message(void *add_item);
+
+/**
+ * @brief Remove SAN message from service
+ * @param[in] remove_item_id Id of Item that user want to remove from service
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval -1 Operation failed
+ */
+int Remove_Message(int remove_item_id);
+
+/**
+ * @brief Initialize to receive alarm notification from the service
+ * @remarks Connect to the service and register notification callback function to the service
+ * @param[in] data Structure 'pm_register_data_t'
+ */
+void Init_Alarm_Noti_Handler(void *data);
+
+/**
+ * @brief Unregister notification callback function that was previously registered to the service and disconnect to the service
+ * @remarks Not supported yet
+ */
+int Terminate_Alarm_Noti_Handler();
+
+/**
+ * @brief Add alarm data to the service
+ * @param[in] add_item Item to add to the service
+ * @param[out] out_add_item_id Id of the newly item added to the service
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ */
+int Add_Alarm(void *add_item, int *out_add_item_id);
+
+/**
+ * @brief Remove alarm data from the service
+ * @param[in] remove_item_id Id of Item that user want to remove from service
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval -1 Operation failed
+ */
+int Remove_Alarm(int remove_item_id);
+
+/**
+ * @brief Get item that user want to know from the service
+ * @param[in] get_item_id Id of the item that user want to know
+ * @param[out] out_get_item Item that user want to know
+ * @return Operation result
+ * @retval 1 Successful
+ * @retval 0 Operation failed
+ * @see /PlatformMonitor/EXT_PMCI_Struct.h - pmci_alarm_t
+ */
+int Get_Alarm(int get_item_id, void **out_get_item);
+
+/**
+ * @brief Register user callback function for network status to the service
+ * @remarks This api is used in sync-agent-framework
+ * @param[in] callback User callback function
+ */
+void SetCallBack_NetworkStatus(CALLBACK_NETWORK_STATUS callback);
+
+/**
+ * @brief Register user callback function for network cancel to the service
+ * @remarks This api is used in sync-agent-framework
+ * @param[in] callback User callback function
+ */
+void SetCallBack_NetworkAllCancel(CALLBACK_NETWORK_CANCEL callback);
+
+/**
+ * @brief Register user callback function for SAN incoming notification to the service
+ * @param[in] callback User callback function
+ */
+void SetCallBack_Syncml_SAN_Incoming(CALLBACK_SYNCML_SAN_INCOMING callback);
+
+/**
+ * @brief Register user callback function for SAN operation notification to the service
+ * @param[in] callback User callback function
+ */
+void SetCallBack_Syncml_SAN_Operation(CALLBACK_SYNCML_SAN_OPERATION callback);
+
+/**
+ * @brief Register user callback function for alarm notification to the service
+ * @param[in] callback User callback function
+ */
+void SetCallBack_Alarm(CALLBACK_ALARM callback);
+
+/**
+ * @brief Register user callback function for network on status to the service
+ * @param[in] callback User callback function
+ */
+void SetCallBack_Network_On(CALLBACK_NETWORK_ON callback);
+
+/**
+ * @brief Register user callback function for network off status to the service
+ * @param[in] callback User callback function
+ */
+void SetCallBack_Network_Off(CALLBACK_NETWORK_OFF callback);
+
+#endif /* PLATFORMMONITOR_INTERFACE_H_ */
diff --git a/framework/include/agent-framework/PlugIn/PlatformMonitor_Resource.h b/framework/include/agent-framework/PlugIn/PlatformMonitor_Resource.h
new file mode 100644
index 0000000..5965347
--- /dev/null
+++ b/framework/include/agent-framework/PlugIn/PlatformMonitor_Resource.h
@@ -0,0 +1,57 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef PLATFORMMONITOR_RESOURCE_H_
+#define PLATFORMMONITOR_RESOURCE_H_
+
+#ifdef dnet
+ typedef int (*CALLBACK_NETWORK_STATUS) (int dev_network_status, int fw_network_status, char *proxy, char *ip);
+#endif
+
+typedef int (*CALLBACK_NETWORK_STATUS) (int protocol_type, int fw_network_status, int fw_network_type, char *proxy, char *ip);
+
+typedef int (*CALLBACK_NETWORK_CANCEL) (int protocol_type);
+
+typedef int (*CALLBACK_SYNCML_SAN_INCOMING) (int item_id, void *user_data);
+
+typedef int (*CALLBACK_SYNCML_SAN_OPERATION) (int item_id, void *user_data);
+
+typedef int (*CALLBACK_ALARM) (int alarm_id, void *user_data);
+
+typedef int (*CALLBACK_NETWORK_ON) (int item_id, void *user_data);
+
+typedef int (*CALLBACK_NETWORK_OFF) (int item_id, void *user_data);
+
+#endif /* PLATFORMMONITOR_RESOURCE_H_ */
diff --git a/framework/include/agent-framework/Utility/fw_async_queue.h b/framework/include/agent-framework/Utility/fw_async_queue.h
new file mode 100644
index 0000000..b225d45
--- /dev/null
+++ b/framework/include/agent-framework/Utility/fw_async_queue.h
@@ -0,0 +1,112 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef FW_ASYNC_QUEUE_H_
+#define FW_ASYNC_QUEUE_H_
+
+#include <glib.h>
+
+/**
+ * @file fw_async_queue.h
+ * @brief provide DataStructure - asynchronous Queue
+ */
+
+/**
+ * @brief determine priority
+ * @param[in] msg1 item
+ * @param[in] msg2 compare item
+ * @param[in] user_data user_data
+ * @return
+ * @see fw_async_queue_send_msg_with_compare_priority()
+ */
+typedef int (*compare_priority_func) (const void *msg1, const void *msg2, void *user_data);
+
+/**
+ * @brief asynchronous Queue
+ */
+typedef struct fw_async_queue_s fw_async_queue_t;
+struct fw_async_queue_s {
+ GAsyncQueue *pQueue; /**< real queue data structure */
+};
+
+/**
+ * @brief create empty asynchronous Queue
+ * @return created asynchronous queue on success, otherwise a null pointer.
+ */
+fw_async_queue_t *fw_async_queue_alloc();
+
+/**
+ * @brief destroy asynchronous Queue
+ * @param[in] pQueue asynchronous Queue
+ */
+void fw_async_queue_destroy(fw_async_queue_t *pQueue);
+
+/**
+ * @brief lock asynchronous Queue
+ * @param[in] pQueue asynchronous Queue
+ */
+void fw_async_queue_lock(fw_async_queue_t *pQueue);
+
+/**
+ * @brief unlock asynchronous Queue
+ * @param[in] pQueue asynchronous Queue
+ */
+void fw_async_queue_unlock(fw_async_queue_t *pQueue);
+
+/**
+ * @brief pop item from asynchronous Queue
+ * @remarks blocking until enter item to Queue
+ * @param[in] pQueue asynchronous Queue
+ * return item on success, otherwise null pointer
+ */
+void *fw_async_queue_receive_msg(fw_async_queue_t *pQueue);
+
+/**
+ * @brief send item to asynchronous Queue
+ * @param[in] pQueue asynchronous Queue
+ * @param[in] msg item
+ */
+void fw_async_queue_send_msg(fw_async_queue_t *pQueue, void *msg);
+
+/**
+ * @brief send item to asynchronous Queue with priority
+ * @param[in] pQueue asynchronous Queue
+ * @param[in] msg item
+ * @param[in] cpf priority for callback function
+ * @param[in] user_data user_data
+ */
+void fw_async_queue_send_msg_with_compare_priority(fw_async_queue_t *pQueue, void *msg, compare_priority_func cpf, void *user_data);
+
+#endif /* FW_ASYNC_QUEUE_H_ */
diff --git a/framework/include/agent-framework/Utility/fw_compress.h b/framework/include/agent-framework/Utility/fw_compress.h
new file mode 100644
index 0000000..71ebfb3
--- /dev/null
+++ b/framework/include/agent-framework/Utility/fw_compress.h
@@ -0,0 +1,78 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef FW_COMPRESS_H_
+#define FW_COMPRESS_H_
+
+/**
+ * @file fw_compress.h
+ * @brief Provides folder de/compress operations
+ */
+
+/**
+ * @brief Enumeration of compress result
+ */
+typedef enum {
+ FW_COMPRESS_SUCCESS = 1,
+ FW_COMPRESS_FAIL
+} FW_COMPRESS_RESULT;
+
+/**
+ * @brief Enumeration of compress type
+ */
+typedef enum {
+ FW_COMPRESS_TYPE_TAR = 1,
+ FW_COMPRESS_TYPE_ZIP
+} FW_COMPRESS_TYPE;
+
+/**
+ * @brief Compresses folder into desired format
+ * @param[in] type Type of compress in FW_COMPRESS_TYPE type of value
+ * @param[in] input_directory_path Folder path to compress
+ * @param[in] output_file_path Path to put comressed file
+ # @return FW_COMPRESS_RESULT type of value
+ */
+FW_COMPRESS_RESULT FW_COMPRESS(FW_COMPRESS_TYPE type, const char *input_directory_path, const char *output_file_path);
+
+/**
+ * @brief Decreases reference count of parameter spec
+ * @param[in] type Type of compress in FW_COMPRESS_TYPE type of value
+ * @param[in] input_file_path Compressed file path to decompress
+ * @param[in] output_direcory_path Path to put decompressed folder
+# @return FW_COMPRESS_RESULT type of value
+ */
+FW_COMPRESS_RESULT FW_UNCOMPRESS(FW_COMPRESS_TYPE type, const char *input_file_path, const char *output_direcory_path);
+
+#endif /* FW_COMPRESS_H_ */
diff --git a/framework/include/agent-framework/Utility/fw_log.h b/framework/include/agent-framework/Utility/fw_log.h
new file mode 100644
index 0000000..03aecf4
--- /dev/null
+++ b/framework/include/agent-framework/Utility/fw_log.h
@@ -0,0 +1,152 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef LOG_H_
+#define LOG_H_
+
+/**
+ * @file fw_log.h
+ * @brief Provides various of DLOG wrappers
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @brief Enumeration of log priority level
+ */
+ typedef enum fw_log_priority_e {
+ FW_LOG_UNKNOWN = 0,
+ /**< Unknown level */
+ FW_LOG_DEFAULT, /**< Default level */
+ FW_LOG_VERBOSE, /**< Verbose level */
+ FW_LOG_DEBUG, /**< Debug level */
+ FW_LOG_INFO, /**< Info level */
+ FW_LOG_WARN, /**< Warn level */
+ FW_LOG_ERROR, /**< Error level */
+ FW_LOG_FATAL, /**< Fatal level */
+ FW_LOG_SILENT /**< Silent level */
+ } fw_log_priority_t;
+
+/**
+ * @brief Terminal option for character coloring
+ */
+#define FW_TM_OPT_RED_WORD "\033[31m"
+#define FW_TM_OPT_GREEN_WORD "\033[32m"
+#define FW_TM_OPT_YELLOW_WORD "\033[33m"
+#define FW_TM_OPT_BLUE_WORD "\033[34m"
+#define FW_TM_OPT_PURPLE_WORD "\033[35m"
+#define FW_TM_OPT_WHITE_WORD "\033[37m"
+
+/**
+ * @brief Terminal option for background coloring
+ */
+#define FW_TM_OPT_RED_BACKGROUND "\033[41m"
+#define FW_TM_OPT_GREEN_BACKGROUND "\033[42m"
+#define FW_TM_OPT_YELLOW_BACKGROUND "\033[43m"
+#define FW_TM_OPT_BLUE_BACKGROUND "\033[44m"
+#define FW_TM_OPT_PURPLE_BACKGROUND "\033[45m"
+#define FW_TM_OPT_WHITE_BACKGROUND "\033[47m"
+
+/* common interface */
+#ifndef NDEBUG
+
+/**
+ * @brief Macro with pre-defined priority level
+ */
+#define FW_LOGV(...) FW_LOG(FW_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)
+#define FW_LOGD(...) FW_LOG(FW_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
+#define FW_LOGI(...) FW_LOG(FW_LOG_INFO, LOG_TAG, __VA_ARGS__)
+
+#else
+
+/**
+ * @brief Macro with pre-defined priority level
+ */
+#define FW_LOGV(...)
+#define FW_LOGD(...)
+#define FW_LOGI(...)
+
+#endif /* NDEBUG */
+
+/**
+ * @brief Macro with pre-defined priority level
+ */
+#define FW_LOGW(...) FW_LOG(FW_LOG_WARN, LOG_TAG, __VA_ARGS__)
+#define FW_LOGE(...) FW_LOG(FW_LOG_ERROR, LOG_TAG, __VA_ARGS__)
+#define FW_LOGF(...) FW_LOG(FW_LOG_FATAL, LOG_TAG, __VA_ARGS__)
+
+/**
+ * @brief Macro with pre-defined priority level and terminal option
+ */
+#ifndef NDEBUG
+#define FW_LOGV_WITH_TERMINAL_OPTION(TM_OPT, ...) FW_LOG_WITH_TERMINAL_OPTION(FW_LOG_VERBOSE, LOG_TAG, TM_OPT, __VA_ARGS__)
+#else
+#define FW_LOGV_WITH_TERMINAL_OPTION(TM_OPT, ...)
+#endif
+#define FW_LOGD_WITH_TERMINAL_OPTION(TM_OPT, ...) FW_LOG_WITH_TERMINAL_OPTION(FW_LOG_DEBUG, LOG_TAG, TM_OPT, __VA_ARGS__)
+#define FW_LOGI_WITH_TERMINAL_OPTION(TM_OPT, ...) FW_LOG_WITH_TERMINAL_OPTION(FW_LOG_INFO, LOG_TAG, TM_OPT, __VA_ARGS__)
+#define FW_LOGW_WITH_TERMINAL_OPTION(TM_OPT, ...) FW_LOG_WITH_TERMINAL_OPTION(FW_LOG_WARN, LOG_TAG, TM_OPT, __VA_ARGS__)
+#define FW_LOGE_WITH_TERMINAL_OPTION(TM_OPT, ...) FW_LOG_WITH_TERMINAL_OPTION(FW_LOG_ERROR, LOG_TAG, TM_OPT, __VA_ARGS__)
+#define FW_LOGF_WITH_TERMINAL_OPTION(TM_OPT, ...) FW_LOG_WITH_TERMINAL_OPTION(FW_LOG_FATAL, LOG_TAG, TM_OPT, __VA_ARGS__)
+
+/**
+ * @brief Macro with no concern about file/funn name and line number
+ */
+#define FW_LOG(LOG_PRIORITY, TAG, FORMAT...) \
+ _fw_log(LOG_PRIORITY, TAG, 0, __FILE__, __func__, __LINE__, FORMAT)
+#define FW_LOG_WITH_TERMINAL_OPTION(LOG_PRIORITY, TAG, TM_OPT, FORMAT...) \
+ _fw_log(LOG_PRIORITY, TAG, TM_OPT, __FILE__, __func__, __LINE__, FORMAT)
+
+/* internal function */
+
+/**
+ * @brief Decreases reference count of parameter spec
+ * @param[in] prio Priority in fw_log_priority_t type
+ * @param[in] log_tag Log tag to be displayed under
+ * @param[in] terminal_option Terminal option such as character color or background color
+ * @param[in] file_path Source file path
+ * @param[in] func_name Func name
+ * @param[in] line Line number
+ * @param[in] format Printf format
+ * @param[in] ... VA_LIST
+ */
+ void _fw_log(int prio, const char *log_tag, const char *terminal_option, const char *file_path, const char *func_name, const unsigned int line, const char *format, ...);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* LOG_H_ */
diff --git a/framework/include/agent-framework/securityAssistant/EXT_SA_Encryption_Decryption.h b/framework/include/agent-framework/securityAssistant/EXT_SA_Encryption_Decryption.h
new file mode 100755
index 0000000..c58ae91
--- /dev/null
+++ b/framework/include/agent-framework/securityAssistant/EXT_SA_Encryption_Decryption.h
@@ -0,0 +1,94 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ * Sooyi Kim <sooyi.kim@samsung.com>
+ */
+
+#ifndef EXT_SA_ENCRYPTION_DECRYPTION_H_
+#define EXT_SA_ENCRYPTION_DECRYPTION_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+ typedef enum {
+
+ SA_ENCRYPTION_NO_TYPE = 0,
+ SA_ENCRYPTION_BASIC,
+ SA_ENCRYPTION_MD5,
+ } SA_ENCRYPTION_TYPE;
+
+ unsigned char *SA_Get_Encryption_Value(SA_ENCRYPTION_TYPE encryption_type, char *plain, int plain_length);
+ char *SA_Get_Decryption_Value(SA_ENCRYPTION_TYPE decryption_type, char *encryption_text);
+
+ typedef enum {
+ CRYPTOGRAHIC_HASH_FUNTION_NO_TYPE = 0,
+ CRYPTOGRAHIC_HASH_FUNTION_MD5 = 1, /* length : 16 byte */
+ CRYPTOGRAHIC_HASH_FUNTION_SHA1 = 2, /* length : 20 byte */
+
+ } CRYPTOGRAHIC_HASH_FUNTION_TYPE;
+
+ typedef enum {
+ CRYPTOGRAHIC_HASH_FUN_HMAC = 1
+ } CRYPTOGRAHIC_HASH_FUNTION_FLAGS;
+
+/*
+ * @brief get hash code
+ * @param[in] type hash function type
+ * @param[in] plain text
+ * @param[in] plain_len text length
+ * @return operation result
+ * @retval encrypt data success
+ * @retval 0 fail
+ *
+ */
+ unsigned char *SA_Encrypt_Cryptograhic_Hash(CRYPTOGRAHIC_HASH_FUNTION_TYPE type, const char *plain, int plain_len);
+
+/*
+ * @brief get hash code
+ * @param[in] type hash function type
+ * @param[in] plain text
+ * @param[in] plain_len text length
+ * @param[in] key key
+ * @param[in] key_len key length
+ * @param[in] flags CRYPTOGRAHIC_HASH_FUNTION_FLAGS
+ * @return operation result
+ * @retval encrypt data success
+ * @retval 0 fail
+ */
+ unsigned char *SA_Encrypt_Cryptograhic_Hash_With_Flags(CRYPTOGRAHIC_HASH_FUNTION_TYPE type, const char *plain, int plain_len, const char *key, int key_len, CRYPTOGRAHIC_HASH_FUNTION_FLAGS flags);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* EXT_SA_ENCRYPTION_DECRYPTION_H_ */
diff --git a/framework/include/fw_define.h b/framework/include/fw_define.h
new file mode 100755
index 0000000..900b3ce
--- /dev/null
+++ b/framework/include/fw_define.h
@@ -0,0 +1,47 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Jungwook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef FW_DEFINE_H_
+#define FW_DEFINE_H_
+
+#ifdef NDEBUG
+#define FW_STATIC static
+#define FW_INLINE inline
+#else
+#define FW_STATIC
+#define FW_INLINE
+#endif
+
+#endif /* FW_DEFINE_H_ */
diff --git a/framework/include/securityAssistant/EXT_SA_Encryption_Decryption.h b/framework/include/securityAssistant/EXT_SA_Encryption_Decryption.h
new file mode 100755
index 0000000..c58ae91
--- /dev/null
+++ b/framework/include/securityAssistant/EXT_SA_Encryption_Decryption.h
@@ -0,0 +1,94 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ * Sooyi Kim <sooyi.kim@samsung.com>
+ */
+
+#ifndef EXT_SA_ENCRYPTION_DECRYPTION_H_
+#define EXT_SA_ENCRYPTION_DECRYPTION_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+ typedef enum {
+
+ SA_ENCRYPTION_NO_TYPE = 0,
+ SA_ENCRYPTION_BASIC,
+ SA_ENCRYPTION_MD5,
+ } SA_ENCRYPTION_TYPE;
+
+ unsigned char *SA_Get_Encryption_Value(SA_ENCRYPTION_TYPE encryption_type, char *plain, int plain_length);
+ char *SA_Get_Decryption_Value(SA_ENCRYPTION_TYPE decryption_type, char *encryption_text);
+
+ typedef enum {
+ CRYPTOGRAHIC_HASH_FUNTION_NO_TYPE = 0,
+ CRYPTOGRAHIC_HASH_FUNTION_MD5 = 1, /* length : 16 byte */
+ CRYPTOGRAHIC_HASH_FUNTION_SHA1 = 2, /* length : 20 byte */
+
+ } CRYPTOGRAHIC_HASH_FUNTION_TYPE;
+
+ typedef enum {
+ CRYPTOGRAHIC_HASH_FUN_HMAC = 1
+ } CRYPTOGRAHIC_HASH_FUNTION_FLAGS;
+
+/*
+ * @brief get hash code
+ * @param[in] type hash function type
+ * @param[in] plain text
+ * @param[in] plain_len text length
+ * @return operation result
+ * @retval encrypt data success
+ * @retval 0 fail
+ *
+ */
+ unsigned char *SA_Encrypt_Cryptograhic_Hash(CRYPTOGRAHIC_HASH_FUNTION_TYPE type, const char *plain, int plain_len);
+
+/*
+ * @brief get hash code
+ * @param[in] type hash function type
+ * @param[in] plain text
+ * @param[in] plain_len text length
+ * @param[in] key key
+ * @param[in] key_len key length
+ * @param[in] flags CRYPTOGRAHIC_HASH_FUNTION_FLAGS
+ * @return operation result
+ * @retval encrypt data success
+ * @retval 0 fail
+ */
+ unsigned char *SA_Encrypt_Cryptograhic_Hash_With_Flags(CRYPTOGRAHIC_HASH_FUNTION_TYPE type, const char *plain, int plain_len, const char *key, int key_len, CRYPTOGRAHIC_HASH_FUNTION_FLAGS flags);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* EXT_SA_ENCRYPTION_DECRYPTION_H_ */
diff --git a/framework/include/securityAssistant/IN_SA_Cryptograhic_Hash_Function.h b/framework/include/securityAssistant/IN_SA_Cryptograhic_Hash_Function.h
new file mode 100755
index 0000000..c00a72b
--- /dev/null
+++ b/framework/include/securityAssistant/IN_SA_Cryptograhic_Hash_Function.h
@@ -0,0 +1,46 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ * Sooyi Kim <sooyi.kim@samsung.com>
+ */
+
+#ifndef IN_SA_CRYPTOGRAHIC_HASH_FUNCTION_H_
+#define IN_SA_CRYPTOGRAHIC_HASH_FUNCTION_H_
+
+#include "securityAssistant/EXT_SA_Encryption_Decryption.h"
+
+unsigned char *crypt_DES(const char *plain, int plain_len, const char *key, int key_len);
+unsigned char *crypt_MD5(CRYPTOGRAHIC_HASH_FUNTION_FLAGS flags, const char *plain, int plain_len, const char *key, int key_len);
+unsigned char *crypt_SHA1(CRYPTOGRAHIC_HASH_FUNTION_FLAGS flags, const char *plain, int plain_len, const char *key, int key_len);
+
+#endif /* IN_SA_CRYPTOGRAHIC_HASH_FUNCTION_H_ */
diff --git a/framework/include/securityAssistant/IN_SA_MD5.h b/framework/include/securityAssistant/IN_SA_MD5.h
new file mode 100755
index 0000000..fe127ce
--- /dev/null
+++ b/framework/include/securityAssistant/IN_SA_MD5.h
@@ -0,0 +1,73 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ * Sooyi Kim <sooyi.kim@samsung.com>
+ */
+
+#ifndef IN_SA_MD5_H_
+#define IN_SA_MD5_H_
+
+#include <glib.h>
+
+typedef struct MD5Context {
+ unsigned long int buf[4];
+ unsigned long int bits[2];
+ unsigned char in[64];
+ int doByteReverse;
+} MD5Context;
+
+static gint _ie = 0x44332211;
+static union _endian {
+ gint i;
+ gchar b[4];
+} *_endian = (union _endian *)&_ie;
+#define IS_BIG_ENDIAN() (_endian->b[0] == '\x44')
+#define IS_LITTLE_ENDIAN() (_endian->b[0] == '\x11')
+
+/* The four core functions - F1 is optimized somewhat */
+
+/* #define F1(x, y, z) (x & y | ~x & z) */
+#define F1(x, y, z) (z ^ (x & (y ^ z)))
+#define F2(x, y, z) F1(z, x, y)
+#define F3(x, y, z) (x ^ y ^ z)
+#define F4(x, y, z) (y ^ (x | ~z))
+
+/* This is the central step in the MD5 algorithm. */
+#define MD5STEP(f, w, x, y, z, data, s) (w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x)
+
+void MD5GetDigest(const char *buffer, int buffer_size, unsigned char *digest);
+void MD5Init(MD5Context *ctx);
+void MD5Update(MD5Context *ctx, const char *buf, unsigned long int len);
+void MD5Final(MD5Context *ctx, unsigned char *digest);
+
+#endif /* IN_SA_MD5_H_ */
diff --git a/framework/src/Account/Account_Mgr.c b/framework/src/Account/Account_Mgr.c
new file mode 100755
index 0000000..bce8c18
--- /dev/null
+++ b/framework/src/Account/Account_Mgr.c
@@ -0,0 +1,279 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include "PlugIn/PlugIn_DataConnector.h"
+#include "PlugIn/PlugIn_Account.h"
+#include "Utility/fw_alloc.h"
+#include "Utility/fw_log.h"
+
+#include "DataAdapter/DACI_Agent_Handler_Manager.h"
+
+#include "Account/Account_Util.h"
+
+#include "Account/Account_Mgr.h"
+
+#define LOG_TAG "AF_ACCOUNT"
+
+int addAccount(char *email, char *password, char *serverIP, char *domain, int isEnableSSL, int create_mode, char *access_name)
+{
+ daci_account account;
+ account.email_address = email;
+ account.password = password;
+ account.enable = 1;
+ account.accessName = access_name;
+
+ /* insert account info to Sync Agent DB account database */
+ int account_id = DACI_Add_Account(&account);
+
+ if (account_id == -1) {
+ FW_LOGE("[addAccount] SA_DA_Add_Account() Error");
+ }
+
+ /*
+ * todo Process Platform Specific Account
+ */
+ addAccount_Platform(account_id, email, password, create_mode);
+
+ /* Update ServerInfo */
+
+ /*
+ * todo Update Policy
+ */
+
+ return account.account_id;
+}
+
+int deleteAccount(int accountID)
+{
+ /* Remove from Service DB & Syncagent DB */
+ DACI_RETURN result = DACI_Delete_All_Database_Account(accountID);
+
+ if ((result == DACI_SUCCESS) || (result == DACI_ERR_DELETE_LAST_ACCOUNT)) {
+ /* Update the Cache */
+
+ /*
+ * todo Remove from Platform account database
+ */
+ delAccount_Platform(accountID);
+
+ return 1;
+ }
+
+ return 0;
+}
+
+ACCOUNT_ERROR construct_AccountTbl_From_Service()
+{
+ ACCOUNT_ERROR err_code = ACCOUNT_SUCCESS;
+
+ int *fw_account_id_list = 0;
+ int fw_account_id_cnt = 0;
+
+ int content_count = 0;
+ int *service_plugin_id_list = get_DataConnector_PlugIn_ID_List(&content_count);
+
+ if (service_plugin_id_list == 0) {
+ FW_LOGV("No Data PlugIn loaded!!");
+ return ACCOUNT_SUCCESS;
+ }
+
+ int index = 0;
+ for (; index < content_count; index++) {
+ int service = service_plugin_id_list[index];
+ FW_LOGV("Service ID : %d", service);
+
+ /*
+ * Get account id List from agent account table
+ */
+ fw_account_id_list = DACI_Get_Account_Account_Id_List(&fw_account_id_cnt);
+/* if (fw_account_id_list == 0 || fw_account_id_cnt == 0) {
+ continue;
+ }*/
+
+ FW_LOGV("fw_account_id_cnt : %d", fw_account_id_cnt);
+
+ /*
+ * Get current All Service Account ID
+ */
+ GET_ACCOUNT_ID_LIST pFunc_Get_Service_Account_Id_List = getFunction_DataConnector_GET_ACCOUNT_ID_LIST(service);
+ if (pFunc_Get_Service_Account_Id_List == 0) {
+ FW_LOGV("pFunc_Get_Service_Account_Id_List is null : %d", service);
+ continue;
+ }
+
+ int service_account_id_cnt;
+ int *service_account_id_list = pFunc_Get_Service_Account_Id_List(&service_account_id_cnt);
+
+ FW_LOGV("[%d] service_account_id_cnt : %d", service, service_account_id_cnt);
+
+ int *service_account_id_new = 0;
+ if (service_account_id_cnt != 0) {
+ service_account_id_new = (int *)fw_malloc(sizeof(int) * service_account_id_cnt);
+ if (service_account_id_new == 0) {
+ FW_LOGE("fw_malloc Failed!!");
+ return ACCOUNT_FAIL;
+ }
+
+ int i = 0;
+ for (; i < service_account_id_cnt; i++) {
+ service_account_id_new[i] = 1;
+ FW_LOGV("service_account_id_list[%d] : %d", i, service_account_id_list[i]);
+ }
+ }
+
+ int i = 0;
+ for (; fw_account_id_list != 0 && i < fw_account_id_cnt; i++) {
+ Has_PlatformAccount_Service pFunc_Has_PlatformAccount_Service = getFunction_Account_Has_PlatformAccount_Service(getAccount_PlugIn_ID());
+ int hasServiceAccountID = pFunc_Has_PlatformAccount_Service(fw_account_id_list[i], service);
+ if (hasServiceAccountID) {
+ /*
+ * Get Service Account ID, Fw has
+ */
+ int fw_service_account_id = getAccountID_Service(service, fw_account_id_list[i]);
+ FW_LOGV("fw_account_id_list[%d] : %d", i, fw_account_id_list[i]);
+ FW_LOGV("fw_service_account_id : %d", fw_service_account_id);
+
+ int k = 0;
+ for (; k < service_account_id_cnt; k++) {
+ if (fw_service_account_id == service_account_id_list[k]) {
+ FW_LOGV("service_account_id_list[%d] : %d", k, service_account_id_list[k]);
+ service_account_id_new[k] = 0;
+ break;
+ }
+ }
+
+ FW_LOGV("\n\nk : %d\n", k);
+ /*
+ * Delete fw_service_account_id from vconf
+ */
+ if (k >= service_account_id_cnt) {
+ Del_PlatformAccount_Service pFunc_Del_PlatformAccount_Service = getFunction_Account_Del_PlatformAccount_Service(getAccount_PlugIn_ID());
+ pFunc_Del_PlatformAccount_Service(fw_account_id_list[i], service);
+ err_code = ACCOUNT_CHANGED;
+ }
+ }
+ }
+
+ i = 0;
+ for (; i < service_account_id_cnt; i++) {
+ if (service_account_id_new[i] == 1) {
+ int k = 0;
+ for (; fw_account_id_list != 0 && k < fw_account_id_cnt; k++) {
+ /*
+ * find empty slot in fw_account_id_list[k]
+ */
+ Has_PlatformAccount_Service pFunc_Has_PlatformAccount_Service = getFunction_Account_Has_PlatformAccount_Service(getAccount_PlugIn_ID());
+ int hasServiceAccountID = pFunc_Has_PlatformAccount_Service(fw_account_id_list[k], service);
+ if (!hasServiceAccountID) {
+ Set_PlatformAccount_Service pFunc_Set_PlatformAccount_Service = getFunction_Set_PlatformAccount_Service(getAccount_PlugIn_ID());
+ pFunc_Set_PlatformAccount_Service(fw_account_id_list[k], service, service_account_id_list[i]);
+ service_account_id_new[i] = 0;
+ break;
+ }
+ }
+
+ if (service_account_id_new[i] == 1) {
+ /*
+ * Create new FW account and append service account id
+ */
+ FW_LOGV("Create new FW account!!");
+
+ daci_account account;
+ account.email_address = "0";
+ account.password = "0";
+ account.accessName = "Account";
+
+ int fw_account_id = DACI_Add_Account(&account);;
+ Set_PlatformAccount_Service pFunc_Set_PlatformAccount_Service = getFunction_Set_PlatformAccount_Service(getAccount_PlugIn_ID());
+ pFunc_Set_PlatformAccount_Service(fw_account_id, service, service_account_id_list[i]);
+ }
+
+ err_code = ACCOUNT_CHANGED;
+ }
+ }
+
+ if (fw_account_id_list != 0) {
+ free(fw_account_id_list);
+ }
+ }
+
+ if (service_plugin_id_list != 0) {
+ free(service_plugin_id_list);
+ }
+
+ return err_code;
+}
+
+int *get_Account_ID_List(int content_type, int *count)
+{
+ *count = 0;
+ int fw_account_count = 0;
+ int *fw_account_id_list = DACI_Get_Account_Account_Id_List(&fw_account_count);
+
+ if (fw_account_count == 0 || fw_account_id_list == 0) {
+ return 0;
+ }
+
+ int *account_id_list = (int *)calloc(fw_account_count, sizeof(int));
+
+ int i = 0;
+ for (; i < fw_account_count; i++) {
+ Has_PlatformAccount_Service pFunc_Has_PlatformAccount_Service = getFunction_Account_Has_PlatformAccount_Service(getAccount_PlugIn_ID());
+ int hasServiceAccountID = pFunc_Has_PlatformAccount_Service(fw_account_id_list[i], content_type);
+
+ if (hasServiceAccountID) {
+ account_id_list[*count] = fw_account_id_list[i];
+ *count = *count + 1;
+ }
+ }
+
+ if (fw_account_id_list != 0) {
+ free(fw_account_id_list);
+ }
+
+ return account_id_list;
+}
+
+void *get_Account_Info(int fw_account_id, int content_type)
+{
+ Get_Service_AccountInfo pFunc_Get_Service_AccountInfo = getFunction_Get_Service_AccountInfo(getAccount_PlugIn_ID());
+
+ if (pFunc_Get_Service_AccountInfo == 0) {
+ FW_LOGE("pFunc_Get_Service_AccountInfo is null!!");
+ return 0;
+ }
+
+ return pFunc_Get_Service_AccountInfo(fw_account_id, content_type);
+}
diff --git a/framework/src/Account/Account_Util.c b/framework/src/Account/Account_Util.c
new file mode 100755
index 0000000..e80ba46
--- /dev/null
+++ b/framework/src/Account/Account_Util.c
@@ -0,0 +1,144 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include "Utility/fw_log.h"
+#include "Utility/fw_ref.h"
+#include "PlugIn/PlugIn_Account.h"
+
+#include "DataAdapter/DACI_Agent_Handler_Manager.h"
+
+#include "Account/Account_Util.h"
+
+#define LOG_TAG "AF_ACCOUNT"
+
+int isExistAccountID(int accountID)
+{
+ return DACI_IsExist_Account(accountID);
+}
+
+int *getAccountIDList_Service(int service_type, int *cnt)
+{
+ int *accountID_list = getAccountList(cnt);
+
+ if ((*cnt != 0) && (accountID_list != 0)) {
+ int *service_accountID_list = (int *)calloc(*cnt, sizeof(int));
+ int i = 0;
+ for (; i < *cnt; i++) {
+ service_accountID_list[i] = getAccountID_Service(service_type, accountID_list[i]);
+ }
+ if (accountID_list != 0) {
+ free(accountID_list);
+ }
+ return service_accountID_list;
+ }
+
+ if (accountID_list != 0) {
+ free(accountID_list);
+ }
+
+ return 0;
+}
+
+int getAccountID_Service(int service_type, int account_id)
+{
+ Get_Service_AccountID pFunc = getFunction_Account_Get_Service_AccountID(getAccount_PlugIn_ID());
+
+ if (pFunc != 0) {
+ int service_account_id = pFunc(service_type, account_id);
+
+ return service_account_id;
+ }
+
+ return -1;
+}
+
+int getAccountID_FW(int service_type, int service_account_id, int index)
+{
+ Get_FW_AccountID pFunc = getFunction_Account_Get_FW_AccountID(getAccount_PlugIn_ID());
+
+ if (pFunc != 0) {
+ int account_id = pFunc(service_type, service_account_id, index);
+
+ return account_id;
+ }
+
+ return -1;
+}
+
+int *getAccountList(int *cnt)
+{
+ DACI_RETURN da_err = DACI_Open_Agent();
+ FW_LOGI("Done Open Agent DB : %d", da_err);
+
+ int *accountList = DACI_Get_Account_Account_Id_List(cnt);
+
+ da_err = DACI_Close_Agent();
+ FW_LOGI("Done Close Agent DB : %d", da_err);
+
+ return accountList;
+}
+
+void addAccount_Platform(int fw_account_id, char *email, char *password, int create_mode)
+{
+ FW_LOGV("addAccount_Platform called");
+ Add_PlatformAccount pFunc = getFunction_Account_Add_PlatformAccount(getAccount_PlugIn_ID());
+
+ if (pFunc != 0) {
+ FW_LOGV("pFunc is not null");
+ pFunc(fw_account_id, email, password, create_mode);
+ } else {
+ FW_LOGV("pFunc is null");
+ }
+}
+
+void delAccount_Platform(int fw_account_id)
+{
+ FW_LOGV("delAccount_Platform called");
+ Del_PlatformAccount pFunc = getFunction_Account_Del_PlatformAccount(getAccount_PlugIn_ID());
+
+ if (pFunc != 0) {
+ FW_LOGV("pFunc is not null");
+ pFunc(fw_account_id);
+ } else {
+ FW_LOGV("pFunc is null");
+ }
+}
+
+char *getEmailAddress(int accountID)
+{
+ char *emailAddress = DACI_Get_Account_Email_Address(accountID);
+
+ return emailAddress;
+}
diff --git a/framework/src/DataAdapter/DACI_Agent.c b/framework/src/DataAdapter/DACI_Agent.c
new file mode 100755
index 0000000..155211a
--- /dev/null
+++ b/framework/src/DataAdapter/DACI_Agent.c
@@ -0,0 +1,3138 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ * Heeyoung Hwang <heeyoung1008.hwang@samsung.com>
+ */
+
+#include <pthread.h>
+
+#include "Utility/fw_log.h"
+#include "DataAdapter/DACI_Agent_Handler_Manager.h"
+#include "DataAdapter/DACI_Agent.h"
+
+#define LOG_TAG "AF_DACI"
+
+/* static function define */
+static int __busy_handler(void *pData, int count);
+static DACI_RETURN __query_exec(DACI_HANDLER *daci_handler, char *query, char *errMsg);
+static daci_stmt __query_prepare(DACI_HANDLER *daci_handler, char *query, int size);
+static DACI_RETURN __stmt_bind_text(DACI_HANDLER *daci_handler, daci_stmt stmt, int index, const char *value);
+static DACI_RETURN __stmt_bind_int(DACI_HANDLER *daci_handler, daci_stmt stmt, int index, const int value);
+static DACI_RETURN __stmt_bind_blob(DACI_HANDLER *daci_handler, daci_stmt stmt, int index, const void *value, int nByte);
+static DACI_RETURN __stmt_bind_null(DACI_HANDLER *daci_handler, daci_stmt stmt, int index);
+static DACI_RETURN __stmt_read_step(DACI_HANDLER *daci_handler, daci_stmt stmt);
+static DACI_RETURN __stmt_write_step(DACI_HANDLER *daci_handler, daci_stmt stmt);
+static DACI_RETURN __stmt_reset(DACI_HANDLER *daci_handler, daci_stmt stmt);
+static DACI_RETURN __stmt_finalize(DACI_HANDLER *daci_handler, daci_stmt stmt);
+static char *__stmt_column_text(daci_stmt stmt, int index);
+static int __stmt_column_int(daci_stmt stmt, int index);
+static DACI_RETURN __get_table(DACI_HANDLER *daci_handler, char *query, char ***result, int *rowCount, int *colCount);
+static void __free_table(char **result);
+
+static DACI_RETURN __create_changelog_table(DACI_HANDLER *daci_handler, int accountId);
+static DACI_RETURN __drop_changelog_table(DACI_HANDLER *daci_handler, int accountId);
+
+static int __exist_table(DACI_HANDLER *daci_handler, const char *tableName);
+static int __get_data_count(DACI_HANDLER *daci_handler, char *query, int size);
+static char *__replace_table_name(char *old, int accountId, int count);
+static char *__get_table_name(DACI_TABLE_NAME tableName);
+static char *__get_column_name(DACI_COLUMN_NAME columnName);
+static int __get_next_account_id();
+static DACI_RETURN __delete_account(DACI_HANDLER *daci_handler, DACI_TABLE_NAME tableName, int accountId);
+
+static char *daci_file_path = 0;
+static pthread_t use_transaction_thread_id = 0;
+static pthread_mutex_t transaction_lock;
+static pthread_mutex_t exec_lock;
+
+static char *g_daci_create_table[] = {
+ /* 1. create account_tbl */
+ "create table account_tbl" "(" "account_id integer not null," "email_address varchar(51) not null," "password varchar(51) not null," "enable boolean not null default 1," "last_update date not null default current_timestamp," "access_name varchar(64) not null," "constraint account_tbl_pk primary key(account_id)" ");",
+
+ /* 2. create folder_tbl */
+ "create table folder_tbl" "(" "folder_id varchar(64) not null," "data_store_id integer not null," "account_id integer not null," "folder_type_id integer not null," "service_id varchar(20) default null," "parent_folder_id varchar(64) default null," "last_update date not null default current_timestamp," "access_name varchar(64) not null," "constraint folder_tbl_pk primary key(folder_id)," "constraint folder_tbl_account_id_fk foreign key(account_id) references account_tbl(account_id)" ");",
+
+ /* 3. create item_tbl */
+ "create table item_tbl"
+ "("
+ "item_id varchar(64) not null,"
+ "data_store_id integer not null," "account_id integer not null," "folder_id varchar(64) not null," "service_id varchar(20) not null," "last_update date not null default current_timestamp," "access_name varchar(64) not null," "constraint item_tbl_pk primary key(item_id)," "constraint item_tbl_account_id_fk foreign key(account_id) references account_tbl(account_id)," "constraint itme_tbl_folder_id_fk foreign key(folder_id) references folder_tbl(folder_id)" ");",
+
+ /* 4. create config_tbl */
+ "create table config_tbl" "(" "config_id integer not null," "key varchar(50) not null," "value varchar(30) default null," "type varchar(10) default null," "last_update date not null default current_timestamp," "access_name varchar(64) not null," "constraint config_tbl_pk primary key(config_id, Key)" ");",
+
+ /* 5. create account_item_changelog_tbl */
+ "create table account_%d_item_changelog_tbl" "(" "item_id varchar(64) not null," "operation_id integer not null," "status varchar(15) not null default \'SYNC_REQUIRED\'," "last_update date not null default current_timestamp," "access_name varchar(64) not null," "constraint account_%d_item_changelog_tbl_pk primary key(item_id)," "constraint account_%d_item_changelog_tbl_item_id_fk foreign key(item_id) references item_tbl(item_id)" ");",
+
+ /* 6. create last_anchor_tbl */
+ "create table last_anchor_tbl" "(" "account_id integer not null," "data_store_id integer not null," "last_anchor_server varchar(20) default null," "last_anchor_client varchar(20) default null," "last_update date not null default current_timestamp," "access_name varchar(64) not null," "constraint last_anchor_tbl_pk primary key(account_id, data_store_id)," "constraint last_anchor_tbl_account_id_fk foreign key(account_id) references account_tbl(account_id)" ");",
+
+ /* 7. create mapping_tbl */
+ "create table mapping_tbl" "(" "account_id integer not null," "data_store_id integer not null," "luid varchar(64) default null," "guid varchar(64) default null," "last_update date not null default current_timestamp," "access_name varchar(64) not null," "constraint mapping_tbl_pk primary key(account_id, luid)," "constraint mapping_tbl_account_id_fk foreign key(account_id) references account_tbl(account_id)" ");",
+
+ /* 8. create id_provider_tbl */
+ "create table id_provider_tbl" "(" "id_provider_code integer not null," "id_capacity integer not null," "bit_per_page integer not null," "last_id integer not null," "free_bit_cnt integer not null," "constraint id_provider_tbl_pk primary key(id_provider_code)" ");",
+
+ /* 9. create id_page_tbl */
+ "create table id_page_tbl" "(" "page_index integer not null," "id_provider_code integer not null," "page_bit BLOB," "constraint id_page_tbl_pk primary key(page_index, id_provider_code)," "constraint id_page_tbl_fk foreign key(id_provider_code) references id_provider_tbl(id_provider_code)" ");"
+};
+
+static char *g_daci_drop_table[] = {
+ /* 1. drop account_tbl */
+ "drop table account_tbl",
+
+ /* 2. drop folder_tbl */
+ "drop table folder_tbl",
+
+ /* 3. drop item_tbl */
+ "drop table item_tbl",
+
+ /* 4. drop config_tbl */
+ "drop table config_tbl",
+
+ /* 5. drop account_item_changelog_tbl */
+ "drop table account_%d_item_changelog_tbl",
+
+ /* 6. drop last_anchor_tbl */
+ "drop table last_anchor_tbl",
+
+ /* 7. drop mapping_tbl */
+ "drop table mapping_tbl"
+ /* 8. drop id_provider_tbl */
+ "drop table id_provider_tbl"
+ /* 9. drop id_page_tbl */
+ "drop table id_page_tbl"
+};
+
+DACI_RETURN open_agent(DACI_HANDLER **daci_handler)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+ int ret = 0;
+ char *errMsg = 0;
+
+ if (*daci_handler == 0) {
+
+ /* db open */
+ /* ret = db_util_open(DACI_FILE_PATH, &(*daci_handler), 0); */
+
+ ret = sqlite3_open(daci_file_path, daci_handler);
+ if (ret != SQLITE_OK)
+ goto DACI_FINISH;
+
+ /* register busy handler */
+ ret = sqlite3_busy_handler(*daci_handler, __busy_handler, 0);
+ if (ret != SQLITE_OK) {
+ FW_LOGV("Fail to register busy handler", errMsg);
+ goto DACI_FINISH;
+ }
+
+ FW_LOGV("agent_db_open_success");
+
+ } else {
+ FW_LOGV("agent_db_already_opened");
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return DACI_SUCCESS;
+
+DACI_FINISH:
+
+ FW_LOGE("agent_open failed(%d) : %s", ret, sqlite3_errmsg(*daci_handler));
+
+ if (errMsg)
+ sqlite3_free(errMsg);
+
+ sqlite3_close(*daci_handler);
+ *daci_handler = 0;
+
+ return DACI_ERR_OPEN_FAILED;
+}
+
+DACI_RETURN close_Agent(DACI_HANDLER *daci_handler)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ int ret = 0;
+ ret = sqlite3_close(daci_handler);
+ daci_handler = 0;
+
+ if (ret != SQLITE_OK) {
+ FW_LOGE("agent_db_agent_close failed(%d) : %s", ret, sqlite3_errmsg(daci_handler));
+ return DACI_ERR_CLOSE_FAILED;
+ }
+
+ FW_LOGV("agent_db_agent_close_success");
+ FW_LOGV("[%s] End !\n", __func__);
+
+ return DACI_SUCCESS;
+}
+
+DACI_RETURN begin_transaction(DACI_HANDLER *daci_handler)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+
+ pthread_mutex_lock(&transaction_lock);
+ use_transaction_thread_id = DACI_GET_THREAD_ID;
+
+ pthread_mutex_lock(&exec_lock);
+ ret = __query_exec(daci_handler, "begin immediate", "agent_db_begin_transaction failed");
+ pthread_mutex_unlock(&exec_lock);
+
+ if (ret == DACI_ERR_QUERY_FAILED)
+ ret = DACI_ERR_TRANSACTION_FAILED;
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN end_transaction(DACI_HANDLER *daci_handler, DACI_TRANSACTION transaction)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ char *query = 0;
+ char *errMsg = 0;
+
+ if (transaction == TRANSACTION_COMMIT) {
+ query = "commit transaction";
+ errMsg = "agent_db_commit_transaction failed";
+ } else if (transaction == TRANSACTION_ROLLBACK) {
+ query = "rollback transaction";
+ errMsg = "agent_db_rollback_transaction failed";
+ }
+
+ pthread_mutex_lock(&exec_lock);
+ ret = __query_exec(daci_handler, query, errMsg);
+ pthread_mutex_unlock(&exec_lock);
+
+ use_transaction_thread_id = 0;
+ pthread_mutex_unlock(&transaction_lock);
+
+ if (ret == DACI_ERR_QUERY_FAILED) {
+ if (transaction == TRANSACTION_COMMIT) {
+ query = "rollback transaction";
+ errMsg = "agent_db_rollback_transaction failed";
+ ret = __query_exec(daci_handler, query, errMsg);
+ if (ret == DACI_SUCCESS)
+ FW_LOGV("agent_db_rollback_transaction success");
+ }
+ ret = DACI_ERR_TRANSACTION_FAILED;
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+void set_agentdb_file_path(char *file_path)
+{
+ daci_file_path = file_path;
+}
+
+DACI_RETURN create_AgentDefaultTable(DACI_HANDLER *daci_handler)
+{
+ FW_LOGE("[%s] start", __func__);
+ DACI_RETURN ret = DACI_SUCCESS;
+
+ if (daci_handler == 0) {
+ FW_LOGV("[%s] DACI_ERRORS !\n", __func__);
+ return DACI_ERRORS;
+ }
+
+ if ((begin_transaction(daci_handler) != DACI_SUCCESS)) {
+ FW_LOGE("agent_db_default_tbl_create failed");
+ return DACI_ERR_CREATE_TABLE_FAILED;
+ }
+
+ /* 1. create account_tbl */
+ if (__exist_table(daci_handler, "account_tbl") == 0) {
+ ret = __query_exec(daci_handler, g_daci_create_table[TABLE_NAME_ACCOUNT], "account_tbl_create failed");
+ if (ret != DACI_SUCCESS)
+ goto DACI_FINISH;
+ }
+
+ /* 2. create folder_tbl */
+ if (__exist_table(daci_handler, "folder_tbl") == 0) {
+ ret = __query_exec(daci_handler, g_daci_create_table[TABLE_NAME_FOLDER], "folder_tbl_create failed");
+ if (ret != DACI_SUCCESS)
+ goto DACI_FINISH;
+ }
+
+ /* 3. create item_tbl */
+ if (__exist_table(daci_handler, "item_tbl") == 0) {
+ ret = __query_exec(daci_handler, g_daci_create_table[TABLE_NAME_ITEM], "item_tbl_create failed");
+ if (ret != DACI_SUCCESS)
+ goto DACI_FINISH;
+ }
+
+ /* 4. create config_tbl */
+ if (__exist_table(daci_handler, "config_tbl") == 0) {
+ ret = __query_exec(daci_handler, g_daci_create_table[TABLE_NAME_CONFIG], "config_tbl_create failed");
+ if (ret != DACI_SUCCESS)
+ goto DACI_FINISH;
+ }
+
+ /* 5. create last_anchor_tbl */
+ if (__exist_table(daci_handler, "last_anchor_tbl") == 0) {
+ ret = __query_exec(daci_handler, g_daci_create_table[TABLE_NAME_LAST_ANCHOR], "last_anchor_tbl_create failed");
+ if (ret != DACI_SUCCESS)
+ goto DACI_FINISH;
+ }
+
+ /* 6. create mapping_tbl */
+ if (__exist_table(daci_handler, "mapping_tbl") == 0) {
+ ret = __query_exec(daci_handler, g_daci_create_table[TABLE_NAME_MAPPING], "mapping_tbl_create failed");
+ if (ret != DACI_SUCCESS)
+ goto DACI_FINISH;
+ }
+
+ /* 7. create id_provider_tbl */
+ if (__exist_table(daci_handler, "id_provider_tbl") == 0) {
+ ret = __query_exec(daci_handler, g_daci_create_table[TABLE_NAME_ID_PROVIDER], "id_provider_tbl_create failed");
+ if (ret != DACI_SUCCESS)
+ goto DACI_FINISH;
+ }
+
+ /* 8. create id_page_tbl */
+ if (__exist_table(daci_handler, "id_page_tbl") == 0) {
+ ret = __query_exec(daci_handler, g_daci_create_table[TABLE_NAME_ID_PAGE], "id_page_tbl_create failed");
+ if (ret != DACI_SUCCESS)
+ goto DACI_FINISH;
+ }
+
+DACI_FINISH:
+
+ if (ret != DACI_SUCCESS) {
+ end_transaction(daci_handler, TRANSACTION_ROLLBACK);
+ ret = DACI_ERR_CREATE_TABLE_FAILED;
+ } else {
+ ret = end_transaction(daci_handler, TRANSACTION_COMMIT);
+ }
+
+ FW_LOGE("[%s] end", __func__);
+ return ret;
+}
+
+int add_account(DACI_HANDLER *daci_handler, daci_account *account)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *query = "insert into account_tbl (account_id, email_address, password, enable, access_name) values (?, ?, ?, ?, ?)";
+
+ account->account_id = __get_next_account_id();
+
+ if (account->account_id > DACI_MAX_ACCOUNT) {
+ FW_LOGE("account registration is full");
+ account->account_id = -1;
+ goto DACI_FINISH;
+ }
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0) {
+ account->account_id = -1;
+ goto DACI_FINISH;
+ }
+
+ __stmt_bind_int(daci_handler, stmt, 1, account->account_id);
+ __stmt_bind_text(daci_handler, stmt, 2, account->email_address);
+ __stmt_bind_text(daci_handler, stmt, 3, account->password);
+ __stmt_bind_int(daci_handler, stmt, 4, account->enable);
+ __stmt_bind_text(daci_handler, stmt, 5, account->accessName);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ if (ret != DACI_SUCCESS)
+ account->account_id = -1;
+
+ __stmt_finalize(daci_handler, stmt);
+
+ if (account->account_id != -1) {
+ __create_changelog_table(daci_handler, account->account_id);
+ }
+
+DACI_FINISH:
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return account->account_id;
+}
+
+DACI_RETURN delete_account(DACI_HANDLER *daci_handler, int accountId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int i = 0;
+
+ /* delete default table by accountId */
+ for (i = 0; i < TABLE_NAME_MAX; i++) {
+ if (i == TABLE_NAME_ACCOUNT_ITEM_CHANGELOG) {
+ continue;
+ }
+
+ ret = __delete_account(daci_handler, i, accountId);
+ if (ret != DACI_SUCCESS) {
+ ret = DACI_ERR_QUERY_FAILED;
+ goto DACI_FINISH;
+ }
+ }
+
+ /* drop changelog table */
+ ret = __drop_changelog_table(daci_handler, accountId);
+ if (ret != DACI_SUCCESS) {
+ ret = DACI_ERR_QUERY_FAILED;
+ goto DACI_FINISH;
+ }
+
+DACI_FINISH:
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN set_accountEmailAddress(DACI_HANDLER *daci_handler, int accountId, char *emailAddress, char *accessName)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *query = "update account_tbl set email_address = ?, last_update = current_timestamp, access_name = ? where account_id = ?";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ __stmt_bind_text(daci_handler, stmt, 1, emailAddress);
+ __stmt_bind_text(daci_handler, stmt, 2, accessName);
+ __stmt_bind_int(daci_handler, stmt, 3, accountId);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN set_accountPassword(DACI_HANDLER *daci_handler, int accountId, char *password, char *accessName)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *query = "update account_tbl set password = ?, last_update = current_timestamp, access_name = ? where account_id = ?";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ __stmt_bind_text(daci_handler, stmt, 1, password);
+ __stmt_bind_text(daci_handler, stmt, 2, accessName);
+ __stmt_bind_int(daci_handler, stmt, 3, accountId);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+int *get_accountAccountIdList(DACI_HANDLER *daci_handler, int *count)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ int *accountIdList = 0;
+ int dataCount = 0;
+ int i = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from account_tbl");
+
+ dataCount = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+ *count = dataCount;
+
+ if (dataCount != 0) {
+ /* query initialize */
+ DACI_MEMORY_SET(g_daci_query);
+
+ accountIdList = DACI_MEMORY_MALLOC(int *, sizeof(int), dataCount);
+ if (accountIdList == 0) {
+ FW_LOGE("memory_allocation failed");
+ FW_LOGV("[%s] End !\n", __func__);
+ return accountIdList;
+ }
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select account_id from account_tbl");
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt != 0) {
+ for (i = 0; i < dataCount; i++) {
+ if (__stmt_read_step(daci_handler, stmt) != DACI_ERR_MORE_DATA)
+ break;
+
+ accountIdList[i] = __stmt_column_int(stmt, 0);
+ }
+ __stmt_finalize(daci_handler, stmt);
+ }
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+
+ return accountIdList;
+}
+
+char *get_accountEmailAddress(DACI_HANDLER *daci_handler, int accountId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ char *query = "select email_address from account_tbl where account_id = ?";
+ char *emailAddress = 0;
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt != 0) {
+ __stmt_bind_int(daci_handler, stmt, 1, accountId);
+
+ if (__stmt_read_step(daci_handler, stmt) == DACI_ERR_MORE_DATA)
+ emailAddress = __stmt_column_text(stmt, 0);
+
+ __stmt_finalize(daci_handler, stmt);
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return emailAddress;
+}
+
+char *get_accountPassword(DACI_HANDLER *daci_handler, int accountId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ char *query = "select password from account_tbl where account_id = ?";
+ char *password = 0;
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt != 0) {
+ __stmt_bind_int(daci_handler, stmt, 1, accountId);
+
+ if (__stmt_read_step(daci_handler, stmt) == DACI_ERR_MORE_DATA)
+ password = __stmt_column_text(stmt, 0);
+
+ __stmt_finalize(daci_handler, stmt);
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return password;
+}
+
+int isExist_account(DACI_HANDLER *daci_handler, int accountId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ int ret = 1;
+ int dataCount = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from account_tbl where account_id = %d", accountId);
+
+ dataCount = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+
+ if (dataCount == 0)
+ ret = 0;
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+char *get_accessName(DACI_HANDLER *daci_handler, int accountId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ char *query = "select access_name from account_tbl where account_id = ?";
+ char *access_name = 0;
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt != 0) {
+ __stmt_bind_int(daci_handler, stmt, 1, accountId);
+
+ if (__stmt_read_step(daci_handler, stmt) == DACI_ERR_MORE_DATA)
+ access_name = __stmt_column_text(stmt, 0);
+
+ __stmt_finalize(daci_handler, stmt);
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+
+ return access_name;
+}
+
+int *get_accountIdListByAccessName(DACI_HANDLER *daci_handler, char *access_name, int *accountId_count)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ int *accountIdList = 0;
+ int dataCount = 0;
+ int i = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from account_tbl where access_name = \'%s\'", access_name);
+
+ dataCount = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+ *accountId_count = dataCount;
+
+ if (dataCount != 0) {
+ /* query initialize */
+ DACI_MEMORY_SET(g_daci_query);
+
+ accountIdList = DACI_MEMORY_MALLOC(int *, sizeof(int), dataCount);
+ if (accountIdList == 0) {
+ FW_LOGE("memory_allocation failed");
+ FW_LOGV("[%s] End !\n", __func__);
+ return accountIdList;
+ }
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select account_id from account_tbl where access_name = \'%s\'", access_name);
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt != 0) {
+ for (i = 0; i < dataCount; i++) {
+ if (__stmt_read_step(daci_handler, stmt) != DACI_ERR_MORE_DATA)
+ break;
+
+ accountIdList[i] = __stmt_column_int(stmt, 0);
+ }
+ __stmt_finalize(daci_handler, stmt);
+ }
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+
+ return accountIdList;
+}
+
+int get_accountCount(DACI_HANDLER *daci_handler)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ int dataCount = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from account_tbl");
+
+ dataCount = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return dataCount;
+}
+
+DACI_RETURN add_folder(DACI_HANDLER *daci_handler, daci_folder *folder, int count)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ DACI_RETURN ret = DACI_SUCCESS;
+ int i = 0;
+ char *query = 0;
+
+ for (i = 0; i < count; i++) {
+ if (isExist_folder(daci_handler, folder[i].account_id, folder[i].folder_id) == 1)
+ return DACI_ERR_PRIMARY_KEY_NOT_UNIQUE;
+ }
+
+ query = "insert into folder_tbl (folder_id, data_store_id, account_id, folder_type_id, service_id, parent_folder_id, access_name) values (?, ?, ?, ?, ?, ?, ?)";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ for (i = 0; i < count; i++) {
+ __stmt_bind_text(daci_handler, stmt, 1, folder[i].folder_id);
+ __stmt_bind_int(daci_handler, stmt, 2, folder[i].data_store_id);
+ __stmt_bind_int(daci_handler, stmt, 3, folder[i].account_id);
+ __stmt_bind_int(daci_handler, stmt, 4, folder[i].folder_type_id);
+ __stmt_bind_text(daci_handler, stmt, 5, folder[i].service_id);
+ __stmt_bind_text(daci_handler, stmt, 6, folder[i].parent_folder_id);
+ __stmt_bind_text(daci_handler, stmt, 7, folder[i].access_name);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ if ((ret != DACI_ERR_MORE_DATA) && (ret != DACI_SUCCESS)) {
+ __stmt_finalize(daci_handler, stmt);
+ return DACI_ERR_QUERY_FAILED;
+ }
+ __stmt_reset(daci_handler, stmt);
+ }
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+
+ return ret;
+}
+
+DACI_RETURN delete_folderByFolderId(DACI_HANDLER *daci_handler, char *folderId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *query = "delete from folder_tbl where folder_id = ?";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ __stmt_bind_text(daci_handler, stmt, 1, folderId);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+
+ return ret;
+}
+
+char *get_folderFolderIdByServiceId(DACI_HANDLER *daci_handler, int accountId, int itemTypeId, char *serviceId, int folderTypeId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ char *folderId = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select folder_id from folder_tbl where account_id = %d and data_store_id = %d and service_id = %s and folder_type_id = %d", accountId, itemTypeId, serviceId, folderTypeId);
+
+ FW_LOGV("Query : %s", g_daci_query);
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt != 0) {
+ if (__stmt_read_step(daci_handler, stmt) == DACI_ERR_MORE_DATA)
+ folderId = __stmt_column_text(stmt, 0);
+
+ __stmt_finalize(daci_handler, stmt);
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return folderId;
+}
+
+daci_id_list *get_folderFolderIdByFolderTypeId(DACI_HANDLER *daci_handler, int accountId, int itemTypeId, int folderTypeId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ daci_id_list *folder_id_list = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from folder_tbl where account_id = %d and folder_type_id = %d and data_store_id = %d", accountId, folderTypeId, itemTypeId);
+
+ int data_count = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+
+ if (data_count != 0) {
+ snprintf(g_daci_query, sizeof(g_daci_query), "select folder_id from folder_tbl where account_id = %d and folder_type_id = %d and data_store_id = %d", accountId, folderTypeId, itemTypeId);
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt != 0) {
+ folder_id_list = (daci_id_list *)calloc(1, sizeof(daci_id_list));
+ folder_id_list->id = (char **)calloc(data_count, sizeof(char *));
+ folder_id_list->count = data_count;
+ int i = 0;
+ for (; i < data_count; i++) {
+ if (__stmt_read_step(daci_handler, stmt) != DACI_ERR_MORE_DATA) {
+ break;
+ }
+
+ folder_id_list->id[i] = __stmt_column_text(stmt, 0);
+ }
+ __stmt_finalize(daci_handler, stmt);
+ }
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+
+ return folder_id_list;
+}
+
+char *get_folderServiceId(DACI_HANDLER *daci_handler, char *folderId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ char *query = "select service_id from folder_tbl where folder_id = ?";
+ char *serviceId = 0;
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt != 0) {
+ __stmt_bind_text(daci_handler, stmt, 1, folderId);
+
+ if (__stmt_read_step(daci_handler, stmt) == DACI_ERR_MORE_DATA)
+ serviceId = __stmt_column_text(stmt, 0);
+
+ __stmt_finalize(daci_handler, stmt);
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return serviceId;
+}
+
+daci_id_list *get_folderFolderIdListByItemTypeId(DACI_HANDLER *daci_handler, int accountId, int itemTypeId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ daci_id_list *folder_id_list = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from folder_tbl where account_id = %d and data_store_id = %d", accountId, itemTypeId);
+
+ int data_count = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+
+ if (data_count != 0) {
+ DACI_MEMORY_SET(g_daci_query);
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select folder_id from folder_tbl where account_id = %d and data_store_id = %d", accountId, itemTypeId);
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt != 0) {
+ folder_id_list = (daci_id_list *)calloc(1, sizeof(daci_id_list));
+ folder_id_list->id = (char **)calloc(data_count, sizeof(char *));
+ folder_id_list->count = data_count;
+ int i = 0;
+ for (; i < data_count; i++) {
+ if (__stmt_read_step(daci_handler, stmt) != DACI_ERR_MORE_DATA) {
+ break;
+ }
+
+ folder_id_list->id[i] = __stmt_column_text(stmt, 0);
+ }
+ __stmt_finalize(daci_handler, stmt);
+ }
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+
+ return folder_id_list;
+}
+
+daci_folder *get_folderMappingServiceId(DACI_HANDLER *daci_handler, int accountId, char *folderId, int *count)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ daci_folder *folder = 0;
+ int dataCount = 0;
+ int i = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from folder_tbl where folder_type_id in (select folder_type_id from folder_tbl where account_id = %d and folder_id = \'%s\') " "and (account_id != %d) and (account_id != %d) and data_store_id in (select data_store_id from folder_tbl where folder_id = \'%s\')", accountId, folderId, accountId, accountId, folderId);
+
+ FW_LOGV("[RJW] %s", g_daci_query);
+
+ dataCount = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+ *count = dataCount;
+
+ if (dataCount != 0) {
+ /* query initialize */
+ DACI_MEMORY_SET(g_daci_query);
+
+ folder = DACI_MEMORY_MALLOC(daci_folder *, sizeof(daci_folder), dataCount);
+ if (folder == 0) {
+ FW_LOGE("memory_allocation failed");
+ return folder;
+ }
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select * from folder_tbl where folder_type_id in (select folder_type_id from folder_tbl where account_id = %d and folder_id = \'%s\') " "and (account_id != %d) and (account_id != %d) and data_store_id in (select data_store_id from folder_tbl where folder_id = \'%s\')", accountId, folderId, accountId, accountId, folderId);
+
+ FW_LOGV("[RJW] %s", g_daci_query);
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt != 0) {
+ for (i = 0; i < dataCount; i++) {
+ if (__stmt_read_step(daci_handler, stmt) != DACI_ERR_MORE_DATA)
+ break;
+
+ folder[i].folder_id = __stmt_column_text(stmt, 0);
+ folder[i].data_store_id = __stmt_column_int(stmt, 1);
+ folder[i].account_id = __stmt_column_int(stmt, 2);
+ folder[i].folder_type_id = __stmt_column_int(stmt, 3);
+ folder[i].service_id = __stmt_column_text(stmt, 4);
+ folder[i].parent_folder_id = __stmt_column_text(stmt, 5);
+ folder[i].access_name = __stmt_column_text(stmt, 7);
+ }
+ __stmt_finalize(daci_handler, stmt);
+ }
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return folder;
+}
+
+int isExist_folder(DACI_HANDLER *daci_handler, int accountId, char *folderId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ int ret = 1;
+ int dataCount = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from folder_tbl where account_id = %d and folder_id = \'%s\'", accountId, folderId);
+
+ dataCount = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+
+ if (dataCount == 0)
+ ret = 0;
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN add_item(DACI_HANDLER *daci_handler, daci_item *item, int count)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ DACI_RETURN ret = DACI_SUCCESS;
+
+ int i;
+ for (i = 0; i < count; i++) {
+ if (isExist_item(daci_handler, item[i].item_id) == 1)
+ return DACI_ERR_PRIMARY_KEY_NOT_UNIQUE;
+ }
+
+ char *query = "insert into item_tbl (item_id, data_store_id, account_id, folder_id, service_id, access_name) values (?, ?, ?, ?, ?, ?)";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0) {
+ return DACI_ERR_QUERY_FAILED;
+ }
+
+ for (i = 0; i < count; i++) {
+ __stmt_bind_text(daci_handler, stmt, 1, item[i].item_id);
+ __stmt_bind_int(daci_handler, stmt, 2, item[i].data_store_id);
+ __stmt_bind_int(daci_handler, stmt, 3, item[i].account_id);
+ __stmt_bind_text(daci_handler, stmt, 4, item[i].folder_id);
+ __stmt_bind_text(daci_handler, stmt, 5, item[i].service_id);
+ __stmt_bind_text(daci_handler, stmt, 6, item[i].access_name);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ if ((ret != DACI_ERR_MORE_DATA) && (ret != DACI_SUCCESS)) {
+ __stmt_finalize(daci_handler, stmt);
+ return DACI_ERR_QUERY_FAILED;
+ }
+ __stmt_reset(daci_handler, stmt);
+ }
+
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN delete_itemByItemId(DACI_HANDLER *daci_handler, char *itemId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *query = "delete from item_tbl where item_id = ?";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ __stmt_bind_text(daci_handler, stmt, 1, itemId);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+
+ return ret;
+}
+
+DACI_RETURN delete_itemByItemTypeId(DACI_HANDLER *daci_handler, int accountId, int itemTypeId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ int i = 0;
+ int count = 0;
+ daci_item_info *itemInfo = 0;
+ char *query = "delete from item_tbl where account_id = ? and data_store_id = ?";
+
+ /* delete changelog */
+ itemInfo = get_itemInfoByItemTypeId(daci_handler, accountId, itemTypeId, &count);
+ if (count != 0) {
+ for (i = 0; i < count; i++) {
+ ret = delete_itemChangelogByItemId(daci_handler, accountId, itemInfo[i].itemId);
+ if (ret != DACI_SUCCESS)
+ goto DACI_FINISH;
+ }
+ }
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0)
+ goto DACI_FINISH;
+
+ __stmt_bind_int(daci_handler, stmt, 1, accountId);
+ __stmt_bind_int(daci_handler, stmt, 2, itemTypeId);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ if (ret != DACI_SUCCESS) {
+ goto DACI_FINISH;
+ }
+
+ DACI_Free_Memory_Item_Info(itemInfo, count);
+ return __stmt_finalize(daci_handler, stmt);
+
+DACI_FINISH:
+
+ DACI_Free_Memory_Item_Info(itemInfo, count);
+
+ if (stmt != 0)
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return DACI_ERR_QUERY_FAILED;
+
+}
+
+char *get_itemItemId(DACI_HANDLER *daci_handler, int accountId, char *serviceId, int itemTypeId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ char *query = "select item_id from item_tbl where account_id = ? and service_id = ? and data_store_id = ?";
+ char *itemId = 0;
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt != 0) {
+ __stmt_bind_int(daci_handler, stmt, 1, accountId);
+ __stmt_bind_text(daci_handler, stmt, 2, serviceId);
+ __stmt_bind_int(daci_handler, stmt, 3, itemTypeId);
+
+ if (__stmt_read_step(daci_handler, stmt) == DACI_ERR_MORE_DATA)
+ itemId = __stmt_column_text(stmt, 0);
+
+ __stmt_finalize(daci_handler, stmt);
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return itemId;
+}
+
+char *get_itemServiceId(DACI_HANDLER *daci_handler, char *itemId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ char *query = "select service_id from item_tbl where item_id = ?";
+ char *serviceId = 0;
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt != 0) {
+ __stmt_bind_text(daci_handler, stmt, 1, itemId);
+
+ if (__stmt_read_step(daci_handler, stmt) == DACI_ERR_MORE_DATA)
+ serviceId = __stmt_column_text(stmt, 0);
+
+ __stmt_finalize(daci_handler, stmt);
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return serviceId;
+}
+
+daci_item *get_item(DACI_HANDLER *daci_handler, char *itemId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ char *query = "select * from item_tbl where item_id = ?";
+ daci_item *item = 0;
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt != 0) {
+ __stmt_bind_text(daci_handler, stmt, 1, itemId);
+
+ if (__stmt_read_step(daci_handler, stmt) == DACI_ERR_MORE_DATA) {
+ item = DACI_MEMORY_MALLOC(daci_item *, sizeof(daci_item), 1);
+ if (item == 0) {
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGE("memory_allocation failed");
+ return item;
+ }
+
+ item->item_id = __stmt_column_text(stmt, 0);
+ item->data_store_id = __stmt_column_int(stmt, 1);
+ item->account_id = __stmt_column_int(stmt, 2);
+ item->folder_id = __stmt_column_text(stmt, 3);
+ item->service_id = __stmt_column_text(stmt, 4);
+ item->access_name = __stmt_column_text(stmt, 6);
+ }
+ __stmt_finalize(daci_handler, stmt);
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+
+ return item;
+}
+
+daci_id_list *get_itemIdList(DACI_HANDLER *daci_handler, char *folderId, DACI_COLUMN_NAME columnName)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_id_list *idList = 0;
+ char *columnStr = 0;
+ char **result = 0;
+ int rowCount = 0;
+ int colCount = 0;
+ int index = 1;
+ int i = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ columnStr = __get_column_name(columnName);
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select %s from item_tbl where folder_id = \'%s\'", columnStr, folderId);
+
+ ret = __get_table(daci_handler, g_daci_query, &result, &rowCount, &colCount);
+
+ if ((ret == DACI_SUCCESS) && (rowCount != 0) && (result != 0)) {
+ idList = DACI_MEMORY_MALLOC(daci_id_list *, sizeof(daci_id_list), 1);
+ if (idList == 0) {
+ FW_LOGE("memory_allocation failed");
+ goto DACI_FINISH;
+ }
+
+ idList->count = rowCount;
+ idList->id = DACI_MEMORY_CALLOC(char **, sizeof(char *), rowCount);
+
+ for (i = 0; i < rowCount; i++) {
+ idList->id[i] = DACI_STRDUP(result[index]);
+ index++;
+ }
+ }
+
+DACI_FINISH:
+
+ if (result != 0)
+ __free_table(result);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return idList;
+}
+
+daci_item *get_itemByAccountId(DACI_HANDLER *daci_handler, int accountId, int itemTypeId, int *count)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ daci_item *item = 0;
+ int dataCount = 0;
+ int i = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from item_tbl where account_id = %d and data_store_id = %d", accountId, itemTypeId);
+
+ dataCount = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+ *count = dataCount;
+
+ if (dataCount != 0) {
+ /* query initialize */
+ DACI_MEMORY_SET(g_daci_query);
+
+ item = DACI_MEMORY_MALLOC(daci_item *, sizeof(daci_item), dataCount);
+ if (item == 0) {
+ FW_LOGE("memory_allocation failed");
+ return item;
+ }
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select * from item_tbl where account_id = %d and data_store_id = %d", accountId, itemTypeId);
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt != 0) {
+ for (i = 0; i < dataCount; i++) {
+ if (__stmt_read_step(daci_handler, stmt) != DACI_ERR_MORE_DATA) {
+ break;
+ }
+
+ item[i].item_id = __stmt_column_text(stmt, 0);
+ item[i].data_store_id = __stmt_column_int(stmt, 1);
+ item[i].account_id = __stmt_column_int(stmt, 2);
+ item[i].folder_id = __stmt_column_text(stmt, 3);
+ item[i].service_id = __stmt_column_text(stmt, 4);
+ item[i].access_name = __stmt_column_text(stmt, 6);
+ }
+
+ __stmt_finalize(daci_handler, stmt);
+ }
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+
+ return item;
+}
+
+daci_item_info *get_itemInfoByItemTypeId(DACI_HANDLER *daci_handler, int accountId, int itemTypeId, int *count)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_item_info *itemInfo = 0;
+ char *newTable = 0;
+ char **result = 0;
+ int rowCount = 0;
+ int colCount = 0;
+ int i = 0;
+ int index = 5;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ newTable = __replace_table_name("account_%d_item_changelog_tbl", accountId, 1);
+ if (newTable == 0)
+ return itemInfo;
+ snprintf(g_daci_query, sizeof(g_daci_query), "select item.item_id, item.data_store_id, item.service_id, changelog.operation_id, changelog.status " "from item_tbl as item " "join %s as changelog " "using (item_id) " "where item.account_id = %d and item.data_store_id = %d", newTable, accountId, itemTypeId);
+
+ ret = __get_table(daci_handler, g_daci_query, &result, &rowCount, &colCount);
+ *count = rowCount;
+ if ((ret == DACI_SUCCESS) && (rowCount != 0) && (result != 0)) {
+ itemInfo = DACI_MEMORY_MALLOC(daci_item_info *, sizeof(daci_item_info), rowCount);
+ if (itemInfo == 0) {
+ FW_LOGE("memory_allocation failed");
+ goto DACI_FINISH;
+ }
+ for (i = 0; i < rowCount; i++) {
+ itemInfo[i].itemId = DACI_STRDUP(result[index]);
+ index++;
+ itemInfo[i].itemTypeId = DACI_ATOI(result[index]);
+ index++;
+ itemInfo[i].serviceId = DACI_STRDUP(result[index]);
+ index++;
+ itemInfo[i].operationId = DACI_ATOI(result[index]);
+ index++;
+ itemInfo[i].syncStatus = DACI_STRDUP(result[index]);
+ index++;
+ }
+ }
+
+DACI_FINISH:
+
+ if (result != 0)
+ __free_table(result);
+
+ /* memory free */
+ DACI_MEMORY_FREE(newTable);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return itemInfo;
+}
+
+daci_item *get_itemMappingServiceId(DACI_HANDLER *daci_handler, int accountId, char *itemId, int *count)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ daci_item *item = 0;
+ int dataCount = 0;
+ int i = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from item_tbl where data_store_id in (select data_store_id from item_tbl where account_id = %d and item_id = \'%s\') " "and service_id in (select service_id from item_tbl where account_id = %d and item_id = \'%s\') " "and (account_id != %d and item_id != \'%s\')", accountId, itemId, accountId, itemId, accountId, itemId);
+
+ dataCount = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+ *count = dataCount;
+
+ if (dataCount != 0) {
+ /* query initialize */
+ DACI_MEMORY_SET(g_daci_query);
+
+ item = DACI_MEMORY_MALLOC(daci_item *, sizeof(daci_item), dataCount);
+ if (item == 0) {
+ FW_LOGE("memory_allocation failed");
+ return item;
+ }
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select * from item_tbl where data_store_id in (select data_store_id from item_tbl where account_id = %d and item_id = \'%s\') " "and service_id in (select service_id from item_tbl where account_id = %d and item_id = \'%s\') " "and (account_id != %d and item_id != \'%s\')", accountId, itemId, accountId, itemId, accountId, itemId);
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt != 0) {
+ for (i = 0; i < dataCount; i++) {
+ if (__stmt_read_step(daci_handler, stmt) != DACI_ERR_MORE_DATA)
+ break;
+
+ item[i].item_id = __stmt_column_text(stmt, 0);
+ item[i].data_store_id = __stmt_column_int(stmt, 1);
+ item[i].account_id = __stmt_column_int(stmt, 2);
+ item[i].folder_id = __stmt_column_text(stmt, 3);
+ item[i].service_id = __stmt_column_text(stmt, 4);
+ item[i].access_name = __stmt_column_text(stmt, 6);
+ }
+
+ __stmt_finalize(daci_handler, stmt);
+ }
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return item;
+}
+
+daci_id_list *get_itemIdListByDataStoreId(DACI_HANDLER *daci_handler, int data_store_id)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ daci_id_list *item_id_list = 0;
+ int dataCount = 0;
+ int i = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from item_tbl where data_store_id = %d", data_store_id);
+
+ dataCount = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+
+ if (dataCount != 0) {
+ /* query initialize */
+ DACI_MEMORY_SET(g_daci_query);
+
+ item_id_list = (daci_id_list *)calloc(1, sizeof(daci_id_list));
+ item_id_list->id = (char **)calloc(dataCount, sizeof(char *));
+ item_id_list->count = dataCount;
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select item_id from item_tbl where data_store_id = %d", data_store_id);
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt != 0) {
+ for (i = 0; i < dataCount; i++) {
+ if (__stmt_read_step(daci_handler, stmt) != DACI_ERR_MORE_DATA) {
+ break;
+ }
+
+ item_id_list->id[i] = __stmt_column_text(stmt, 0);
+ }
+
+ __stmt_finalize(daci_handler, stmt);
+ }
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+
+ return item_id_list;
+}
+
+daci_id_list *get_itemIdListByDataStoreIdwithAccountId(DACI_HANDLER *daci_handler, int account_id, int data_store_id)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ daci_id_list *item_id_list = 0;
+ int dataCount = 0;
+ int i = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from item_tbl where account_id = %d and data_store_id = %d", account_id, data_store_id);
+
+ dataCount = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+
+ if (dataCount != 0) {
+ /* query initialize */
+ DACI_MEMORY_SET(g_daci_query);
+
+ item_id_list = (daci_id_list *)calloc(1, sizeof(daci_id_list));
+ item_id_list->id = (char **)calloc(dataCount, sizeof(char *));
+ item_id_list->count = dataCount;
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select item_id from item_tbl where account_id = %d and data_store_id = %d", account_id, data_store_id);
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt != 0) {
+ for (i = 0; i < dataCount; i++) {
+ if (__stmt_read_step(daci_handler, stmt) != DACI_ERR_MORE_DATA) {
+ break;
+ }
+
+ item_id_list->id[i] = __stmt_column_text(stmt, 0);
+ }
+
+ __stmt_finalize(daci_handler, stmt);
+ }
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+
+ return item_id_list;
+}
+
+daci_id_list *get_ItemIdListByOperationId(DACI_HANDLER *daci_handler, int account_id, int data_store_id, int operation_id)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_id_list *id_list = 0;
+ char *new_table = 0;
+ char **result = 0;
+ int row_count = 0;
+ int col_count = 0;
+ int index = 1;
+ int i = 0;
+ char query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ new_table = __replace_table_name("account_%d_item_changelog_tbl", account_id, 1);
+ if (new_table == 0)
+ return id_list;
+
+ snprintf(query, sizeof(query), "select item.item_id " "from item_tbl as item " "join %s as changelog " "using (item_id) " "where item.account_id = %d and item.data_store_id = %d and changelog.operation_id = %d", new_table, account_id, data_store_id, operation_id);
+
+ ret = __get_table(daci_handler, query, &result, &row_count, &col_count);
+ if ((ret == DACI_SUCCESS) && (row_count != 0) && (result != 0)) {
+ id_list = DACI_MEMORY_MALLOC(daci_id_list *, sizeof(daci_id_list), 1);
+
+ if (id_list == 0) {
+ FW_LOGE("memory_allocation failed");
+ goto DACI_FINISH;
+ }
+
+ id_list->count = row_count;
+ id_list->id = DACI_MEMORY_CALLOC(char **, sizeof(char *), row_count);
+
+ for (i = 0; i < row_count; i++) {
+ id_list->id[i] = DACI_STRDUP(result[index]);
+ index++;
+ }
+ }
+
+DACI_FINISH:
+ if (result != 0) {
+ __free_table(result);
+ }
+ /* memory free */
+ DACI_MEMORY_FREE(new_table);
+
+ FW_LOGV("[%s] End !\n", __func__);
+
+ return id_list;
+}
+
+int isExist_item(DACI_HANDLER *daci_handler, char *itemId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ int ret = 1;
+ int dataCount = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from item_tbl where item_id = \'%s\'", itemId);
+
+ dataCount = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+
+ if (dataCount == 0)
+ ret = 0;
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN add_config(DACI_HANDLER *daci_handler, daci_config *config)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ DACI_RETURN ret = DACI_SUCCESS;
+ char *query = "insert into config_tbl (config_id, key, value, type, access_name) values (?, ?, ?, ?, ?)";
+
+ if (isExist_config(daci_handler, config->config_id, config->key) == 1)
+ return DACI_ERR_PRIMARY_KEY_NOT_UNIQUE;
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ __stmt_bind_int(daci_handler, stmt, 1, config->config_id);
+ __stmt_bind_text(daci_handler, stmt, 2, config->key);
+ __stmt_bind_text(daci_handler, stmt, 3, config->value);
+ __stmt_bind_text(daci_handler, stmt, 4, config->type);
+ __stmt_bind_text(daci_handler, stmt, 5, config->access_name);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN delete_configByKey(DACI_HANDLER *daci_handler, int configId, char *key)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *query = "delete from config_tbl where config_id = ? and key = ?";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ __stmt_bind_int(daci_handler, stmt, 1, configId);
+ __stmt_bind_text(daci_handler, stmt, 2, key);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+daci_config *get_configByConfigId(DACI_HANDLER *daci_handler, int configId, int *count)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ daci_config *config = 0;
+ int dataCount = 0;
+ int i = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from config_tbl where config_id = %d", configId);
+
+ dataCount = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+ *count = dataCount;
+
+ if (dataCount != 0) {
+ /* query initialize */
+ DACI_MEMORY_SET(g_daci_query);
+
+ config = DACI_MEMORY_MALLOC(daci_config *, sizeof(daci_config), dataCount);
+ if (config == 0) {
+ FW_LOGE("memory_allocation failed");
+ return config;
+ }
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select * from config_tbl where config_id = %d", configId);
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt != 0) {
+ for (i = 0; i < dataCount; i++) {
+ if (__stmt_read_step(daci_handler, stmt) != DACI_ERR_MORE_DATA)
+ break;
+
+ config[i].config_id = __stmt_column_int(stmt, 0);
+ config[i].key = __stmt_column_text(stmt, 1);
+ config[i].value = __stmt_column_text(stmt, 2);
+ config[i].type = __stmt_column_text(stmt, 3);
+ config[i].access_name = __stmt_column_text(stmt, 5);
+ }
+ __stmt_finalize(daci_handler, stmt);
+ }
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return config;
+}
+
+DACI_RETURN get_configByKey(DACI_HANDLER *daci_handler, daci_config *config)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ int ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *query = "select value, type from config_tbl where config_id = ? and key =?";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0) {
+ return DACI_ERRORS;
+ }
+
+ __stmt_bind_int(daci_handler, stmt, 1, config->config_id);
+ __stmt_bind_text(daci_handler, stmt, 2, config->key);
+
+ if (__stmt_read_step(daci_handler, stmt) == DACI_ERR_MORE_DATA) {
+ config->value = __stmt_column_text(stmt, 0);
+ config->type = __stmt_column_text(stmt, 1);
+ config->access_name = 0;
+ } else {
+ ret = DACI_ERR_NO_DATA;
+ }
+
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+int isExist_config(DACI_HANDLER *daci_handler, int configId, char *key)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ int ret = 1;
+ int dataCount = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from config_tbl where config_id = %d and key = \'%s\'", configId, key);
+
+ dataCount = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+
+ if (dataCount == 0)
+ ret = 0;
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN update_config(DACI_HANDLER *daci_handler, daci_config *config, int count)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int i;
+
+ for (i = 0; i < count; i++) {
+ if (isExist_config(daci_handler, config[i].config_id, config[i].key) == 1)
+ ret = set_configValue(daci_handler, &config[i]);
+ else
+ ret = add_config(daci_handler, &config[i]);
+
+ if (ret != DACI_SUCCESS)
+ return DACI_ERR_QUERY_FAILED;
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN set_configValue(DACI_HANDLER *daci_handler, daci_config *config)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+
+ daci_stmt stmt = 0;
+ char *query = "update config_tbl set value = ?, type = ?, last_update = current_timestamp, access_name = ? " "where config_id = ? and key = ?";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ __stmt_bind_text(daci_handler, stmt, 1, config->value);
+ __stmt_bind_text(daci_handler, stmt, 2, config->type);
+ __stmt_bind_text(daci_handler, stmt, 3, config->access_name);
+ __stmt_bind_int(daci_handler, stmt, 4, config->config_id);
+ __stmt_bind_text(daci_handler, stmt, 5, config->key);
+
+ ret = __stmt_read_step(daci_handler, stmt);
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+
+ return ret;
+}
+
+DACI_RETURN add_itemChangelog(DACI_HANDLER *daci_handler, int accountId, daci_item_changelog *itemChangelog, int count)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ int i = 0;
+ char *newTable = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ for (i = 0; i < count; i++) {
+ if (isExist_itemChangelog(daci_handler, accountId, itemChangelog[i].item_id) == 1)
+ return DACI_ERR_PRIMARY_KEY_NOT_UNIQUE;
+ }
+
+ newTable = __replace_table_name("account_%d_item_changelog_tbl", accountId, 1);
+ if (newTable == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "insert into %s (item_id, operation_id, status, access_name) values (?, ?, ?, ?)", newTable);
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ for (i = 0; i < count; i++) {
+ __stmt_bind_text(daci_handler, stmt, 1, itemChangelog[i].item_id);
+ __stmt_bind_int(daci_handler, stmt, 2, itemChangelog[i].operation_id);
+ __stmt_bind_text(daci_handler, stmt, 3, ((itemChangelog[i].status == 0) ? "SYNC_REQUIRED" : itemChangelog[i].status));
+ __stmt_bind_text(daci_handler, stmt, 4, itemChangelog[i].access_name);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ if ((ret != DACI_ERR_MORE_DATA) && (ret != DACI_SUCCESS)) {
+ __stmt_finalize(daci_handler, stmt);
+ return DACI_ERR_QUERY_FAILED;
+ }
+ __stmt_reset(daci_handler, stmt);
+ }
+
+ ret = __stmt_finalize(daci_handler, stmt);
+
+ /* memory free */
+ DACI_MEMORY_FREE(newTable);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN delete_itemChangelogByItemId(DACI_HANDLER *daci_handler, int accountId, char *itemId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *newTable = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ newTable = __replace_table_name("account_%d_item_changelog_tbl", accountId, 1);
+ if (newTable == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "delete from %s where item_id = ?", newTable);
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ __stmt_bind_text(daci_handler, stmt, 1, itemId);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ __stmt_finalize(daci_handler, stmt);
+
+ /* memory free */
+ DACI_MEMORY_FREE(newTable);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN delete_itemChangelogByItemIdList(DACI_HANDLER *daci_handler, int accountId, char **itemIdList, int count)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ DACI_RETURN ret = DACI_SUCCESS;
+ char *newTable = 0;
+ int i;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ newTable = __replace_table_name("account_%d_item_changelog_tbl", accountId, 1);
+ if (newTable == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "delete from %s where item_id = ?", newTable);
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ for (i = 0; i < count; i++) {
+ __stmt_bind_text(daci_handler, stmt, 1, itemIdList[i]);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+
+ if (ret != DACI_SUCCESS) {
+ __stmt_finalize(daci_handler, stmt);
+ return DACI_ERR_QUERY_FAILED;
+ }
+ __stmt_reset(daci_handler, stmt);
+ }
+ __stmt_finalize(daci_handler, stmt);
+
+ /* memory free */
+ DACI_MEMORY_FREE(newTable);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN delete_itemChangelogByItemTypeId(DACI_HANDLER *daci_handler, int accountId, int itemTypeId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *newTable = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ newTable = __replace_table_name("account_%d_item_changelog_tbl", accountId, 1);
+ if (newTable == 0) {
+ ret = DACI_ERR_QUERY_FAILED;
+ goto DACI_FINISH;
+ }
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "delete from %s " "where item_id in " "(select item_id " "from %s as changelog " "join item_tbl as item " "using (item_id) " "where item.account_id = %d and item.data_store_id = %d)", newTable, newTable, accountId, itemTypeId);
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt == 0) {
+ ret = DACI_ERR_QUERY_FAILED;
+ goto DACI_FINISH;
+ }
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ if (ret != DACI_SUCCESS) {
+ ret = DACI_ERR_QUERY_FAILED;
+ goto DACI_FINISH;
+ }
+
+DACI_FINISH:
+
+ if (stmt != 0)
+ __stmt_finalize(daci_handler, stmt);
+
+ /* memory free */
+ DACI_MEMORY_FREE(newTable);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN set_itemChangelogOperationId(DACI_HANDLER *daci_handler, int accountId, daci_item_changelog *itemChangelog)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *newTable = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ newTable = __replace_table_name("account_%d_item_changelog_tbl", accountId, 1);
+ if (newTable == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "update %s set operation_id = ?, status = ?, last_update = current_timestamp, access_name = ? where item_id = ?", newTable);
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ __stmt_bind_int(daci_handler, stmt, 1, itemChangelog->operation_id);
+ __stmt_bind_text(daci_handler, stmt, 2, itemChangelog->status);
+ __stmt_bind_text(daci_handler, stmt, 3, itemChangelog->access_name);
+ __stmt_bind_text(daci_handler, stmt, 4, itemChangelog->item_id);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ __stmt_finalize(daci_handler, stmt);
+
+ /* memory free */
+ DACI_MEMORY_FREE(newTable);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN set_itemChangelogSyncStatus(DACI_HANDLER *daci_handler, int accountId, daci_item_changelog *itemChangelog)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *newTable = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ newTable = __replace_table_name("account_%d_item_changelog_tbl", accountId, 1);
+ if (newTable == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "update %s set status = ?, last_update = current_timestamp, access_name = ? where item_id = ?", newTable);
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ __stmt_bind_text(daci_handler, stmt, 1, itemChangelog->status);
+ __stmt_bind_text(daci_handler, stmt, 2, itemChangelog->access_name);
+ __stmt_bind_text(daci_handler, stmt, 3, itemChangelog->item_id);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ __stmt_finalize(daci_handler, stmt);
+
+ /* memory free */
+ DACI_MEMORY_FREE(newTable);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN set_itemChangelogWaitStatus(DACI_HANDLER *daci_handler, int accountId, char **folderIdList, int folderIdCount, int *itemTypeIdList, int itemTypeIdCount)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *newTable = 0;
+ char tempStr[10];
+ int i = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ newTable = __replace_table_name("account_%d_item_changelog_tbl", accountId, 1);
+ if (newTable == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "update %s " "set status = \'SYNC_WAIT\' " "where item_id in (select item_id " "from item_tbl as item " "join %s as changelog " "using(item_id) " "where item.account_id = %d and (", newTable, newTable, accountId);
+
+ for (i = 0; i < folderIdCount; i++) {
+ strcat(g_daci_query, "item.folder_id = \'");
+ strcat(g_daci_query, folderIdList[i]);
+
+ if (i < folderIdCount - 1)
+ strcat(g_daci_query, "\' or ");
+ else
+ strcat(g_daci_query, "\') and (");
+ }
+
+ for (i = 0; i < itemTypeIdCount; i++) {
+ memset(tempStr, 0x00, sizeof(tempStr));
+ snprintf(tempStr, sizeof(tempStr), "%d", itemTypeIdList[i]);
+
+ strcat(g_daci_query, "item.data_store_id = ");
+ strcat(g_daci_query, tempStr);
+
+ if (i < itemTypeIdCount - 1)
+ strcat(g_daci_query, " or ");
+ else
+ strcat(g_daci_query, ") )");
+ }
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ __stmt_finalize(daci_handler, stmt);
+
+ /* memory free */
+ DACI_MEMORY_FREE(newTable);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN get_itemChangelogByItemId(DACI_HANDLER *daci_handler, int accountId, daci_item_changelog *itemChangelog)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_ERR_QUERY_FAILED;
+ daci_stmt stmt = 0;
+ char *newTable = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ newTable = __replace_table_name("account_%d_item_changelog_tbl", accountId, 1);
+ if (newTable == 0)
+ return ret;
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select * from %s where item_id = \'%s\'", newTable, itemChangelog->item_id);
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt != 0) {
+ if (__stmt_read_step(daci_handler, stmt) == DACI_ERR_MORE_DATA) {
+ itemChangelog->operation_id = __stmt_column_int(stmt, 1);
+ itemChangelog->status = __stmt_column_text(stmt, 2);
+ itemChangelog->access_name = __stmt_column_text(stmt, 4);
+ ret = DACI_SUCCESS;
+ } else if (__stmt_read_step(daci_handler, stmt) == DACI_SUCCESS) {
+ ret = DACI_ERR_NO_DATA;
+ }
+ __stmt_finalize(daci_handler, stmt);
+ }
+
+ /* memory free */
+ DACI_MEMORY_FREE(newTable);
+
+ return ret;
+ FW_LOGV("[%s] End !\n", __func__);
+}
+
+daci_item_changelog *get_itemChangelogByOperationId(DACI_HANDLER *daci_handler, int accountId, int operationId, int *count)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ daci_item_changelog *itemChangelog = 0;
+ char *newTable = 0;
+ int dataCount = 0;
+ int i = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ newTable = __replace_table_name("account_%d_item_changelog_tbl", accountId, 1);
+ if (newTable == 0)
+ return itemChangelog;
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from %s where operation_id = %d", newTable, operationId);
+
+ dataCount = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+ *count = dataCount;
+
+ if (dataCount != 0) {
+ /* query initialize */
+ DACI_MEMORY_SET(g_daci_query);
+
+ itemChangelog = DACI_MEMORY_MALLOC(daci_item_changelog *, sizeof(daci_item_changelog), dataCount);
+ if (itemChangelog == 0) {
+ FW_LOGE("memory_allocation failed");
+
+ /* memory free */
+ DACI_MEMORY_FREE(newTable);
+
+ return itemChangelog;
+ }
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select * from %s where operation_id = %d", newTable, operationId);
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt != 0) {
+ for (i = 0; i < dataCount; i++) {
+ if (__stmt_read_step(daci_handler, stmt) != DACI_ERR_MORE_DATA)
+ break;
+
+ itemChangelog[i].item_id = __stmt_column_text(stmt, 0);
+ itemChangelog[i].operation_id = __stmt_column_int(stmt, 1);
+ itemChangelog[i].status = __stmt_column_text(stmt, 2);
+ itemChangelog[i].access_name = __stmt_column_text(stmt, 4);
+ }
+ __stmt_finalize(daci_handler, stmt);
+ }
+ }
+
+ /* memory free */
+ DACI_MEMORY_FREE(newTable);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return itemChangelog;
+}
+
+int isExist_itemChangelog(DACI_HANDLER *daci_handler, int accountId, char *itemId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ int ret = 1;
+ char *newTable = 0;
+ int dataCount = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ newTable = __replace_table_name("account_%d_item_changelog_tbl", accountId, 1);
+ if (newTable == 0)
+ return 0;
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from %s where item_id = \'%s\'", newTable, itemId);
+
+ dataCount = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+
+ if (dataCount == 0)
+ ret = 0;
+
+ /* memory free */
+ DACI_MEMORY_FREE(newTable);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN add_lastAnchor(DACI_HANDLER *daci_handler, daci_last_anchor *lastAnchor)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *query = 0;
+
+ if (isExist_lastAnchor(daci_handler, lastAnchor->account_id, lastAnchor->data_store_id) == 1)
+ return DACI_ERR_PRIMARY_KEY_NOT_UNIQUE;
+
+ query = "insert into last_anchor_tbl (account_id, data_store_id, last_anchor_server, last_anchor_client, access_name) values (?, ?, ?, ?, ?)";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ __stmt_bind_int(daci_handler, stmt, 1, lastAnchor->account_id);
+ __stmt_bind_int(daci_handler, stmt, 2, lastAnchor->data_store_id);
+ __stmt_bind_text(daci_handler, stmt, 3, lastAnchor->last_anchor_server);
+ __stmt_bind_text(daci_handler, stmt, 4, lastAnchor->last_anchor_client);
+ __stmt_bind_text(daci_handler, stmt, 5, lastAnchor->access_name);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN delete_lastAnchorByAccountId(DACI_HANDLER *daci_handler, int accountId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = __delete_account(daci_handler, TABLE_NAME_LAST_ANCHOR, accountId);
+ if (ret != DACI_SUCCESS)
+ return DACI_ERR_QUERY_FAILED;
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN delete_lastAnchorByItemTypeId(DACI_HANDLER *daci_handler, int accountId, int itemTypeId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *query = "delete from last_anchor_tbl where account_id = ? and data_store_id = ?";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ __stmt_bind_int(daci_handler, stmt, 1, accountId);
+ __stmt_bind_int(daci_handler, stmt, 2, itemTypeId);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN set_lastAnchor(DACI_HANDLER *daci_handler, daci_last_anchor *lastAnchor)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *query = "update last_anchor_tbl set last_anchor_server = ?, last_anchor_client = ?, last_update = current_timestamp, access_name = ?" "where account_id = ? and data_store_id = ?";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ __stmt_bind_text(daci_handler, stmt, 1, lastAnchor->last_anchor_server);
+ __stmt_bind_text(daci_handler, stmt, 2, lastAnchor->last_anchor_client);
+ __stmt_bind_text(daci_handler, stmt, 3, lastAnchor->access_name);
+ __stmt_bind_int(daci_handler, stmt, 4, lastAnchor->account_id);
+ __stmt_bind_int(daci_handler, stmt, 5, lastAnchor->data_store_id);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+daci_last_anchor *get_lastAnchorByAccountId(DACI_HANDLER *daci_handler, int accountId, int *count)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_last_anchor *lastAnchor = 0;
+ char **result = 0;
+ int rowCount = 0;
+ int colCount = 0;
+ int i = 0;
+ int index = 4;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select account_id, data_store_id, last_anchor_server, last_anchor_client from last_anchor_tbl where account_id = %d", accountId);
+
+ ret = __get_table(daci_handler, g_daci_query, &result, &rowCount, &colCount);
+ *count = rowCount;
+
+ if ((ret == DACI_SUCCESS) && (rowCount != 0) && (result != 0)) {
+ lastAnchor = DACI_MEMORY_MALLOC(daci_last_anchor *, sizeof(daci_last_anchor), rowCount);
+ if (lastAnchor == 0) {
+ FW_LOGE("memory_allocation failed");
+ goto DACI_FINISH;
+ }
+
+ for (i = 0; i < rowCount; i++) {
+ lastAnchor[i].account_id = DACI_ATOI(result[index]);
+ index++;
+ lastAnchor[i].data_store_id = DACI_ATOI(result[index]);
+ index++;
+ lastAnchor[i].last_anchor_server = DACI_STRDUP(result[index]);
+ index++;
+ lastAnchor[i].last_anchor_client = DACI_STRDUP(result[index]);
+ index++;
+ lastAnchor[i].access_name = 0;
+ }
+ }
+
+DACI_FINISH:
+
+ if (result != 0)
+ __free_table(result);
+
+ FW_LOGV("[%s] End !\n", __func__);
+
+ return lastAnchor;
+}
+
+daci_last_anchor *get_lastAnchorByItemTypeId(DACI_HANDLER *daci_handler, int accountId, int itemTypeId, int *count)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_last_anchor *lastAnchor = 0;
+ char **result = 0;
+ int rowCount = 0;
+ int colCount = 0;
+ int i = 0;
+ int index = 4;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select account_id, data_store_id, last_anchor_server, last_anchor_client from last_anchor_tbl where account_id = %d and data_store_id = %d", accountId, itemTypeId);
+
+ ret = __get_table(daci_handler, g_daci_query, &result, &rowCount, &colCount);
+ *count = rowCount;
+
+ if ((ret == DACI_SUCCESS) && (rowCount != 0) && (result != 0)) {
+ lastAnchor = DACI_MEMORY_MALLOC(daci_last_anchor *, sizeof(daci_last_anchor), rowCount);
+ if (lastAnchor == 0) {
+ FW_LOGE("memory_allocation failed");
+ goto DACI_FINISH;
+ }
+
+ for (i = 0; i < rowCount; i++) {
+ lastAnchor[i].account_id = DACI_ATOI(result[index]);
+ index++;
+ lastAnchor[i].data_store_id = DACI_ATOI(result[index]);
+ index++;
+ lastAnchor[i].last_anchor_server = DACI_STRDUP(result[index]);
+ index++;
+ lastAnchor[i].last_anchor_client = DACI_STRDUP(result[index]);
+ index++;
+ lastAnchor[i].access_name = 0;
+ }
+ }
+
+DACI_FINISH:
+
+ if (result != 0)
+ __free_table(result);
+
+ FW_LOGV("[%s] End !\n", __func__);
+
+ return lastAnchor;
+}
+
+int isExist_lastAnchor(DACI_HANDLER *daci_handler, int accountId, int itemTypeId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ int ret = 1;
+ int dataCount = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from last_anchor_tbl where account_id = %d and data_store_id = %d", accountId, itemTypeId);
+
+ dataCount = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+
+ if (dataCount == 0)
+ ret = 0;
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN add_mapping(DACI_HANDLER *daci_handler, daci_mapping *mapping)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *query = 0;
+
+ if (isExist_mappingByLuid(daci_handler, mapping->account_id, mapping->luid) == 1)
+ return DACI_ERR_PRIMARY_KEY_NOT_UNIQUE;
+
+ query = "insert into mapping_tbl (account_id, data_store_id, luid, guid, access_name) values (?, ?, ?, ?, ?)";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ __stmt_bind_int(daci_handler, stmt, 1, mapping->account_id);
+ __stmt_bind_int(daci_handler, stmt, 2, mapping->data_store_id);
+ __stmt_bind_text(daci_handler, stmt, 3, mapping->luid);
+ __stmt_bind_text(daci_handler, stmt, 4, mapping->guid);
+ __stmt_bind_text(daci_handler, stmt, 5, mapping->access_name);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN delete_mappingByAccountId(DACI_HANDLER *daci_handler, int accountId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = __delete_account(daci_handler, TABLE_NAME_MAPPING, accountId);
+ if (ret != DACI_SUCCESS)
+ return DACI_ERR_QUERY_FAILED;
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN delete_mappingByLuid(DACI_HANDLER *daci_handler, int accountId, char *luid)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *query = "delete from mapping_tbl where account_id = ? and luid = ?";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ __stmt_bind_int(daci_handler, stmt, 1, accountId);
+ __stmt_bind_text(daci_handler, stmt, 2, luid);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+daci_mapping *get_mappingByAccountId(DACI_HANDLER *daci_handler, int accountId, int *count)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ daci_mapping *mapping = 0;
+ int dataCount = 0;
+ int i = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from mapping_tbl where account_id = %d", accountId);
+
+ dataCount = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+ *count = dataCount;
+
+ if (dataCount != 0) {
+ /* query initialize */
+ DACI_MEMORY_SET(g_daci_query);
+
+ mapping = DACI_MEMORY_MALLOC(daci_mapping *, sizeof(daci_mapping), dataCount);
+ if (mapping == 0) {
+ FW_LOGE("memory_allocation failed");
+ return mapping;
+ }
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select * from mapping_tbl where account_id = %d", accountId);
+
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt != 0) {
+ for (i = 0; i < dataCount; i++) {
+ if (__stmt_read_step(daci_handler, stmt) != DACI_ERR_MORE_DATA)
+ break;
+
+ mapping[i].account_id = __stmt_column_int(stmt, 0);
+ mapping[i].data_store_id = __stmt_column_int(stmt, 1);
+ mapping[i].luid = __stmt_column_text(stmt, 2);
+ mapping[i].guid = __stmt_column_text(stmt, 3);
+ mapping[i].access_name = __stmt_column_text(stmt, 5);
+ }
+ __stmt_finalize(daci_handler, stmt);
+ }
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return mapping;
+}
+
+char *get_mappingGuid(DACI_HANDLER *daci_handler, int accountId, char *luid)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ char *query = "select guid from mapping_tbl where account_id = ? and luid = ?";
+ char *guid = 0;
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt != 0) {
+ __stmt_bind_int(daci_handler, stmt, 1, accountId);
+ __stmt_bind_text(daci_handler, stmt, 2, luid);
+
+ if (__stmt_read_step(daci_handler, stmt) == DACI_ERR_MORE_DATA)
+ guid = __stmt_column_text(stmt, 0);
+
+ __stmt_finalize(daci_handler, stmt);
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return guid;
+}
+
+int isExist_mappingByAccountId(DACI_HANDLER *daci_handler, int accountId)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ int ret = 1;
+ int dataCount = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from mapping_tbl where account_id = %d", accountId);
+
+ dataCount = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+
+ if (dataCount == 0)
+ ret = 0;
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+int isExist_mappingByLuid(DACI_HANDLER *daci_handler, int accountId, char *luid)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ int ret = 1;
+ int dataCount = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ snprintf(g_daci_query, sizeof(g_daci_query), "select count(*) from mapping_tbl where account_id = %d and luid = \'%s\'", accountId, luid);
+
+ dataCount = __get_data_count(daci_handler, g_daci_query, strlen(g_daci_query));
+
+ if (dataCount == 0)
+ ret = 0;
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN add_id_provider(DACI_HANDLER *daci_handler, daci_id_provider *id_provider)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ DACI_RETURN ret = DACI_SUCCESS;
+ char *query = 0;
+
+ query = "insert into id_provider_tbl (id_provider_code, id_capacity, bit_per_page, last_id, free_bit_cnt) values (?, ?, ?, ?, ?)";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0) {
+ return DACI_ERR_QUERY_FAILED;
+ }
+
+ __stmt_bind_int(daci_handler, stmt, 1, id_provider->id_provider_code);
+ __stmt_bind_int(daci_handler, stmt, 2, id_provider->id_capacity);
+ __stmt_bind_int(daci_handler, stmt, 3, id_provider->bit_per_page);
+ __stmt_bind_int(daci_handler, stmt, 4, id_provider->last_id);
+ __stmt_bind_int(daci_handler, stmt, 5, id_provider->free_bit_cnt);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ if (ret != DACI_SUCCESS) {
+ __stmt_finalize(daci_handler, stmt);
+ return DACI_ERR_QUERY_FAILED;
+ }
+
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN get_id_provider(DACI_HANDLER *daci_handler, unsigned int id_provider_code, daci_id_provider **id_provider)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ int ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *query = "select id_capacity, bit_per_page, last_id, free_bit_cnt from id_provider_tbl where id_provider_code = ?";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt != 0) {
+ __stmt_bind_int(daci_handler, stmt, 1, id_provider_code);
+
+ if (__stmt_read_step(daci_handler, stmt) == DACI_ERR_MORE_DATA) {
+ *id_provider = (daci_id_provider *)calloc(1, sizeof(daci_id_provider));
+ (*id_provider)->id_capacity = __stmt_column_int(stmt, 0);
+ (*id_provider)->bit_per_page = __stmt_column_int(stmt, 1);
+ (*id_provider)->last_id = __stmt_column_int(stmt, 2);
+ (*id_provider)->free_bit_cnt = __stmt_column_int(stmt, 3);
+ } else {
+ ret = DACI_ERR_NO_DATA;
+ }
+ __stmt_finalize(daci_handler, stmt);
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN update_id_provider(DACI_HANDLER *daci_handler, daci_id_provider *id_provider)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *query = "update id_provider_tbl set last_id = ?, free_bit_cnt = ? where id_provider_code = ?";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ __stmt_bind_int(daci_handler, stmt, 1, id_provider->last_id);
+ __stmt_bind_int(daci_handler, stmt, 2, id_provider->free_bit_cnt);
+ __stmt_bind_int(daci_handler, stmt, 3, id_provider->id_provider_code);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN add_id_page(DACI_HANDLER *daci_handler, daci_id_page *id_page, unsigned int page_byte_size)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ daci_stmt stmt = 0;
+ DACI_RETURN ret = DACI_SUCCESS;
+ char *query = 0;
+
+ query = "insert into id_page_tbl (page_index, id_provider_code, page_bit) values (?, ?, ?)";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0) {
+ return DACI_ERR_QUERY_FAILED;
+ }
+
+ __stmt_bind_int(daci_handler, stmt, 1, id_page->page_index);
+ __stmt_bind_int(daci_handler, stmt, 2, id_page->id_provider_code);
+ __stmt_bind_blob(daci_handler, stmt, 3, id_page->page_bit, page_byte_size);
+ int i = 0;
+ for (; i < page_byte_size; i++) {
+ FW_LOGV("[%d] %d\n", i, (id_page->page_bit)[i]);
+ }
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ if (ret != DACI_SUCCESS) {
+ __stmt_finalize(daci_handler, stmt);
+ return DACI_ERR_QUERY_FAILED;
+ }
+
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN delete_id_page(DACI_HANDLER *daci_handler, unsigned int id_provider_code, unsigned int page_index)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *query = "delete from id_page_tbl where id_provider_code = ? and page_index = ?";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ __stmt_bind_int(daci_handler, stmt, 1, id_provider_code);
+ __stmt_bind_int(daci_handler, stmt, 2, page_index);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN get_id_page(DACI_HANDLER *daci_handler, unsigned int id_provider_code, unsigned int page_index, char **page_bit)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *query = "select page_bit from id_page_tbl where id_provider_code = ? and page_index = ?";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt != 0) {
+ __stmt_bind_int(daci_handler, stmt, 1, id_provider_code);
+ __stmt_bind_int(daci_handler, stmt, 2, page_index);
+
+ if (__stmt_read_step(daci_handler, stmt) == DACI_ERR_MORE_DATA) {
+ int byte_len = sqlite3_column_bytes(stmt, 0);
+ *page_bit = (char *)calloc(byte_len, sizeof(char));
+ char *geted_page_bit = __stmt_column_text(stmt, 0);
+
+ memcpy(*page_bit, geted_page_bit, byte_len);
+
+ DACI_MEMORY_FREE(geted_page_bit);
+ } else {
+ FW_LOGV("NO DATA");
+ *page_bit = 0;
+ }
+ __stmt_finalize(daci_handler, stmt);
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN update_id_page(DACI_HANDLER *daci_handler, daci_id_page *id_page, unsigned int page_byte_size)
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ daci_stmt stmt = 0;
+ char *query = "update id_page_tbl set page_bit = ? where id_provider_code = ? and page_index = ?";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ __stmt_bind_blob(daci_handler, stmt, 1, id_page->page_bit, page_byte_size);
+ __stmt_bind_int(daci_handler, stmt, 2, id_page->id_provider_code);
+ __stmt_bind_int(daci_handler, stmt, 3, id_page->page_index);
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ __stmt_finalize(daci_handler, stmt);
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return ret;
+}
+
+int __busy_handler(void *pData, int count)
+{
+ FW_LOGV("__busy_handler %d called", count);
+
+ /* sleep time when SQLITE_LOCK */
+ usleep(100000);
+
+ /* retry will be stopped if busy handler return 0 */
+ return DACI_RETRY_COUNT - count;
+}
+
+DACI_RETURN __query_exec(DACI_HANDLER *daci_handler, char *query, char *errMsg)
+{
+ char *queryMsg = 0;
+ int ret = 0;
+
+ if (daci_handler == 0)
+ return DACI_ERR_NOT_OPENED;
+
+ ret = sqlite3_exec(daci_handler, query, 0, 0, &queryMsg);
+ if (ret != SQLITE_OK) {
+ FW_LOGE("%s(%d) : %s", errMsg, ret, queryMsg);
+
+ if (0 != queryMsg)
+ sqlite3_free(queryMsg);
+
+ if (ret == SQLITE_BUSY)
+ return DACI_ERR_LOCKED;
+
+ return DACI_ERR_QUERY_FAILED;
+ }
+
+ return DACI_SUCCESS;
+}
+
+daci_stmt __query_prepare(DACI_HANDLER *daci_handler, char *query, int size)
+{
+ int ret = 0;
+ daci_stmt stmt = 0;
+
+ pthread_mutex_lock(&exec_lock);
+ ret = sqlite3_prepare_v2(daci_handler, query, size, &stmt, 0);
+ pthread_mutex_unlock(&exec_lock);
+
+ if (ret != SQLITE_OK)
+ FW_LOGE("sqlite3_query_prepare failed(%d) : %s ", ret, sqlite3_errmsg(daci_handler));
+
+ return stmt;
+}
+
+DACI_RETURN __stmt_bind_text(DACI_HANDLER *daci_handler, daci_stmt stmt, int index, const char *value)
+{
+ int ret = 0;
+
+ if (value != 0) {
+ ret = sqlite3_bind_text(stmt, index, value, strlen(value), SQLITE_STATIC);
+ } else {
+ ret = __stmt_bind_null(daci_handler, stmt, index);
+
+ if (ret == DACI_SUCCESS)
+ ret = SQLITE_OK;
+ }
+
+ if (ret != SQLITE_OK) {
+ FW_LOGE("sqlite3_stmt_bind_text failed(%d) : %s ", ret, sqlite3_errmsg(daci_handler));
+ return DACI_ERR_QUERY_FAILED;
+ }
+
+ return DACI_SUCCESS;
+}
+
+DACI_RETURN __stmt_bind_int(DACI_HANDLER *daci_handler, daci_stmt stmt, int index, const int value)
+{
+ int ret = 0;
+
+ ret = sqlite3_bind_int(stmt, index, value);
+ if (ret != SQLITE_OK) {
+ FW_LOGE("sqlite3_stmt_bind_int failed(%d) : %s \n", ret, sqlite3_errmsg(daci_handler));
+ return DACI_ERR_QUERY_FAILED;
+ }
+
+ return DACI_SUCCESS;
+}
+
+static DACI_RETURN __stmt_bind_blob(DACI_HANDLER *daci_handler, daci_stmt stmt, int index, const void *value, int nByte)
+{
+ int ret = 0;
+
+ ret = sqlite3_bind_blob(stmt, index, value, nByte, 0);
+ if (ret != SQLITE_OK) {
+ FW_LOGE("sqlite3_bind_blob failed(%d) : %s \n", ret, sqlite3_errmsg(daci_handler));
+ return DACI_ERR_QUERY_FAILED;
+ }
+
+ return DACI_SUCCESS;
+}
+
+DACI_RETURN __stmt_bind_null(DACI_HANDLER *daci_handler, daci_stmt stmt, int index)
+{
+ int ret = 0;
+
+ ret = sqlite3_bind_null(stmt, index);
+ if (ret != SQLITE_OK) {
+ FW_LOGE("sqlite3_stmt_bind_null failed(%d) : %s", ret, sqlite3_errmsg(daci_handler));
+ return DACI_ERR_QUERY_FAILED;
+ }
+
+ return DACI_SUCCESS;
+}
+
+DACI_RETURN __stmt_read_step(DACI_HANDLER *daci_handler, daci_stmt stmt)
+{
+ int ret = 0;
+
+ pthread_mutex_lock(&exec_lock);
+
+ ret = sqlite3_step(stmt);
+
+ pthread_mutex_unlock(&exec_lock);
+
+ if (ret == SQLITE_ROW)
+ return DACI_ERR_MORE_DATA;
+
+ if (ret != SQLITE_DONE) {
+ FW_LOGE("sqlite3_stmt_step failed(%d) : %s", ret, sqlite3_errmsg(daci_handler));
+
+ if (ret == SQLITE_BUSY)
+ return DACI_ERR_LOCKED;
+
+ return DACI_ERR_QUERY_FAILED;
+ }
+
+ return DACI_SUCCESS;
+}
+
+static DACI_RETURN __stmt_write_step(DACI_HANDLER *daci_handler, daci_stmt stmt)
+{
+ int transaction_flag = 0;
+
+ if (use_transaction_thread_id != 0) {
+ if (use_transaction_thread_id != DACI_GET_THREAD_ID) {
+ pthread_mutex_lock(&transaction_lock);
+ use_transaction_thread_id = DACI_GET_THREAD_ID;
+ transaction_flag = 1;
+ }
+ }
+
+ pthread_mutex_lock(&exec_lock);
+
+ int ret = sqlite3_step(stmt);
+
+ pthread_mutex_unlock(&exec_lock);
+
+ if (transaction_flag) {
+ use_transaction_thread_id = 0;
+ pthread_mutex_unlock(&transaction_lock);
+ }
+
+ if (ret == SQLITE_ROW) {
+ return DACI_ERR_MORE_DATA;
+ }
+
+ if (ret != SQLITE_DONE) {
+ FW_LOGE("sqlite3_stmt_step failed(%d) : %s", ret, sqlite3_errmsg(daci_handler));
+ if (ret == SQLITE_BUSY) {
+ FW_LOGE("Never reached this line!!");
+ return DACI_ERR_LOCKED;
+ }
+ return DACI_ERR_QUERY_FAILED;
+ }
+
+ return DACI_SUCCESS;
+}
+
+DACI_RETURN __stmt_reset(DACI_HANDLER *daci_handler, daci_stmt stmt)
+{
+ int ret = 0;
+
+ if (sqlite3_reset(stmt) != SQLITE_OK) {
+ FW_LOGE("sqlite3_stmt_reset failed(%d) : %s", ret, sqlite3_errmsg(daci_handler));
+ return DACI_ERRORS;
+ }
+
+ return DACI_SUCCESS;
+}
+
+DACI_RETURN __stmt_finalize(DACI_HANDLER *daci_handler, daci_stmt stmt)
+{
+ int ret = 0;
+
+ if (sqlite3_finalize(stmt) != SQLITE_OK) {
+ FW_LOGE("sqlite3_stmt_finalize failed(%d) : %s", ret, sqlite3_errmsg(daci_handler));
+ return DACI_ERRORS;
+ }
+
+ return DACI_SUCCESS;
+}
+
+char *__stmt_column_text(daci_stmt stmt, int index)
+{
+ char *temp = 0;
+ temp = (char *)sqlite3_column_text(stmt, index);
+
+ return DACI_STRDUP(temp);
+}
+
+int __stmt_column_int(daci_stmt stmt, int index)
+{
+ return (int)sqlite3_column_int(stmt, index);
+}
+
+DACI_RETURN __get_table(DACI_HANDLER *daci_handler, char *query, char ***result, int *rowCount, int *colCount)
+{
+ int ret = 0;
+ char *errMsg;
+
+ if (daci_handler == 0)
+ return DACI_ERR_NOT_OPENED;
+
+ ret = sqlite3_get_table(daci_handler, query, result, rowCount, colCount, &errMsg);
+ if (ret != SQLITE_OK) {
+ FW_LOGE("sqlite3_get_table failed(%d) : %s", ret, errMsg);
+
+ __free_table(*result);
+ if (0 != errMsg)
+ sqlite3_free(errMsg);
+ return DACI_ERR_QUERY_FAILED;
+ }
+ return DACI_SUCCESS;
+}
+
+void __free_table(char **result)
+{
+ if (result != 0)
+ sqlite3_free_table(result);
+}
+
+DACI_RETURN __create_changelog_table(DACI_HANDLER *daci_handler, int accountId)
+{
+ DACI_RETURN ret = DACI_SUCCESS;
+ char *newTable = 0;
+ char *newTableCreate = 0;
+
+ ret = begin_transaction(daci_handler);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("agent_db_changelog_tbl_create failed");
+ return DACI_ERR_CREATE_TABLE_FAILED;
+ }
+
+ /* 9. create account_item_changelog_tbl */
+ newTable = __replace_table_name("account_%d_item_changelog_tbl", accountId, 1);
+ if (newTable == 0) {
+ end_transaction(daci_handler, TRANSACTION_ROLLBACK);
+ return DACI_ERR_CREATE_TABLE_FAILED;
+ }
+
+ if (__exist_table(daci_handler, newTable) == 0) {
+ newTableCreate = __replace_table_name(g_daci_create_table[TABLE_NAME_ACCOUNT_ITEM_CHANGELOG], accountId, 4);
+
+ ret = __query_exec(daci_handler, newTableCreate, "Item_changelog_tbl_create failed");
+
+ if (ret != DACI_SUCCESS) {
+ end_transaction(daci_handler, TRANSACTION_ROLLBACK);
+ return DACI_ERR_CREATE_TABLE_FAILED;
+ }
+ }
+
+ /* memory free */
+ DACI_MEMORY_FREE(newTable);
+ DACI_MEMORY_FREE(newTableCreate);
+
+ return end_transaction(daci_handler, TRANSACTION_COMMIT);
+}
+
+DACI_RETURN __drop_changelog_table(DACI_HANDLER *daci_handler, int accountId)
+{
+ DACI_RETURN ret = DACI_SUCCESS;
+ char *newTableDrop = 0;
+
+ /* 9. drop account_item_changelog_tbl */
+ newTableDrop = __replace_table_name(g_daci_drop_table[TABLE_NAME_ACCOUNT_ITEM_CHANGELOG], accountId, 1);
+
+ ret = __query_exec(daci_handler, newTableDrop, "Item_changelog_tbl_drop failed");
+ if (ret != DACI_SUCCESS) {
+/* end_transaction(daci_handler, TRANSACTION_ROLLBACK);*/
+ return DACI_ERR_DROP_TABLE_FAILED;
+ }
+
+ /* memory free */
+ DACI_MEMORY_FREE(newTableDrop);
+
+ return ret;
+}
+
+int __exist_table(DACI_HANDLER *daci_handler, const char *tableName)
+{
+ daci_stmt stmt = 0;
+ int tableCount = 0;
+ char *query = "select count(*) from sqlite_master where tbl_name= ?";
+
+ stmt = __query_prepare(daci_handler, query, strlen(query));
+ if ((stmt != 0) && (__stmt_bind_text(daci_handler, stmt, 1, tableName) == DACI_SUCCESS)) {
+
+ if (__stmt_read_step(daci_handler, stmt) == DACI_ERR_MORE_DATA)
+ tableCount = __stmt_column_int(stmt, 0);
+
+ __stmt_finalize(daci_handler, stmt);
+
+ if (tableCount > 0)
+ return 1;
+ }
+ return 0;
+}
+
+int __get_data_count(DACI_HANDLER *daci_handler, char *query, int size)
+{
+ daci_stmt stmt = 0;
+ int dataCount = 0;
+
+ stmt = __query_prepare(daci_handler, query, size);
+ if (stmt != 0) {
+ if (__stmt_read_step(daci_handler, stmt) == DACI_ERR_MORE_DATA)
+ dataCount = __stmt_column_int(stmt, 0);
+
+ __stmt_finalize(daci_handler, stmt);
+ }
+
+ return dataCount;
+}
+
+char *__replace_table_name(char *oldTable, int accountId, int count)
+{
+ char *newTable = 0;
+ int length = 0;
+
+ if (oldTable == 0) {
+ FW_LOGE("oldTable is null");
+ return newTable;
+ }
+
+ /* SVACE : Measure the size for allocation memory. */
+ if (count == 1) /* table name convert */
+ length = snprintf(0, 0, oldTable, accountId);
+ else if (count == 4) /* table create query convert */
+ length = snprintf(0, 0, oldTable, accountId, accountId, accountId, accountId);
+
+ newTable = DACI_MEMORY_MALLOC(char *, sizeof(char), (length + 1));
+ if (newTable == 0) {
+ FW_LOGE("memory_allocation failed");
+ return newTable;
+ }
+
+ if (count == 1)
+ sprintf(newTable, oldTable, accountId);
+ else if (count == 4)
+ sprintf(newTable, oldTable, accountId, accountId, accountId, accountId);
+
+ return newTable;
+}
+
+char *__get_table_name(DACI_TABLE_NAME tableName)
+{
+ char *tableStr = 0;
+
+ switch (tableName) {
+ case TABLE_NAME_ACCOUNT:
+ {
+ tableStr = "account_tbl";
+ }
+ break;
+ case TABLE_NAME_FOLDER:
+ {
+ tableStr = "folder_tbl";
+ }
+ break;
+ case TABLE_NAME_ITEM:
+ {
+ tableStr = "item_tbl";
+ }
+ break;
+ case TABLE_NAME_CONFIG:
+ {
+ tableStr = "config_tbl";
+ }
+ break;
+ case TABLE_NAME_ACCOUNT_ITEM_CHANGELOG:
+ {
+ tableStr = "account_item_changelog_tbl";
+ }
+ break;
+ case TABLE_NAME_LAST_ANCHOR:
+ {
+ tableStr = "last_anchor_tbl";
+ }
+ break;
+ case TABLE_NAME_MAPPING:
+ {
+ tableStr = "mapping_tbl";
+ }
+ break;
+ case TABLE_NAME_ID_PROVIDER:
+ {
+ tableStr = "id_provider_tbl";
+ }
+ break;
+ case TABLE_NAME_ID_PAGE:
+ {
+ tableStr = "id_page_tbl";
+ }
+ break;
+ default:
+ break;
+ }
+
+ return tableStr;
+}
+
+char *__get_column_name(DACI_COLUMN_NAME columnName)
+{
+ char *columnStr = 0;
+
+ switch (columnName) {
+ case COLUMN_NAME_ITEM_ID:
+ {
+ columnStr = "item_id";
+ }
+ break;
+ case COLUMN_NAME_SERVICE_ID:
+ {
+ columnStr = "service_id";
+ }
+ break;
+ default:
+ break;
+ }
+
+ return columnStr;
+}
+
+int __get_next_account_id()
+{
+ int nextAccountId = 1;
+ int *accountIdList = 0;
+ int count = 0;
+ int i = 0;
+
+ accountIdList = DACI_Get_Account_Account_Id_List(&count);
+ if (accountIdList != 0) {
+ for (i = 0; i < count; i++) {
+ if ((i + 1) != accountIdList[i])
+ break;
+
+ nextAccountId++;
+ }
+
+ free(accountIdList);
+ }
+ return nextAccountId;
+}
+
+DACI_RETURN __delete_account(DACI_HANDLER *daci_handler, DACI_TABLE_NAME tableName, int accountId)
+{
+ daci_stmt stmt = 0;
+ DACI_RETURN ret = DACI_SUCCESS;
+ char *tableStr = 0;
+ char g_daci_query[DACI_MAX_QUERY_LENGTH] = { 0, };
+
+ tableStr = __get_table_name(tableName);
+
+ if (!strcmp(tableStr, "config_tbl")) {
+ snprintf(g_daci_query, sizeof(g_daci_query), "delete from %s where config_id = %d", tableStr, accountId);
+ } else if (!strcmp(tableStr, "id_provider_tbl") || !strcmp(tableStr, "id_page_tbl")) {
+ return ret;
+ } else {
+ snprintf(g_daci_query, sizeof(g_daci_query), "delete from %s where account_id = %d", tableStr, accountId);
+ }
+
+ FW_LOGV("i = %d, tableName = %s, query = %s", tableName, tableStr, g_daci_query);
+ stmt = __query_prepare(daci_handler, g_daci_query, strlen(g_daci_query));
+ if (stmt == 0)
+ return DACI_ERR_QUERY_FAILED;
+
+ ret = __stmt_write_step(daci_handler, stmt);
+ __stmt_finalize(daci_handler, stmt);
+
+ return ret;
+}
+
+/*
+ *=============================================================================================================================
+ * Testing
+ *=============================================================================================================================
+*/
+void drop_table(DACI_HANDLER *daci_handler, int *accountIdList, int accountCount)
+{
+ int i;
+
+ for (i = 0; i < accountCount; i++)
+ __drop_changelog_table(daci_handler, accountIdList[i]);
+}
+
+char *get_daci_file_path()
+{
+ return daci_file_path;
+}
diff --git a/framework/src/DataAdapter/DACI_Agent_Handler_Manager.c b/framework/src/DataAdapter/DACI_Agent_Handler_Manager.c
new file mode 100755
index 0000000..28a4508
--- /dev/null
+++ b/framework/src/DataAdapter/DACI_Agent_Handler_Manager.c
@@ -0,0 +1,1181 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ * Heeyoung Hwang <heeyoung1008.hwang@samsung.com>
+ */
+
+#include "Utility/fw_log.h"
+
+#include "DataAdapter/DACI_Agent.h"
+
+#include "DataAdapter/DACI_Agent_Handler_Manager.h"
+
+#define LOG_TAG "AF_DACI"
+
+static daci_handler_mgr *pAgentDBHandlerMgr = 0;
+
+/* static function define */
+static DACI_RETURN __alloc_agent_dc_handlerTable();
+static DACI_RETURN __alloc_agent_dc_handlerTable_mutex();
+static DACI_RETURN __free_agent_dc_handlerTable();
+static DACI_RETURN __free_agent_dc_handlerTable_mutex();
+static DACI_RETURN __create_agentDBHandlerMgrInfo();
+static void __destroy_agentDBHashTableValue(void *pHandler);
+static void __destory_agentDBHashTableKey(void *key);
+
+/* general function implementation */
+/*
+ * ==================================
+ * external API (1. about agent db handler mgr)
+ * ==================================
+ */
+DACI_RETURN DACI_Alloc_AgentDB_Handler_Mgr()
+{
+ FW_LOGV("[%s] start !\n", __func__);
+ DACI_RETURN ret = DACI_SUCCESS;
+
+ /* alloc the agentDBHandlerMgr */
+ pAgentDBHandlerMgr = (daci_handler_mgr *) calloc(1, sizeof(daci_handler_mgr));
+ if (pAgentDBHandlerMgr == 0)
+ return DACI_ERR_DB_HANDLER_MGR;
+ FW_LOGV("[%s] pAgentDBHandlerMgr alloc success !\n", __func__);
+
+ /* alloc the agentDBHandlerMgr information */
+ ret = __create_agentDBHandlerMgrInfo();
+ if (ret != DACI_SUCCESS)
+ FW_LOGV("[%s] __create_agentDBHandlerMgrInfo alloc fail !\n", __func__);
+ else
+ FW_LOGV("[%s] __create_agentDBHandlerMgrInfo alloc success !\n", __func__);
+
+ FW_LOGV("[%s] end !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN DACI_Free_AgentDB_Handler_Mgr()
+{
+ FW_LOGV("[%s] start !\n", __func__);
+ DACI_RETURN ret = DACI_SUCCESS;
+
+ if (pAgentDBHandlerMgr != 0) {
+
+ ret = __free_agent_dc_handlerTable_mutex();
+ if (ret != DACI_SUCCESS)
+ return DACI_ERR_DB_HANDLER_MGR;
+
+ ret = __free_agent_dc_handlerTable();
+ if (ret != DACI_SUCCESS)
+ return DACI_ERR_DB_HANDLER_MGR;
+
+ }
+
+ FW_LOGV("[%s] end !\n", __func__);
+ return ret;
+}
+
+/*
+ * ==================================
+ * external API (2. about agent db )
+ * ==================================
+ */
+DACI_RETURN DACI_Clear_All_Database_Account()
+{
+ DACI_RETURN ret = DACI_SUCCESS;
+ int *accountIdList = 0;
+ int count = 0;
+ int i = 0;
+
+ accountIdList = DACI_Get_Account_Account_Id_List(&count);
+ if (accountIdList == 0) {
+ FW_LOGE("accountIdList empty");
+ return DACI_ERR_DB_HANDLER_MGR;
+ } else {
+ FW_LOGV("accountListCount : %d", count);
+ }
+
+ for (i = 0; i < count; i++) {
+ ret = DACI_Delete_All_Database_Account(accountIdList[i]);
+ if (ret != DACI_SUCCESS)
+ break;
+ }
+
+ /* memory free */
+ if (accountIdList != 0)
+ free(accountIdList);
+
+ return ret;
+}
+
+DACI_RETURN DACI_Delete_All_Database_Account(int accountId)
+{
+ DACI_RETURN ret = 0;
+
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERRORS;
+ }
+
+ int dataCount = 0;
+/* if (DACI_IsExist_Account(accountId) && DACI_Delete_EmailAccount(accountId) &&
+ DACI_Delete_ContactAccount(accountId) && DACI_Delete_CalendarAccount(accountId) &&
+ (DACI_Delete_Account(accountId) == DACI_SUCCESS)) {*/
+
+ if (DACI_IsExist_Account(accountId) && (DACI_Delete_Account(accountId) == DACI_SUCCESS)) {
+ /* all of the deleted account */
+ dataCount = get_accountCount(daci_handler);
+ if (dataCount == 0)
+ ret = DACI_ERR_DELETE_LAST_ACCOUNT;
+ else
+ ret = DACI_SUCCESS;
+
+ } else {
+ ret = DACI_ERRORS;
+ }
+
+ return ret;
+}
+
+DACI_RETURN DACI_Open_Agent()
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+ int ret = 0;
+
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+
+ FW_LOGV("daci_handler is 0");
+ FW_LOGV("should register agent_handler to agent_handler_hash_table");
+ ret = open_agent(&daci_handler);
+ if (ret != DACI_SUCCESS)
+ return ret;
+
+ if (daci_handler != 0) {
+ /* add agentDB handler to agentDBHandleMgr */
+ ret = add_agentHandler(DACI_GET_THREAD_ID, daci_handler);
+ if (ret != DACI_SUCCESS)
+ return ret;
+ }
+
+ } else {
+ FW_LOGV("daci_handler is not null");
+ FW_LOGV("should not register mo_handler to mo_handler_hash_table");
+ }
+
+ FW_LOGV("agent_db_agent_open_success");
+ FW_LOGV("[%s] End !\n", __func__);
+ return DACI_SUCCESS;
+}
+
+DACI_RETURN DACI_Close_Agent()
+{
+ FW_LOGV("[%s] Start !\n", __func__);
+ int ret = 0;
+
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler != 0) {
+
+ /* remove agentDB handler to agentDBHandleMgr */
+ ret = remove_agentHandler(DACI_GET_THREAD_ID);
+ if (ret != DACI_SUCCESS)
+ return ret;
+
+ FW_LOGV("agent_db_agent_close_success");
+ }
+
+ FW_LOGV("[%s] End !\n", __func__);
+ return DACI_SUCCESS;
+}
+
+DACI_RETURN DACI_Create_Agent_Default_Table()
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+
+ return create_AgentDefaultTable(daci_handler);
+}
+
+DACI_RETURN DACI_Begin_Transaction()
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return begin_transaction(daci_handler);
+}
+
+DACI_RETURN DACI_End_Transaction(DACI_TRANSACTION transaction)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return end_transaction(daci_handler, transaction);
+}
+
+int DACI_Add_Account(daci_account *account)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return -1;
+ }
+
+ return add_account(daci_handler, account);
+}
+
+DACI_RETURN DACI_Delete_Account(int accountId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return delete_account(daci_handler, accountId);
+}
+
+DACI_RETURN DACI_Set_Account_Email_Address(int accountId, char *emailAddress, char *accessName)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return set_accountEmailAddress(daci_handler, accountId, emailAddress, accessName);
+}
+
+DACI_RETURN DACI_Set_Account_Password(int accountId, char *password, char *accessName)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return set_accountPassword(daci_handler, accountId, password, accessName);
+}
+
+int *DACI_Get_Account_Account_Id_List(int *count)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_accountAccountIdList(daci_handler, count);
+}
+
+char *DACI_Get_Account_Email_Address(int accountId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_accountEmailAddress(daci_handler, accountId);
+}
+
+char *DACI_Get_Account_Password(int accountId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_accountPassword(daci_handler, accountId);
+}
+
+int DACI_IsExist_Account(int accountId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return isExist_account(daci_handler, accountId);
+}
+
+char *DACI_Get_Access_Name(int accountId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_accessName(daci_handler, accountId);
+}
+
+int *DACI_Get_Account_Id_List_By_Access_Name(char *access_name, int *accountId_count)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_accountIdListByAccessName(daci_handler, access_name, accountId_count);
+}
+
+DACI_RETURN DACI_Add_Folder(daci_folder *folder, int count)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return add_folder(daci_handler, folder, count);
+}
+
+DACI_RETURN DACI_Delete_Folder_By_Folder_Id(char *folderId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return delete_folderByFolderId(daci_handler, folderId);
+}
+
+char *DACI_Get_Folder_Folder_Id_By_Service_Id(int accountId, int itemTypeId, char *serviceId, int folderTypeId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_folderFolderIdByServiceId(daci_handler, accountId, itemTypeId, serviceId, folderTypeId);
+}
+
+daci_id_list *DACI_Get_Folder_Folder_Id_By_Folder_Type_Id(int accountId, int itemTypeId, int folderTypeId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_folderFolderIdByFolderTypeId(daci_handler, accountId, itemTypeId, folderTypeId);
+}
+
+char *DACI_Get_Folder_Service_Id(char *folderId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_folderServiceId(daci_handler, folderId);
+}
+
+daci_id_list *DACI_Get_Folder_Folder_Id_List_By_Item_Type_Id(int account_id, int itemTypeId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_folderFolderIdListByItemTypeId(daci_handler, account_id, itemTypeId);
+}
+
+daci_folder *DACI_Get_Folder_Mapping_Service_Id(int accountId, char *folderId, int *count)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_folderMappingServiceId(daci_handler, accountId, folderId, count);
+}
+
+DACI_RETURN DACI_Add_Item(daci_item *item, int count)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return add_item(daci_handler, item, count);
+}
+
+DACI_RETURN DACI_Delete_Item_By_Item_Id(char *itemId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return delete_itemByItemId(daci_handler, itemId);
+}
+
+DACI_RETURN DACI_Delete_Item_By_Item_Type_Id(int accountId, int itemTypeId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return delete_itemByItemTypeId(daci_handler, accountId, itemTypeId);
+}
+
+char *DACI_Get_Item_Item_Id(int accountId, char *serviceId, int itemTypeId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_itemItemId(daci_handler, accountId, serviceId, itemTypeId);
+}
+
+char *DACI_Get_Item_Service_Id(char *itemId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_itemServiceId(daci_handler, itemId);
+}
+
+daci_item *DACI_Get_Item(char *itemId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_item(daci_handler, itemId);
+}
+
+daci_id_list *DACI_Get_Item_Id_List(char *folderId, DACI_COLUMN_NAME columnName)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_itemIdList(daci_handler, folderId, columnName);
+}
+
+daci_item *DACI_Get_item_By_Account_Id(int accountId, int itemTypeId, int *count)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_itemByAccountId(daci_handler, accountId, itemTypeId, count);
+}
+
+daci_item_info *DACI_Get_Item_Info_By_Item_Type_Id(int accountId, int itemTypeId, int *count)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_itemInfoByItemTypeId(daci_handler, accountId, itemTypeId, count);
+}
+
+daci_item *DACI_Get_item_Mapping_Service_Id(int accountId, char *itemId, int *count)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_itemMappingServiceId(daci_handler, accountId, itemId, count);
+}
+
+daci_id_list *DACI_Get_Item_Id_List_By_Data_Store_Id(int data_store_id)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_itemIdListByDataStoreId(daci_handler, data_store_id);
+}
+
+daci_id_list *DACI_Get_Item_Id_List_By_Data_Store_Id_with_AccountID(int account_id, int data_store_id)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_itemIdListByDataStoreIdwithAccountId(daci_handler, account_id, data_store_id);
+}
+
+daci_id_list *DACI_Get_Item_Id_List_By_Operation_Id(int account_id, int data_store_id, int operation_id)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_ItemIdListByOperationId(daci_handler, account_id, data_store_id, operation_id);
+}
+
+int DACI_IsExist_Item(char *itemId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return isExist_item(daci_handler, itemId);
+}
+
+DACI_RETURN DACI_Add_Config(daci_config *config)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return add_config(daci_handler, config);
+}
+
+DACI_RETURN DACI_Delete_Config_By_Key(int configId, char *key)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return delete_configByKey(daci_handler, configId, key);
+}
+
+daci_config *DACI_Get_Config_By_Config_Id(int configId, int *count)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_configByConfigId(daci_handler, configId, count);
+}
+
+DACI_RETURN DACI_Get_Config_By_Key(daci_config *config)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return get_configByKey(daci_handler, config);
+}
+
+int DACI_IsExist_Config(int configId, char *key)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return isExist_config(daci_handler, configId, key);
+}
+
+DACI_RETURN DACI_Update_Config(daci_config *config, int count)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return update_config(daci_handler, config, count);
+}
+
+DACI_RETURN DACI_Add_Item_Changelog(int accountId, daci_item_changelog *itemChangelog, int count)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return add_itemChangelog(daci_handler, accountId, itemChangelog, count);
+}
+
+DACI_RETURN DACI_Delete_Item_Changelog_By_Item_Id(int accountId, char *itemId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return delete_itemChangelogByItemId(daci_handler, accountId, itemId);
+}
+
+DACI_RETURN DACI_Delete_Item_Changelog_By_Item_Id_List(int accountId, char **itemIdList, int count)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return delete_itemChangelogByItemIdList(daci_handler, accountId, itemIdList, count);
+}
+
+DACI_RETURN DACI_Delete_Item_Changelog_By_Item_Type_Id(int accountId, int itemTypeId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return delete_itemChangelogByItemTypeId(daci_handler, accountId, itemTypeId);
+}
+
+DACI_RETURN DACI_Set_Item_Changelog_Operation_Id(int accountId, daci_item_changelog *itemChangelog)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return set_itemChangelogOperationId(daci_handler, accountId, itemChangelog);
+}
+
+DACI_RETURN DACI_Set_Item_Changelog_Sync_Status(int accountId, daci_item_changelog *itemChangelog)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return set_itemChangelogSyncStatus(daci_handler, accountId, itemChangelog);
+}
+
+DACI_RETURN DACI_Set_Item_Changelog_Wait_Status(int accountId, char **folderIdList, int folderIdCount, int *itemTypeIdList, int itemTypeIdCount)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return set_itemChangelogWaitStatus(daci_handler, accountId, folderIdList, folderIdCount, itemTypeIdList, itemTypeIdCount);
+
+}
+
+DACI_RETURN DACI_Get_Item_Changelog_By_Item_Id(int accountId, daci_item_changelog *itemChangelog)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return get_itemChangelogByItemId(daci_handler, accountId, itemChangelog);
+}
+
+int DACI_IsExist_Item_Changelog(int accountId, char *itemId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return isExist_itemChangelog(daci_handler, accountId, itemId);
+}
+
+DACI_RETURN DACI_Add_Last_Anchor(daci_last_anchor *lastAnchor)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return add_lastAnchor(daci_handler, lastAnchor);
+}
+
+DACI_RETURN DACI_Delete_Last_Anchor_By_Account_Id(int accountId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return delete_lastAnchorByAccountId(daci_handler, accountId);
+}
+
+DACI_RETURN DACI_Delete_Last_Anchor_By_Item_Type_Id(int accountId, int itemTypeId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return delete_lastAnchorByItemTypeId(daci_handler, accountId, itemTypeId);
+}
+
+DACI_RETURN DACI_Set_Last_Anchor(daci_last_anchor *lastAnchor)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return set_lastAnchor(daci_handler, lastAnchor);
+}
+
+daci_last_anchor *DACI_Get_Last_Anchor_By_Account_Id(int accountId, int *count)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_lastAnchorByAccountId(daci_handler, accountId, count);
+}
+
+daci_last_anchor *DACI_Get_Last_Anchor_By_Item_Type_Id(int accountId, int itemTypeId, int *count)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_lastAnchorByItemTypeId(daci_handler, accountId, itemTypeId, count);
+}
+
+int DACI_IsExist_Last_Anchor(int accountId, int itemTypeId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return isExist_lastAnchor(daci_handler, accountId, itemTypeId);
+}
+
+DACI_RETURN DACI_Add_Mapping(daci_mapping *mapping)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return add_mapping(daci_handler, mapping);
+}
+
+DACI_RETURN DACI_Delete_Mapping_By_Account_Id(int accountId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return delete_mappingByAccountId(daci_handler, accountId);
+}
+
+DACI_RETURN DACI_Delete_Mapping_By_Luid(int accountId, char *luid)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return delete_mappingByLuid(daci_handler, accountId, luid);
+}
+
+daci_mapping *DACI_Get_Mapping_By_Account_Id(int accountId, int *count)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_mappingByAccountId(daci_handler, accountId, count);
+}
+
+char *DACI_Get_Mapping_Guid(int accountId, char *luid)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return 0;
+ }
+
+ return get_mappingGuid(daci_handler, accountId, luid);
+}
+
+int DACI_IsExist_Mapping_By_Account_Id(int accountId)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return isExist_mappingByAccountId(daci_handler, accountId);
+}
+
+int DACI_IsExist_Mapping_By_Luid(int accountId, char *luid)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return isExist_mappingByLuid(daci_handler, accountId, luid);
+}
+
+DACI_RETURN DACI_Add_ID_Provider(daci_id_provider *id_provider)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return add_id_provider(daci_handler, id_provider);
+}
+
+DACI_RETURN DACI_Get_ID_Provider(unsigned int id_provider_code, daci_id_provider **id_provider)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return get_id_provider(daci_handler, id_provider_code, id_provider);
+}
+
+DACI_RETURN DACI_Update_ID_Provider(daci_id_provider *id_provider)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return update_id_provider(daci_handler, id_provider);
+}
+
+DACI_RETURN DACI_Add_ID_Page(daci_id_page *id_page, unsigned int page_byte_size)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return add_id_page(daci_handler, id_page, page_byte_size);
+}
+
+DACI_RETURN DACI_Delete_ID_Page(unsigned int id_provider_code, unsigned int page_index)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return delete_id_page(daci_handler, id_provider_code, page_index);
+}
+
+DACI_RETURN DACI_Get_ID_Page(unsigned int id_provider_code, unsigned int page_index, char **page_bit)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return get_id_page(daci_handler, id_provider_code, page_index, page_bit);
+}
+
+DACI_RETURN DACI_Update_ID_Page(daci_id_page *id_page, unsigned int page_byte_size)
+{
+ DACI_HANDLER *daci_handler = get_agentHandler(DACI_GET_THREAD_ID);
+ if (daci_handler == 0) {
+ FW_LOGE("[%s] no handler for key\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ return update_id_page(daci_handler, id_page, page_byte_size);
+}
+
+/*
+ * ==================================
+ * Data connector module internal API
+ * ==================================
+ */
+DACI_RETURN add_agentHandler(unsigned int key, DACI_HANDLER *pHandler)
+{
+ if (pAgentDBHandlerMgr == 0 || pAgentDBHandlerMgr->daci_handlerTable_mutex == 0) {
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ FW_LOGV("[%s] start !\n", __func__);
+ DACI_RETURN ret = DACI_SUCCESS;
+
+ unsigned int *pKey_copy = (unsigned int *)malloc(sizeof(unsigned int));
+ if (pKey_copy == 0)
+ return DACI_ERR_DB_HANDLER_MGR;
+
+ *pKey_copy = key;
+
+ pthread_mutex_lock(pAgentDBHandlerMgr->daci_handlerTable_mutex);
+ if (pAgentDBHandlerMgr->daci_handlerTable == 0) {
+ ret = __alloc_agent_dc_handlerTable();
+ if (ret != DACI_SUCCESS)
+ goto addagentHandler;
+ }
+
+ /* insert to handler */
+ FW_LOGV("[%s] Key = %d, Handler = %p !\n", __func__, key, pHandler);
+ g_hash_table_insert(pAgentDBHandlerMgr->daci_handlerTable, pKey_copy, pHandler);
+
+#ifdef DC_PRINT
+ /* For test log */
+ __print_agentDBHashTableLog();
+#endif
+
+addagentHandler:
+ pthread_mutex_unlock(pAgentDBHandlerMgr->daci_handlerTable_mutex);
+
+ FW_LOGV("[%s] end !\n", __func__);
+ return ret;
+}
+
+DACI_RETURN remove_agentHandler(unsigned int key)
+{
+ FW_LOGV("[%s] start !\n", __func__);
+ if (pAgentDBHandlerMgr == 0 || pAgentDBHandlerMgr->daci_handlerTable_mutex == 0 || pAgentDBHandlerMgr->daci_handlerTable == 0) {
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+
+ /* remove the handler to hash table */
+ pthread_mutex_lock(pAgentDBHandlerMgr->daci_handlerTable_mutex);
+ int isSuccess = g_hash_table_remove(pAgentDBHandlerMgr->daci_handlerTable, &key);
+ pthread_mutex_unlock(pAgentDBHandlerMgr->daci_handlerTable_mutex);
+
+#ifdef DC_PRINT
+ /* for test log */
+ __print_agentDBHashTableLog();
+#endif
+
+ FW_LOGV("[%s] end !\n", __func__);
+ if (isSuccess == true)
+ return DACI_SUCCESS;
+
+ return DACI_ERR_DB_HANDLER_MGR;
+}
+
+DACI_HANDLER *get_agentHandler(unsigned int key)
+{
+ if (pAgentDBHandlerMgr == 0 || pAgentDBHandlerMgr->daci_handlerTable_mutex == 0 || pAgentDBHandlerMgr->daci_handlerTable == 0) {
+ FW_LOGV("[%s] DACI_ERR_DB_HANDLER_MGR !\n", __func__);
+ return 0;
+ }
+
+ /* get the handler to hash table */
+ pthread_mutex_lock(pAgentDBHandlerMgr->daci_handlerTable_mutex);
+ DACI_HANDLER *pHandler = g_hash_table_lookup(pAgentDBHandlerMgr->daci_handlerTable, &key);
+ pthread_mutex_unlock(pAgentDBHandlerMgr->daci_handlerTable_mutex);
+
+#ifdef DC_PRINT
+ if (pHandler != 0) {
+ FW_LOGV("[%s] ######### > Value Search Success(key = %d, handler = %p)\n", __func__, key, pHandler);
+ } else {
+ FW_LOGV("[%s] ######### > Value Search Fail(key = %d, handler = %p)\n", __func__, key, pHandler);
+ }
+#endif
+
+ return pHandler;
+}
+
+/* static function implementation */
+static DACI_RETURN __alloc_agent_dc_handlerTable()
+{
+ if (pAgentDBHandlerMgr != 0) {
+ pAgentDBHandlerMgr->daci_handlerTable = g_hash_table_new_full(g_int_hash, g_int_equal, __destory_agentDBHashTableKey, __destroy_agentDBHashTableValue);
+ if (pAgentDBHandlerMgr->daci_handlerTable == 0) {
+ FW_LOGV("[%s] Not Create agent dc handler hash table \n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ } else {
+ FW_LOGV("[%DACI_ERR_DB_HANDLER_MGRent dc handler hash table \n", __func__);
+ }
+ }
+
+ return DACI_SUCCESS;
+}
+
+static DACI_RETURN __alloc_agent_dc_handlerTable_mutex()
+{
+ if (pAgentDBHandlerMgr != 0) {
+
+ pAgentDBHandlerMgr->daci_handlerTable_mutex = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t));
+ if (pAgentDBHandlerMgr->daci_handlerTable_mutex == 0) {
+ FW_LOGV("[%s] Not Create agent dc handler hash table mutex \n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ } else {
+
+ if (0 != pthread_mutex_init(pAgentDBHandlerMgr->daci_handlerTable_mutex, 0)) {
+ FW_LOGV("[%s] Not init agent dc handler hash table mutex\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ }
+ FW_LOGV("[%s] Init agent dc handler hash table mutex\n", __func__);
+ }
+ }
+
+ return DACI_SUCCESS;
+}
+
+static DACI_RETURN __free_agent_dc_handlerTable()
+{
+ if (pAgentDBHandlerMgr != 0 && pAgentDBHandlerMgr->daci_handlerTable != 0) {
+ g_hash_table_destroy(pAgentDBHandlerMgr->daci_handlerTable);
+ FW_LOGV("[%s] daci_handlerTable free success !\n", __func__);
+ pAgentDBHandlerMgr->daci_handlerTable = 0;;
+ }
+
+ return DACI_SUCCESS;
+}
+
+static DACI_RETURN __free_agent_dc_handlerTable_mutex()
+{
+ if (pAgentDBHandlerMgr != 0 && pAgentDBHandlerMgr->daci_handlerTable_mutex != 0) {
+
+ int ret = pthread_mutex_destroy(pAgentDBHandlerMgr->daci_handlerTable_mutex);
+ if (ret != 0) {
+ FW_LOGV("[%s] daci_handlerTable_mutex free error !\n", __func__);
+ return DACI_ERR_DB_HANDLER_MGR;
+ } else {
+ free(pAgentDBHandlerMgr->daci_handlerTable_mutex);
+ pAgentDBHandlerMgr->daci_handlerTable_mutex = 0;
+ FW_LOGV("[%s] daci_handlerTable_mutex free success !\n", __func__);
+ }
+ }
+
+ return DACI_SUCCESS;
+}
+
+static DACI_RETURN __create_agentDBHandlerMgrInfo()
+{
+ DACI_RETURN ret = DACI_SUCCESS;
+
+ if (pAgentDBHandlerMgr != 0) {
+
+ /* alloc agent db hander hash table */
+ ret = __alloc_agent_dc_handlerTable();
+ if (ret != DACI_SUCCESS)
+ goto allocAgentDBHandlerMgrInfoErr;
+
+ /* alloc agent db hander hash table mutex */
+ ret = __alloc_agent_dc_handlerTable_mutex();
+ if (ret != DACI_SUCCESS)
+ goto allocAgentDBHandlerMgrInfoErr;
+ }
+
+ return DACI_SUCCESS;
+
+allocAgentDBHandlerMgrInfoErr:
+ DACI_Free_AgentDB_Handler_Mgr();
+ return DACI_ERR_DB_HANDLER_MGR;
+}
+
+static void __destroy_agentDBHashTableValue(void *pHandler)
+{
+ FW_LOGV("[%s] start \n", __func__);
+ if (pHandler != 0) {
+ close_Agent((DACI_HANDLER *)pHandler);
+ }
+ FW_LOGV("[%s] end \n", __func__);
+}
+
+static void __destory_agentDBHashTableKey(void *key)
+{
+ FW_LOGV("[%s] start \n", __func__);
+ if (key != 0)
+ free(key);
+ FW_LOGV("[%s] end \n", __func__);
+}
diff --git a/framework/src/DataAdapter/DACI_Agent_Mgr.c b/framework/src/DataAdapter/DACI_Agent_Mgr.c
new file mode 100755
index 0000000..32b1ac4
--- /dev/null
+++ b/framework/src/DataAdapter/DACI_Agent_Mgr.c
@@ -0,0 +1,571 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ * Heeyoung Hwang <heeyoung1008.hwang@samsung.com>
+ */
+
+#include <vconf.h>
+
+#include "Initialization/initialize_parser.h"
+
+#include "Utility/fw_alloc.h"
+#include "Utility/fw_log.h"
+
+#include "PlugIn/PlugIn_DataConnector.h"
+#include "PlugIn/PlugIn_Account.h"
+
+#include "Account/Account_Util.h"
+
+#include "DACI_ChangeLog.h"
+#include "DACI_Luid.h"
+
+#include "DACI_Agent_Handler_Manager.h"
+
+#include "DACI_Agent_Mgr.h"
+
+#define LOG_TAG "AF_DACI"
+
+/*
+ * Key : db/Apps/AgentFramework/[Agent Name]/ServiceChangePoint/[FW AccountID]/[Service_Type]
+ * Value : Change Point (TimeStamp)
+ */
+#define VCONF_KEY_SERIVCE_CHANGEPOINT "db/Apps/AgentFramework/%s/ServiceChangePoint/%d/%d"
+
+static void __set_Serivce_ChangePoint(int fw_account_id, int service_type, int change_point);
+
+static int __get_Serivce_ChangePoint(int fw_account_id, int service_type);
+
+static DACI_RETURN __construct_ChangeLogTbl_From_Service(int fw_account_id, int service_type);
+
+DACI_RETURN construct_ItemTbl_From_Service(int fw_account_id, int service_type)
+{
+ DACI_RETURN err_code = DACI_SUCCESS;
+
+ err_code = __construct_ChangeLogTbl_From_Service(fw_account_id, service_type);
+
+ return err_code;
+}
+
+DACI_RETURN construct_FolderTbl_From_Service(int service_type)
+{
+ int fw_account_cnt = 0;
+ int *fw_account_id_list = DACI_Get_Account_Account_Id_List(&fw_account_cnt);
+
+ if (fw_account_id_list == 0 || fw_account_cnt == 0) {
+ return DACI_SUCCESS;
+ }
+
+ int *service_account_id_list = 0;
+ if (fw_account_cnt != 0) {
+ service_account_id_list = (int *)calloc(fw_account_cnt, sizeof(int));
+ int i = 0;
+ for (; i < fw_account_cnt; i++) {
+ service_account_id_list[i] = getAccountID_Service(service_type, fw_account_id_list[i]);
+ FW_LOGV("service_account_id_list[%d] : %d", i, service_account_id_list[i]);
+ }
+ }
+
+ int service_account_id_cnt = fw_account_cnt;
+ FW_LOGV("service_account_id_cnt : %d", service_account_id_cnt);
+
+ int i = 0;
+ for (; i < service_account_id_cnt; i++) {
+ int fw_account_id = getAccountID_FW(service_type, service_account_id_list[i], 0);
+ FW_LOGV("fw_account_id[%d] : %d", i, fw_account_id);
+
+ GET_FOLDER_ID_LIST pFunc_GET_FOLDER_ID_LIST = getFunction_DataConnector_GET_FOLDER_ID_LIST(service_type);
+ int service_folder_cnt = 0;
+ int *service_folder_type_list = 0;
+ char **service_folder_list = pFunc_GET_FOLDER_ID_LIST(service_account_id_list[i], &service_folder_cnt, &service_folder_type_list);
+ FW_LOGV("service_folder_cnt : %d", service_folder_cnt);
+
+/*
+ //Hard Coding - If account has one folder, consider folder' state complete.
+
+ t_daci_id_list_t *foder_id_list_info = T_DACI_Get_Folder_Folder_Id_List_By_Account_Id(fw_account_id);
+
+ if (foder_id_list_info != 0) {
+ if (foder_id_list_info->count > 0) {
+ FW_LOGV("foder_id_list_info->count : %d", foder_id_list_info->count);
+ return DACI_SUCCESS;
+ }
+ }*/
+
+ int i = 0;
+ for (; i < service_folder_cnt; i++) {
+
+ /* checking whether the service_id exist in Folder table */
+ char *temp_folder_id = DACI_Get_Folder_Folder_Id_By_Service_Id(fw_account_id, service_type, service_folder_list[i], service_folder_type_list[i]);
+
+ FW_LOGV("fw_account_id : %d", fw_account_id);
+ FW_LOGV("service_folder_list[i] : %s", service_folder_list[i]);
+ FW_LOGV("service_folder_type_list[i] : %d", service_folder_type_list[i]);
+ FW_LOGV("temp_folder_id : %s", temp_folder_id);
+ if (temp_folder_id != 0) {
+ free(temp_folder_id);
+ } else {
+ /* Add Agent Folder table */
+ daci_folder folder;
+ folder.account_id = fw_account_id;
+ folder.folder_id = DACI_Generate_Folder_Luid();
+ folder.parent_folder_id = "0";
+ folder.data_store_id = service_type;
+ folder.folder_type_id = service_folder_type_list[i];
+ folder.service_id = service_folder_list[i];
+ folder.access_name = "DACI";
+
+ DACI_Add_Folder(&folder, 1);
+ }
+ }
+ }
+
+ if (fw_account_id_list != 0) {
+ free(fw_account_id_list);
+ }
+
+ return DACI_SUCCESS;
+}
+
+DACI_RETURN refresh_Item_Tbl_From_Service(int fw_account_id, int service_type)
+{
+ /*
+ * todo Delete folder table
+ */
+
+ /*
+ * Delete Changelog table
+ */
+ DACI_Delete_Item_Changelog_By_Item_Type_Id(fw_account_id, service_type);
+
+ /*
+ * Delete item table
+ */
+ DACI_Delete_Item_By_Item_Type_Id(fw_account_id, service_type);
+
+ /*
+ * todo Insert folder table
+ */
+
+ /*
+ * insert item table
+ */
+ GET_CHANED_ITEM_FOR_FOLDER_ADD pFunc_GET_CHANED_ITEM_FOR_FOLDER_ADD = getFunction_DataConnector_GET_CHANED_ITEM_FOR_FOLDER_ADD(service_type);
+ GET_CHANED_ITEM_FOR_FOLDER_UPDATE pFunc_GET_CHANED_ITEM_FOR_FOLDER_UPDATE = getFunction_DataConnector_GET_CHANED_ITEM_FOR_FOLDER_UPDATE(service_type);
+
+ int service_account_id = getAccountID_Service(service_type, fw_account_id);
+ FW_LOGV("service_account_id : %d", service_account_id);
+
+ daci_id_list *fw_folder_id_list_info = DACI_Get_Folder_Folder_Id_List_By_Item_Type_Id(fw_account_id, service_type);
+
+ char **fw_folder_id_list = 0;
+ int fw_folder_id_cnt = 0;
+ if (fw_folder_id_list_info != 0) {
+ fw_folder_id_list = fw_folder_id_list_info->id;
+ fw_folder_id_cnt = fw_folder_id_list_info->count;
+
+ FW_LOGV("fw_folder_id_cnt : %d", fw_folder_id_cnt);
+ FW_LOGV("fw_folder_id_list[0] : %s", fw_folder_id_list_info->id[0]);
+ FW_LOGV("fw_folder_id_list[0] : %s", fw_folder_id_list[0]);
+ }
+
+ int i = 0;
+ for (; i < fw_folder_id_cnt; i++) {
+ FW_LOGV("fw_folder_id_list[%d] : %s", i, fw_folder_id_list[i]);
+
+ char *service_folder_id = DACI_Get_Folder_Service_Id(fw_folder_id_list[i]);
+
+ FW_LOGV("service_folder_id : %s", service_folder_id);
+
+ int added_item_cnt = 0;
+ Item_Node *added_service_item_id_list = pFunc_GET_CHANED_ITEM_FOR_FOLDER_ADD(service_account_id, service_folder_id, 0, &added_item_cnt);
+ Item_Node *cursor_ptr = added_service_item_id_list;
+
+ FW_LOGV("added_item_cnt : %d", added_item_cnt);
+
+ /*
+ * Process Add Item
+ */
+ DACI_Begin_Transaction();
+ char **fw_item_id_list = DACI_Generate_Item_Luid(1, added_item_cnt);
+ if (fw_item_id_list != 0) {
+ int y = 0;
+ for (; y < added_item_cnt; y++) {
+ daci_item item;
+ item.account_id = fw_account_id;
+ item.item_id = fw_item_id_list[y];
+ item.folder_id = fw_folder_id_list[i];
+ item.data_store_id = service_type;
+ item.service_id = cursor_ptr->item_id;
+ item.access_name = "DACI";
+
+ DACI_RETURN ret = DACI_Add_Item(&item, 1);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("add item failed return : %d", ret);
+ }
+
+ Item_Node *temp = cursor_ptr;
+ cursor_ptr = cursor_ptr->next;
+ free(temp->item_id);
+ free(temp);
+
+ if (fw_item_id_list[y] != 0) {
+ free(fw_item_id_list[y]);
+ }
+ }
+ free(fw_item_id_list);
+ }
+ DACI_End_Transaction(TRANSACTION_COMMIT);
+
+ /*
+ * Process Update Item
+ */
+ int updated_item_cnt = 0;
+ Item_Node *updated_service_item_id_list = pFunc_GET_CHANED_ITEM_FOR_FOLDER_UPDATE(service_account_id, service_folder_id, 0, &updated_item_cnt);
+ cursor_ptr = updated_service_item_id_list;
+
+ FW_LOGV("updated_item_cnt : %d", updated_item_cnt);
+
+ DACI_Begin_Transaction();
+ fw_item_id_list = DACI_Generate_Item_Luid(1, updated_item_cnt);
+ if (fw_item_id_list != 0) {
+ int y = 0;
+ for (; y < updated_item_cnt; y++) {
+ daci_item item;
+ item.account_id = fw_account_id;
+ item.item_id = fw_item_id_list[y];
+ item.folder_id = fw_folder_id_list[i];
+ item.data_store_id = service_type;
+ item.service_id = cursor_ptr->item_id;
+ item.access_name = "DACI";
+
+ DACI_RETURN ret = DACI_Add_Item(&item, 1);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("add item failed return : %d", ret);
+ }
+
+ Item_Node *temp = cursor_ptr;
+ cursor_ptr = cursor_ptr->next;
+ free(temp->item_id);
+ free(temp);
+
+ if (fw_item_id_list[y] != 0) {
+ free(fw_item_id_list[y]);
+ }
+ }
+ free(fw_item_id_list);
+ }
+ DACI_End_Transaction(TRANSACTION_COMMIT);
+
+ if (fw_folder_id_list[i] != 0) {
+ free(fw_folder_id_list[i]);
+ }
+
+ if (service_folder_id != 0) {
+ free(service_folder_id);
+ }
+ }
+
+ if (fw_folder_id_list_info != 0) {
+ if (fw_folder_id_list_info->id != 0) {
+ free(fw_folder_id_list_info->id);
+ }
+ free(fw_folder_id_list_info);
+ }
+
+ return DACI_SUCCESS;
+}
+
+DACI_RETURN refresh_ChangeLog_Tbl_From_Service(int fw_account_id, int service_type)
+{
+ DACI_RETURN ret = DACI_SUCCESS;
+
+ /*
+ * Delete Changelog table
+ */
+ ret = DACI_Delete_Item_Changelog_By_Item_Type_Id(fw_account_id, service_type);
+
+ /*
+ * Delete item table
+ */
+ ret = DACI_Delete_Item_By_Item_Type_Id(fw_account_id, service_type);
+
+ /*
+ * Construct Item & changelog table
+ */
+ GET_CHANED_ITEM_FOR_FOLDER_ADD pFunc_GET_CHANED_ITEM_FOR_FOLDER_ADD = getFunction_DataConnector_GET_CHANED_ITEM_FOR_FOLDER_ADD(service_type);
+
+ int service_account_id = getAccountID_Service(service_type, fw_account_id);
+ FW_LOGV("service_account_id : %d", service_account_id);
+
+ daci_id_list *fw_folder_id_list_info = DACI_Get_Folder_Folder_Id_List_By_Item_Type_Id(fw_account_id, service_type);
+
+ char **fw_folder_id_list = 0;
+ int fw_folder_id_cnt = 0;
+ if (fw_folder_id_list_info != 0) {
+ fw_folder_id_list = fw_folder_id_list_info->id;
+ fw_folder_id_cnt = fw_folder_id_list_info->count;
+
+ FW_LOGV("[RJW] fw_folder_id_cnt : %d", fw_folder_id_cnt);
+ FW_LOGV("[RJW] fw_folder_id_list[0] : %s", fw_folder_id_list_info->id[0]);
+ FW_LOGV("[RJW] fw_folder_id_list[0] : %s", fw_folder_id_list[0]);
+ }
+
+ int i = 0;
+ for (; i < fw_folder_id_cnt; i++) {
+ FW_LOGV("fw_folder_id_list[%d] : %s", i, fw_folder_id_list[i]);
+
+ char *service_folder_id = DACI_Get_Folder_Service_Id(fw_folder_id_list[i]);
+
+ FW_LOGV("service_folder_id : %s", service_folder_id);
+
+ int item_cnt = 0;
+ Item_Node *service_item_id_list = pFunc_GET_CHANED_ITEM_FOR_FOLDER_ADD(service_account_id, service_folder_id, 0, &item_cnt);
+ Item_Node *cursor_ptr = service_item_id_list;
+
+ FW_LOGV("item_cnt : %d", item_cnt);
+
+ DACI_Begin_Transaction();
+ char **fw_item_id_list = DACI_Generate_Item_Luid(1, item_cnt);
+ if (fw_item_id_list != 0 ) {
+ int k = 0;
+ for (; k < item_cnt; k++) {
+ char *service_item_id = cursor_ptr->item_id;
+ FW_LOGV("service_item_id[%d] : %s", k, service_item_id);
+ FW_LOGV("fw_item_id : %s", fw_item_id_list[k]);
+
+ ChangeLog_Add_Item(fw_account_id, fw_item_id_list[k], cursor_ptr->item_id, service_type, fw_folder_id_list[i]);
+
+ Item_Node *temp = cursor_ptr;
+ cursor_ptr = cursor_ptr->next;
+ free(temp->item_id);
+ free(temp);
+ if (fw_item_id_list[k] != 0) {
+ free(fw_item_id_list[k]);
+ }
+ }
+ free(fw_item_id_list);
+ }
+ DACI_End_Transaction(TRANSACTION_COMMIT);
+ }
+
+ return ret;
+}
+
+DACI_RETURN set_ChangePoint_Service(int fw_account_id, int service_type)
+{
+ GET_LAST_CHANGEPOINT pFunc_GET_LAST_CHANGEPOINT = getFunction_DataConnector_GET_LAST_CHANGEPOINT(service_type);
+
+ int new_last_change_point = pFunc_GET_LAST_CHANGEPOINT();
+
+ FW_LOGV("new_last_change_point : %d", new_last_change_point);
+
+ __set_Serivce_ChangePoint(fw_account_id, service_type, new_last_change_point);
+
+ return DACI_SUCCESS;
+}
+
+/********************************************* static function ****************************/
+
+static void __set_Serivce_ChangePoint(int fw_account_id, int service_type, int change_point)
+{
+ const char *agent_key = get_AgentKey();
+
+ char vConfKey[100];
+ sprintf(vConfKey, VCONF_KEY_SERIVCE_CHANGEPOINT, agent_key, fw_account_id, service_type);
+
+ FW_LOGV("vConfKey : %s", vConfKey);
+
+ if (vconf_set_int(vConfKey, change_point)) {
+ FW_LOGE("vconf_set_id FAIL");
+ } else {
+ FW_LOGV("Sucess Vconf Set Id");
+ }
+}
+
+static int __get_Serivce_ChangePoint(int fw_account_id, int service_type)
+{
+ const char *agent_key = get_AgentKey();
+
+ char vConfKey[100];
+ sprintf(vConfKey, VCONF_KEY_SERIVCE_CHANGEPOINT, agent_key, fw_account_id, service_type);
+
+ int change_point = 0;
+ if (vconf_get_int(vConfKey, &change_point)) {
+ FW_LOGV("vconf_set_id FAIL - First attempt??");
+ return 0;
+ }
+
+ return change_point;
+}
+
+DACI_RETURN __construct_ChangeLogTbl_From_Service(int fw_account_id, int service_type)
+{
+ int service_account_id = getAccountID_Service(service_type, fw_account_id);
+ FW_LOGV("service_account_id : %d", service_account_id);
+
+ int changed_flag = 0;
+ int fw_change_point = __get_Serivce_ChangePoint(fw_account_id, service_type);
+ FW_LOGV("fw_last_change_point : %d", fw_change_point);
+
+ GET_CHANED_ITEM_FOR_FOLDER_ADD pFunc_GET_CHANED_ITEM_FOR_FOLDER_ADD = getFunction_DataConnector_GET_CHANED_ITEM_FOR_FOLDER_ADD(service_type);
+ GET_CHANED_ITEM_FOR_FOLDER_DEL pFunc_GET_CHANED_ITEM_FOR_FOLDER_DEL = getFunction_DataConnector_GET_CHANED_ITEM_FOR_FOLDER_DEL(service_type);
+ GET_CHANED_ITEM_FOR_FOLDER_UPDATE pFunc_GET_CHANED_ITEM_FOR_FOLDER_UPDATE = getFunction_DataConnector_GET_CHANED_ITEM_FOR_FOLDER_UPDATE(service_type);
+
+ /*
+ * todo Get fw_folder_id list in the service
+ */
+ daci_id_list *fw_folder_id_list_info = DACI_Get_Folder_Folder_Id_List_By_Item_Type_Id(fw_account_id, service_type);
+
+ char **fw_folder_id_list = 0;
+ int fw_folder_id_cnt = 0;
+ if (fw_folder_id_list_info != 0) {
+ fw_folder_id_list = fw_folder_id_list_info->id;
+ fw_folder_id_cnt = fw_folder_id_list_info->count;
+
+ FW_LOGV("fw_folder_id_cnt : %d", fw_folder_id_cnt);
+ FW_LOGV("fw_folder_id_list[0] : %s", fw_folder_id_list_info->id[0]);
+ FW_LOGV("fw_folder_id_list[0] : %s", fw_folder_id_list[0]);
+ }
+
+ int i = 0;
+ for (; i < fw_folder_id_cnt; i++) {
+ FW_LOGV("fw_folder_id_list[%d] : %s", i, fw_folder_id_list[i]);
+
+ char *service_folder_id = DACI_Get_Folder_Service_Id(fw_folder_id_list[i]);
+ FW_LOGV("service_folder_id : %s", service_folder_id);
+
+ /*
+ * 1. Process Add Item
+ */
+ int added_item_cnt = 0;
+ Item_Node *added_service_item_id_list = pFunc_GET_CHANED_ITEM_FOR_FOLDER_ADD(service_account_id, service_folder_id, fw_change_point, &added_item_cnt);
+ Item_Node *cursor_ptr = added_service_item_id_list;
+
+ FW_LOGV("added_item_cnt : %d", added_item_cnt);
+ if (added_item_cnt > 0) {
+ changed_flag = 1;
+ }
+
+ char **fw_item_id_list = DACI_Generate_Item_Luid(1, added_item_cnt);
+ int y = 0;
+ for (; y < added_item_cnt; y++) {
+ ChangeLog_Add_Item(fw_account_id, fw_item_id_list[y], cursor_ptr->item_id, service_type, fw_folder_id_list[i]);
+ Item_Node *temp = cursor_ptr;
+ cursor_ptr = cursor_ptr->next;
+ free(temp->item_id);
+ free(temp);
+ free(fw_item_id_list[y]);
+ }
+
+ if (fw_item_id_list != 0) {
+ free(fw_item_id_list);
+ }
+
+ /*
+ * 2. Process Delete Item
+ */
+ int deleted_item_cnt = 0;
+ Item_Node *deleted_service_item_id_list = pFunc_GET_CHANED_ITEM_FOR_FOLDER_DEL(service_account_id, service_folder_id, fw_change_point, &deleted_item_cnt);
+ cursor_ptr = deleted_service_item_id_list;
+
+ FW_LOGV("deleted_item_cnt : %d", deleted_item_cnt);
+ if (deleted_item_cnt > 0) {
+ changed_flag = 1;
+ }
+
+ y = 0;
+ for (; y < deleted_item_cnt; y++) {
+ char *fw_item_id = DACI_Get_Item_Item_Id(fw_account_id, cursor_ptr->item_id, service_type);
+ Item_Node *temp = cursor_ptr;
+ cursor_ptr = cursor_ptr->next;
+ free(temp->item_id);
+ free(temp);
+
+ ChangeLog_Delete_Item(fw_account_id, fw_item_id, service_type);
+
+ free(fw_item_id);
+ }
+
+ /*
+ * 3. Process Update Item
+ */
+ int updated_item_cnt = 0;
+ Item_Node *updated_service_item_id_list = pFunc_GET_CHANED_ITEM_FOR_FOLDER_UPDATE(service_account_id, service_folder_id, fw_change_point, &updated_item_cnt);
+ cursor_ptr = updated_service_item_id_list;
+
+ FW_LOGV("updated_item_cnt : %d", updated_item_cnt);
+ if (updated_item_cnt > 0) {
+ changed_flag = 1;
+ }
+
+ fw_item_id_list = DACI_Generate_Item_Luid(1, updated_item_cnt);
+ y = 0;
+ for (; fw_item_id_list != 0 || y < updated_item_cnt; y++) {
+ char *fw_item_id = DACI_Get_Item_Item_Id(fw_account_id, cursor_ptr->item_id, service_type);
+
+ if (fw_item_id == 0) {
+ ChangeLog_Add_Item(fw_account_id, fw_item_id_list[y], cursor_ptr->item_id, service_type, fw_folder_id_list[i]);
+ } else {
+ ChangeLog_Update_Item(fw_account_id, fw_item_id, service_type);
+ }
+
+ Item_Node *temp = cursor_ptr;
+ cursor_ptr = cursor_ptr->next;
+ free(temp->item_id);
+ free(temp);
+
+ if (fw_item_id_list[y] != 0) {
+ free(fw_item_id_list[y]);
+ }
+
+ if (fw_item_id != 0) {
+ free(fw_item_id);
+ }
+ }
+
+ if (fw_folder_id_list[i] != NULL)
+ free(fw_folder_id_list[i]);
+
+ if (service_folder_id != NULL)
+ free(service_folder_id);
+ }
+
+ if (fw_folder_id_list_info != 0) {
+ if (fw_folder_id_list_info->id != 0) {
+ free(fw_folder_id_list_info->id);
+ }
+ free(fw_folder_id_list_info);
+ }
+
+ return DACI_SUCCESS;
+}
diff --git a/framework/src/DataAdapter/DACI_ChangeLog.c b/framework/src/DataAdapter/DACI_ChangeLog.c
new file mode 100755
index 0000000..2ff7a88
--- /dev/null
+++ b/framework/src/DataAdapter/DACI_ChangeLog.c
@@ -0,0 +1,641 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#include <glib.h>
+#include <pthread.h>
+
+#include "Utility/fw_log.h"
+#include "Utility/fw_alloc.h"
+
+#include "Account/Account_Util.h"
+
+#include "DataAdapter/DACI_Agent_Handler_Manager.h"
+#include "DataAdapter/DACI_Common.h"
+#include "DataAdapter/DACI_Luid.h"
+
+#include "DataAdapter/DACI_ChangeLog.h"
+
+#define LOG_TAG "AF_DACI"
+
+static pthread_mutex_t change_lock;
+
+int handle_ADD_ITEM(int service_accountID, int index, char *service_itemID, int itemType, char *service_folderID, int folderType)
+{
+ /*
+ * TODO : 1. Need to Null check parameter
+ * 2. converting type : itemType, folderType
+ * 3. get fw id : accountID, folderID
+ * 4. check whether the item is included
+ * 5. generate item luid
+ * 6. add item & change log
+ */
+ if (pthread_mutex_lock(&change_lock)) {
+ FW_LOGV("pthread_mutex_lock error\n");
+ return 0;
+ }
+
+ FW_LOGV("Index : %d", index);
+ FW_LOGV("service_accountID : %d", service_accountID);
+ FW_LOGV("service_itemID : %s", service_itemID);
+ FW_LOGV("itemType : %d", itemType);
+ FW_LOGV("service_folderID : %s", service_folderID);
+ FW_LOGV("folderType : %d", folderType);
+
+ DACI_RETURN ret = DACI_ERRORS;
+ DACI_RETURN open_ret = DACI_SUCCESS;
+ char *fw_folder_id = 0;
+ char *fw_item_id = 0;
+ char **fw_item_id_list = 0;
+ daci_item item;
+ daci_item_changelog item_changelog;
+
+ open_ret = DACI_Open_Agent();
+ FW_LOGV("Done Open Agent DB : %d", open_ret);
+
+ /*
+ * if folderID value is NULL ==> folderID set NULL
+ */
+ if ((service_folderID != 0) && !strcmp(service_folderID, ""))
+ service_folderID = 0;
+
+ /*
+ * get fw account id
+ */
+ int fw_account_id = getAccountID_FW(itemType, service_accountID, index);
+ FW_LOGV("fw_account_id : %d", fw_account_id);
+
+ if (fw_account_id == -1) {
+ FW_LOGE("fw account id does not exist");
+ goto DACI_FINISH;
+ }
+
+ /*
+ * get fw folder id
+ */
+ fw_folder_id = DACI_Get_Folder_Folder_Id_By_Service_Id(fw_account_id, itemType, service_folderID, folderType);
+ if (fw_folder_id == 0) {
+ FW_LOGE("fw folder id does not exist");
+ goto DACI_FINISH;
+ }
+
+ /*
+ * check whether the item is included
+ */
+ fw_item_id = DACI_Get_Item_Item_Id(fw_account_id, service_itemID, itemType);
+ if (fw_item_id != 0) {
+ FW_LOGE("fw item already exists : %s", fw_item_id);
+ goto DACI_FINISH;
+ }
+
+ /*
+ * generate item luid
+ */
+ fw_item_id_list = DACI_Generate_Item_Luid(1, 1);
+ if (fw_item_id_list == 0) {
+ FW_LOGE("Failed to Generate Item LUID");
+ goto DACI_FINISH;
+ }
+
+ fw_item_id = fw_item_id_list[0];
+ if (fw_item_id == 0) {
+ FW_LOGE("Failed to Generate Item LUID");
+ goto DACI_FINISH;
+ }
+
+ /*
+ * add item
+ */
+ item.account_id = fw_account_id;
+ item.item_id = fw_item_id;
+ item.folder_id = fw_folder_id;
+ item.data_store_id = itemType;
+ item.service_id = service_itemID;
+ item.access_name = "DACI_ChangeLog";
+
+ ret = DACI_Add_Item(&item, 1);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("Failed to Add Item : %d", ret);
+ goto DACI_FINISH;
+ }
+
+ /*
+ * add change log
+ */
+ item_changelog.item_id = fw_item_id;
+ item_changelog.operation_id = 301;
+ item_changelog.status = "SYNC_REQUIRED";
+ item_changelog.access_name = "DACI_ChangeLog";
+
+ ret = DACI_Add_Item_Changelog(fw_account_id, &item_changelog, 1);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("Failed to Add Item changelog : %d", ret);
+ goto DACI_FINISH;
+ }
+
+DACI_FINISH:
+ open_ret = DACI_Close_Agent();
+ FW_LOGV("Done Close Agent DB : %d", open_ret);
+
+ if (fw_folder_id != 0) {
+ free(fw_folder_id);
+ fw_folder_id = 0;
+ }
+ if (fw_item_id != 0) {
+ free(fw_item_id);
+ fw_item_id = 0;
+ }
+ if (fw_item_id_list != 0) {
+ free(fw_item_id_list);
+ fw_item_id_list = 0;
+ }
+ if (pthread_mutex_unlock(&change_lock)) {
+ FW_LOGE("pthread_mutex_unlock error\n");
+ return 0;
+ }
+
+ return ret;
+}
+
+int handle_DEL_ITEM(int service_accountID, int index, char *service_itemID, int itemType)
+{
+ /*
+ * TODO : 1. Need to Null check parameter
+ * 2. converting type : itemType
+ * 3. get fw id : accountID
+ * 4. check whether the item is included
+ * 5. check whether the change log is included
+ * 6. add/update/delete item change log
+ */
+ FW_LOGV("service_accountID : %d", service_accountID);
+ FW_LOGV("index : %d", index);
+ FW_LOGV("service_itemID : %s", service_itemID);
+ FW_LOGV("itemType : %d", itemType);
+
+ DACI_RETURN ret = DACI_ERRORS;
+ DACI_RETURN open_ret = DACI_SUCCESS;
+
+ char *fw_item_id = 0;
+ daci_item_changelog item_changelog;
+ item_changelog.status = 0;
+ item_changelog.access_name = 0;
+
+ open_ret = DACI_Open_Agent();
+ FW_LOGI("Done Open Agent DB : %d", open_ret);
+
+ /*
+ * get fw account id
+ */
+ int fw_account_id = getAccountID_FW(itemType, service_accountID, index);
+ if (fw_account_id == -1) {
+ FW_LOGE("fw account id does not exist");
+ goto DACI_FINISH;
+ }
+
+ /*
+ * check whether the item is included
+ */
+ fw_item_id = DACI_Get_Item_Item_Id(fw_account_id, service_itemID, itemType);
+ if (fw_item_id != 0) {
+ FW_LOGI("Item Already Exists : %s", fw_item_id);
+ } else {
+ FW_LOGE("Item is not existed!!");
+ goto DACI_FINISH;
+ }
+
+ /* check whether the change log is included */
+ if (DACI_IsExist_Item_Changelog(fw_account_id, fw_item_id)) {
+ item_changelog.item_id = fw_item_id;
+ DACI_Get_Item_Changelog_By_Item_Id(fw_account_id, &item_changelog);
+
+ switch (item_changelog.operation_id) {
+ case 301: /* ADD */
+ {
+ FW_LOGI("Item Changelog Already Exists : ADD Operation");
+ ret = DACI_Delete_Item_By_Item_Id(fw_item_id);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("Failed to Delete Item : %d", ret);
+ goto DACI_FINISH;
+ }
+
+ ret = DACI_Delete_Item_Changelog_By_Item_Id(fw_account_id, fw_item_id);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("Failed to Delete Item Change Log : %d", ret);
+ goto DACI_FINISH;
+ }
+ }
+ break;
+ case 302: /* UPDATE */
+ {
+ FW_LOGI("Item Changelog Already Exists : UPDATE Operation");
+ item_changelog.operation_id = 303;
+ ret = DACI_Set_Item_Changelog_Operation_Id(fw_account_id, &item_changelog);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("Failed to Delete Item : %d", ret);
+ goto DACI_FINISH;
+ }
+ }
+ break;
+ case 303: /* DELETE */
+ {
+ FW_LOGI("Item Changelog Already Exists : DELETE Operation");
+ }
+ break;
+ }
+
+ } else {
+ /*
+ * add change log
+ */
+ item_changelog.item_id = fw_item_id;
+ item_changelog.operation_id = 303;
+ item_changelog.status = strdup("SYNC_REQUIRED");
+ item_changelog.access_name = strdup("DACI_ChangeLog");
+
+ ret = DACI_Add_Item_Changelog(fw_account_id, &item_changelog, 1);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("Failed to Add Item Change Log : %d", ret);
+ goto DACI_FINISH;
+ }
+ }
+
+DACI_FINISH:
+ open_ret = DACI_Close_Agent();
+ FW_LOGI("Done Close Agent DB : %d", open_ret);
+
+ if (fw_item_id != 0) {
+ free(fw_item_id);
+ fw_item_id = 0;
+ }
+ if (item_changelog.status != 0) {
+ free(item_changelog.status);
+ item_changelog.status = 0;
+ }
+ if (item_changelog.access_name != 0) {
+ free(item_changelog.access_name);
+ item_changelog.access_name = 0;
+ }
+
+ return ret;
+}
+
+int handle_UPDATE_ITEM(int service_accountID, int index, char *service_itemID, int itemType)
+{
+ /*
+ * TODO : 1. Need to Null check parameter
+ * 2. converting type : itemType
+ * 3. get fw id : accountID
+ * 4. check whether the item is included
+ * 5. check whether the change log is included
+ * 6. add item change log
+ */
+
+ FW_LOGV("service_accountID : %d", service_accountID);
+ FW_LOGV("service_itemID : %s", service_itemID);
+ FW_LOGV("itemType : %d", itemType);
+
+ DACI_RETURN ret = DACI_ERRORS;
+ DACI_RETURN open_ret = DACI_SUCCESS;
+
+ char *fw_item_id = 0;
+ daci_item_changelog item_changelog;
+ item_changelog.status = 0;
+ item_changelog.access_name = 0;
+
+ open_ret = DACI_Open_Agent();
+ FW_LOGV("Done Open Agent DB : %d", open_ret);
+
+ /*
+ * get fw account id
+ */
+ int fw_account_id = getAccountID_FW(itemType, service_accountID, index);
+ if (fw_account_id == -1) {
+ FW_LOGE("fw account id does not exist");
+ goto DACI_FINISH;
+ }
+
+ /*
+ * check whether the item is included
+ */
+ fw_item_id = DACI_Get_Item_Item_Id(fw_account_id, service_itemID, itemType);
+ if (fw_item_id != 0) {
+ FW_LOGV("Item Already Exists : %s", fw_item_id);
+ } else {
+ FW_LOGE("Item is Not Existed!!");
+ goto DACI_FINISH;
+ }
+
+ /*
+ * check whether the change log is included
+ */
+ if (DACI_IsExist_Item_Changelog(fw_account_id, fw_item_id)) {
+ item_changelog.item_id = fw_item_id;
+ DACI_Get_Item_Changelog_By_Item_Id(fw_account_id, &item_changelog);
+
+ if (item_changelog.operation_id == 303) { /* DELETE */
+ FW_LOGE("Already Deleted Item : %s", fw_item_id);
+ goto DACI_FINISH;
+ }
+ } else {
+ /*
+ * add change log
+ */
+ item_changelog.item_id = fw_item_id;
+ item_changelog.operation_id = 302;
+ item_changelog.status = strdup("SYNC_REQUIRED");
+ item_changelog.access_name = strdup("DACI_ChangeLog");
+
+ ret = DACI_Add_Item_Changelog(fw_account_id, &item_changelog, 1);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("Failed to Add Item Change Log : %d", ret);
+ goto DACI_FINISH;
+ }
+ }
+
+DACI_FINISH:
+ open_ret = DACI_Close_Agent();
+ FW_LOGI("Done Close Agent DB : %d", open_ret);
+
+ if (fw_item_id != 0) {
+ free(fw_item_id);
+ fw_item_id = 0;
+ }
+ if (item_changelog.status != 0) {
+ free(item_changelog.status);
+ item_changelog.status = 0;
+ }
+ if (item_changelog.access_name != 0) {
+ free(item_changelog.access_name);
+ item_changelog.access_name = 0;
+ }
+
+ return ret;
+}
+
+int ChangeLog_Add_Item(int fw_account_id, char *fw_item_id, char *service_item_id, int itemType, char *fw_folder_id)
+{
+ /*
+ * TODO : 1. Need to Null check parameter
+ * 2. converting type : itemType
+ * 3. check whether the item is included
+ * 4. generate item luid
+ * 5. add item & change log
+ */
+ FW_LOGV("fw_account_id : %d", fw_account_id);
+ FW_LOGV("fw_item_id : %s", fw_item_id);
+ FW_LOGV("service_item_id : %s", service_item_id);
+ FW_LOGV("itemType : %d", itemType);
+ FW_LOGV("fw_folder_id : %s", fw_folder_id);
+
+ DACI_RETURN ret = DACI_ERRORS;
+
+ daci_item item;
+ daci_item_changelog item_changelog;
+
+ /*
+ * check whether the item is included
+ */
+ char *item_id = DACI_Get_Item_Item_Id(fw_account_id, service_item_id, itemType);
+ if (item_id != 0) {
+ FW_LOGE("Item already exists : %s", item_id);
+ goto DACI_FINISH;
+ }
+
+ /*
+ * add item
+ */
+ item.account_id = fw_account_id;
+ item.item_id = fw_item_id;
+ item.folder_id = fw_folder_id;
+ item.data_store_id = itemType;
+ item.service_id = service_item_id;
+ item.access_name = "DACI_ChangeLog";
+
+ ret = DACI_Add_Item(&item, 1);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("add item failed return : %d", ret);
+ goto DACI_FINISH;
+ }
+
+ /*
+ * add change log
+ */
+ item_changelog.item_id = fw_item_id;
+ item_changelog.operation_id = 301;
+ item_changelog.status = "SYNC_REQUIRED";
+ item_changelog.access_name = "DACI_ChangeLog";
+
+ ret = DACI_Add_Item_Changelog(fw_account_id, &item_changelog, 1);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("add item changelog failed return : %d", ret);
+ goto DACI_FINISH;
+ }
+
+DACI_FINISH:
+ if (item_id != 0) {
+ free(item_id);
+ }
+
+ return ret;
+}
+
+int ChangeLog_Delete_Item(int fw_account_id, char *fw_item_id, int itemType)
+{
+ /*
+ * TODO : 1. Need to Null check parameter
+ * 2. check whether the item is included
+ * 3. check whether the change log is included
+ * 4. add/update/delete item change log
+ */
+ FW_LOGV("fw_account_id : %d", fw_account_id);
+ FW_LOGV("fw_item_id : %s", fw_item_id);
+ FW_LOGV("itemType : %d", itemType);
+
+ DACI_RETURN ret = DACI_ERRORS;
+
+ daci_item_changelog item_changelog;
+ item_changelog.status = 0;
+ item_changelog.access_name = 0;
+
+ /*
+ * check whether the item is included
+ */
+ ret = DACI_IsExist_Item(fw_item_id);
+ if (ret == 1) {
+ FW_LOGV("Item already exists : %s", fw_item_id);
+ } else {
+ FW_LOGE("Item is not existed!!");
+ goto DACI_FINISH;
+ }
+
+ /*
+ * check whether the change log is included
+ */
+ if (DACI_IsExist_Item_Changelog(fw_account_id, fw_item_id)) {
+ item_changelog.item_id = fw_item_id;
+ DACI_Get_Item_Changelog_By_Item_Id(fw_account_id, &item_changelog);
+
+ switch (item_changelog.operation_id) {
+ case 301: /* ADD */
+ {
+ FW_LOGI("Item changelog already exists : ADD Operation");
+ ret = DACI_Delete_Item_By_Item_Id(fw_item_id);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("Failed to Delete Item : %d", ret);
+ goto DACI_FINISH;
+ }
+
+ ret = DACI_Delete_Item_Changelog_By_Item_Id(fw_account_id, fw_item_id);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("Failed to Delete Item Change Log : %d", ret);
+ goto DACI_FINISH;
+ }
+ }
+ break;
+ case 302: /* UPDATE */
+ {
+ FW_LOGV("Item Changelog Already Exists : UPDATE Operation");
+ item_changelog.operation_id = 303;
+ ret = DACI_Set_Item_Changelog_Operation_Id(fw_account_id, &item_changelog);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("Failed to Set Item ChangeLog Operation : %d", ret);
+ goto DACI_FINISH;
+ }
+ }
+ break;
+ case 303: /* DELETE */
+ {
+ FW_LOGV("Item Changelog Already Exists : DELETE Operation");
+ }
+ break;
+ }
+ } else {
+ /*
+ * add change log
+ */
+ item_changelog.item_id = fw_item_id;
+ item_changelog.operation_id = 303;
+ item_changelog.status = strdup("SYNC_REQUIRED");
+ item_changelog.access_name = strdup("DACI_ChangeLog");
+
+ ret = DACI_Add_Item_Changelog(fw_account_id, &item_changelog, 1);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("[ChangeLog_Delete_Item] add item change log failed return : %d", ret);
+ goto DACI_FINISH;
+ }
+ }
+
+DACI_FINISH:
+ if (item_changelog.status != 0) {
+ free(item_changelog.status);
+ item_changelog.status = 0;
+ }
+ if (item_changelog.access_name != 0) {
+ free(item_changelog.access_name);
+ item_changelog.access_name = 0;
+ }
+
+ return ret;
+}
+
+int ChangeLog_Update_Item(int fw_account_id, char *fw_item_id, int itemType)
+{
+ /*
+ * TODO : 1. Need to Null check parameter
+ * 2. converting type : itemType
+ * 3. check whether the item is included
+ * 4. check whether the change log is included
+ * 5. add item change log
+ */
+
+ FW_LOGV("fw_account_id : %d", fw_account_id);
+ FW_LOGV("fw_item_id : %s", fw_item_id);
+ FW_LOGV("itemType : %d", itemType);
+
+ DACI_RETURN ret = DACI_ERRORS;
+
+ daci_item_changelog item_changelog;
+ item_changelog.status = 0;
+ item_changelog.access_name = 0;
+
+ /*
+ * check whether the item is included
+ */
+ ret = DACI_IsExist_Item(fw_item_id);
+ if (ret == 1) {
+ FW_LOGV("Item already exists : %s", fw_item_id);
+ } else {
+ FW_LOGE("Item is not existed!!");
+ goto DACI_FINISH;
+ }
+
+ /* check whether the change log is included */
+ if (DACI_IsExist_Item_Changelog(fw_account_id, fw_item_id)) {
+ item_changelog.item_id = fw_item_id;
+ DACI_Get_Item_Changelog_By_Item_Id(fw_account_id, &item_changelog);
+
+ if (item_changelog.operation_id == 303) { /* DELETE */
+ FW_LOGE("already deleted item");
+ goto DACI_FINISH;
+ }
+
+ } else {
+ /*
+ * add change log
+ */
+ item_changelog.item_id = fw_item_id;
+ item_changelog.operation_id = 302;
+ item_changelog.status = strdup("SYNC_REQUIRED");
+ item_changelog.access_name = strdup("DACI_ChangeLog");
+
+ ret = DACI_Add_Item_Changelog(fw_account_id, &item_changelog, 1);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("Failed to Add Item Change Log : %d", ret);
+ goto DACI_FINISH;
+ }
+ }
+
+DACI_FINISH:
+ if (item_changelog.status != 0) {
+ free(item_changelog.status);
+ item_changelog.status = 0;
+ }
+ if (item_changelog.access_name != 0) {
+ free(item_changelog.access_name);
+ item_changelog.access_name = 0;
+ }
+
+ return ret;
+}
diff --git a/framework/src/DataAdapter/DACI_Common.c b/framework/src/DataAdapter/DACI_Common.c
new file mode 100755
index 0000000..4ce3222
--- /dev/null
+++ b/framework/src/DataAdapter/DACI_Common.c
@@ -0,0 +1,142 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ * Heeyoung Hwang <heeyoung1008.hwang@samsung.com>
+ */
+
+#include "DataAdapter/DACI_Common.h"
+
+/*
+ * ==========================================================
+ * Structure Memory Free
+ * ==========================================================
+ */
+void DACI_Free_Memory_Account(daci_account *account, int count)
+{
+ int i;
+ for (i = 0; i < count; i++) {
+ DACI_MEMORY_FREE(account[i].email_address);
+ DACI_MEMORY_FREE(account[i].password);
+ DACI_MEMORY_FREE(account[i].accessName);
+ }
+ DACI_MEMORY_FREE(account);
+}
+
+void DACI_Free_Memory_Folder(daci_folder *folder, int count)
+{
+ int i;
+ for (i = 0; i < count; i++) {
+ DACI_MEMORY_FREE(folder[i].folder_id);
+ DACI_MEMORY_FREE(folder[i].parent_folder_id);
+ DACI_MEMORY_FREE(folder[i].service_id);
+ DACI_MEMORY_FREE(folder[i].access_name);
+ }
+ DACI_MEMORY_FREE(folder);
+}
+
+void DACI_Free_Memory_Item(daci_item *item, int count)
+{
+ int i;
+ for (i = 0; i < count; i++) {
+ DACI_MEMORY_FREE(item[i].item_id);
+ DACI_MEMORY_FREE(item[i].folder_id);
+ DACI_MEMORY_FREE(item[i].service_id);
+ DACI_MEMORY_FREE(item[i].access_name);
+ }
+ DACI_MEMORY_FREE(item);
+}
+
+void DACI_Free_Memory_Config(daci_config *config, int count)
+{
+ int i;
+ for (i = 0; i < count; i++) {
+ DACI_MEMORY_FREE(config[i].key);
+ DACI_MEMORY_FREE(config[i].value);
+ DACI_MEMORY_FREE(config[i].type);
+ DACI_MEMORY_FREE(config[i].access_name);
+ }
+ DACI_MEMORY_FREE(config);
+}
+
+void DACI_Free_Memory_Item_Changelog(daci_item_changelog *itemChangelog, int count)
+{
+ int i;
+ for (i = 0; i < count; i++) {
+ DACI_MEMORY_FREE(itemChangelog[i].item_id);
+ DACI_MEMORY_FREE(itemChangelog[i].status);
+ DACI_MEMORY_FREE(itemChangelog[i].access_name);
+ }
+ DACI_MEMORY_FREE(itemChangelog);
+}
+
+void DACI_Free_Memory_Last_Anchor(daci_last_anchor *lastAnchor, int count)
+{
+ int i;
+ for (i = 0; i < count; i++) {
+ DACI_MEMORY_FREE(lastAnchor[i].last_anchor_server);
+ DACI_MEMORY_FREE(lastAnchor[i].last_anchor_client);
+ DACI_MEMORY_FREE(lastAnchor[i].access_name);
+ }
+ DACI_MEMORY_FREE(lastAnchor);
+}
+
+void DACI_Free_Memory_Mapping(daci_mapping *mapping, int count)
+{
+ int i;
+ for (i = 0; i < count; i++) {
+ DACI_MEMORY_FREE(mapping[i].luid);
+ DACI_MEMORY_FREE(mapping[i].guid);
+ DACI_MEMORY_FREE(mapping[i].access_name);
+ }
+ DACI_MEMORY_FREE(mapping);
+}
+
+void DACI_Free_Memory_Item_Info(daci_item_info *itemInfo, int count)
+{
+ int i;
+ for (i = 0; i < count; i++) {
+ DACI_MEMORY_FREE(itemInfo[i].itemId);
+ DACI_MEMORY_FREE(itemInfo[i].serviceId);
+ DACI_MEMORY_FREE(itemInfo[i].syncStatus);
+ }
+ DACI_MEMORY_FREE(itemInfo);
+}
+
+void DACI_Free_Memory_Id_List(daci_id_list *idList)
+{
+ int i;
+ for (i = 0; i < idList->count; i++) {
+ DACI_MEMORY_FREE(idList->id[i]);
+ }
+ DACI_MEMORY_FREE(idList);
+}
diff --git a/framework/src/DataAdapter/DACI_Luid.c b/framework/src/DataAdapter/DACI_Luid.c
new file mode 100755
index 0000000..28f07d1
--- /dev/null
+++ b/framework/src/DataAdapter/DACI_Luid.c
@@ -0,0 +1,131 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ */
+
+#include "DataAdapter/DACI_Agent_Handler_Manager.h"
+
+#include "Utility/fw_log.h"
+#include "fw_sequential_id_provider_internal.h"
+
+#include "DataAdapter/DACI_Luid.h"
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <uuid.h>
+
+#define LOG_TAG "AF_DACI"
+
+/*
+ * temporary - item id gen -> sequence
+ */
+#include <vconf.h>
+
+#define VCONF_KEY_ITEM_SEQUENCE "db/Apps/AgentFramework/ItemSequence/"
+#define VCONF_KEY_FOLDEs_SEQUENCE "db/Apps/AgentFramework/FolderSequence/"
+
+static pthread_mutex_t lockx;
+
+char **DACI_Generate_Item_Luid(int id_provider_code, int count)
+{
+ FW_LOGV("=========== Start ============");
+
+ if (count == 0) {
+ return 0;
+ }
+
+ /*
+ * Start Critical Section
+ */
+ if (pthread_mutex_lock(&lockx)) {
+ FW_LOGE("pthread_mutex_lock error");
+ }
+
+ id_provider_t *id_provider_local = 0;
+ id_provider_local = id_persistent_provider_load(id_provider_code, true);
+
+ char **item_luid_list = (char **)calloc(count, sizeof(char *));
+
+ id_provider_error_t id_error = ID_PROVIDER_OK;
+ id_provider_tracking_mode_on(id_provider_local);
+ int i = 0;
+ unsigned int new_id = 0;
+ for (i = 0; i < count; i++) {
+ id_error = id_provider_provide_id(id_provider_local, &new_id);
+ assert(id_error == ID_PROVIDER_OK);
+ if (id_error != ID_PROVIDER_OK) {
+ printf("provider error : %d\n", id_error);
+ }
+
+ char *item_luid = (char *)calloc(5, sizeof(char));
+ if (item_luid != 0)
+ sprintf(item_luid, "%d", new_id);
+ item_luid_list[i] = item_luid;
+ }
+
+ id_error = id_persistent_provider_update(id_provider_local);
+ id_provider_tracking_mode_off(id_provider_local);
+ id_provider_destroy(id_provider_local);
+
+ /*
+ * End Critical Section
+ */
+ if (pthread_mutex_unlock(&lockx)) {
+ FW_LOGE("pthread_mutex_unlock error");
+ }
+
+ FW_LOGV("=========== End ============");
+
+ return item_luid_list;
+}
+
+char *DACI_Generate_Folder_Luid()
+{
+ char *folder_luid = 0;
+ uuid_t out;
+
+ folder_luid = (char *)calloc(sizeof(char) * 36 + 1, 1);
+ if (folder_luid == 0) {
+ FW_LOGE("[DACI_Generate_Folder_Luid] memory allocation failed");
+ return folder_luid;
+ }
+
+ /* generate random uuid */
+ uuid_generate_random(out);
+
+ /* convert a UUID to string */
+ uuid_unparse(out, folder_luid);
+
+ return folder_luid;
+}
diff --git a/framework/src/DataAdapter/DACI_Service.c b/framework/src/DataAdapter/DACI_Service.c
new file mode 100755
index 0000000..4e6d300
--- /dev/null
+++ b/framework/src/DataAdapter/DACI_Service.c
@@ -0,0 +1,945 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ * Heeyoung Hwang <heeyoung1008.hwang@samsung.com>
+ */
+
+#include "Utility/fw_log.h"
+
+#include "PlugIn/PlugIn_DataConnector.h"
+#include "PlugIn/PlugIn_DataConverter.h"
+
+#include "Account/Account_Util.h"
+
+#include "DataAdapter/DACI_Agent_Handler_Manager.h"
+
+#include "DataAdapter/DACI_Service.h"
+/*
+// JSON ==========================================
+#include <yajl/yajl_tree.h>
+// JSON ==========================================
+*/
+
+#define LOG_TAG "AF_DACI"
+
+/*
+// JSON ==========================================
+
+void freeFeeds(Feeds* resultFeeds)
+{
+ if( resultFeeds->feedItemList->activityList )
+ free( resultFeeds->feedItemList->activityList );
+
+ if( resultFeeds->feedItemList )
+ free( resultFeeds->feedItemList );
+
+ if( resultFeeds )
+ free( resultFeeds );
+}
+
+Feeds* JSON2feedItem(char* resultBuffer)
+{
+ char errbuf[1024];
+ yajl_val root = yajl_tree_parse(resultBuffer, errbuf, sizeof(errbuf));
+
+ if (root)
+ {
+ const char* path1[] = { "feeds", (const char*) 0 };
+ const char* path2[] = { "feedId", (const char*) 0 };
+ const char* path3[] = { "userId", (const char*) 0 };
+ const char* path4[] = { "userName", (const char*) 0 };
+ const char* path5[] = { "userPicUrl", (const char*) 0 };
+ const char* path6[] = { "message", (const char*) 0 };
+ const char* path7[] = { "createTime", (const char*) 0 };
+ const char* path8[] = { "replyCount", (const char*) 0 };
+ const char* path9[] = { "location", (const char*) 0 };
+ const char* path10[] = { "latitude", (const char*) 0 };
+ const char* path11[] = { "longitude", (const char*) 0 };
+ const char* path12[] = { "address", (const char*) 0 };
+ const char* path13[] = { "activityList", (const char*) 0 };
+ const char* path14[] = { "activityId", (const char*) 0 };
+ const char* path15[] = { "title", (const char*) 0 };
+ const char* path16[] = { "type", (const char*) 0 };
+ const char* path17[] = { "category", (const char*) 0 };
+ const char* path18[] = { "packageName", (const char*) 0 };
+ const char* path19[] = { "picUrl", (const char*) 0 };
+ const char* path20[] = { "link", (const char*) 0 };
+ const char* path21[] = { "platform", (const char*) 0 };
+ const char* path22[] = { "platformVersion", (const char*) 0 };
+ const char* path23[] = { "launchTime", (const char*) 0 };
+ const char* path24[] = { "finishTime", (const char*) 0 };
+ const char* path25[] = { "sharedCount", (const char*) 0 };
+
+ yajl_val feeds = yajl_tree_get(root, path1, yajl_t_array);
+ unsigned int FeedItemCnt = feeds->u.array.len;
+
+ Feeds* structFeeds;
+ structFeeds = (Feeds*)calloc(1, sizeof(Feeds));
+ structFeeds->feedItemList = (FeedItem*)calloc(FeedItemCnt, sizeof(FeedItem));
+ structFeeds->feedItemCnt = FeedItemCnt;
+
+ unsigned int i;
+
+ for (i = 0 ; i < FeedItemCnt ; i++ )
+ {
+ yajl_val FeedItem = feeds->u.array.values[i];
+
+ strcpy(structFeeds->feedItemList[i].msgID, YAJL_GET_STRING(yajl_tree_get(FeedItem, path2, yajl_t_string)));
+ strcpy(structFeeds->feedItemList[i].userID, YAJL_GET_STRING(yajl_tree_get(FeedItem, path3, yajl_t_string)));
+ strcpy(structFeeds->feedItemList[i].userName, YAJL_GET_STRING(yajl_tree_get(FeedItem, path4, yajl_t_string)));
+ strcpy(structFeeds->feedItemList[i].userImgUrl, YAJL_GET_STRING(yajl_tree_get(FeedItem, path5, yajl_t_string)));
+ strcpy(structFeeds->feedItemList[i].msg, YAJL_GET_STRING(yajl_tree_get(FeedItem, path6, yajl_t_string)));
+ structFeeds->feedItemList[i].date = (long)YAJL_GET_INTEGER(yajl_tree_get(FeedItem, path7, yajl_t_number));
+ structFeeds->feedItemList[i].commentCount = (long)YAJL_GET_INTEGER(yajl_tree_get(FeedItem, path8, yajl_t_number));
+
+// yajl_val msgID = yajl_tree_get(FeedItem, "feedId", yajl_t_string);
+// yajl_val userID = yajl_tree_get(FeedItem, "userId", yajl_t_string);
+// yajl_val userName = yajl_tree_get(FeedItem, "userName", yajl_t_string);
+// yajl_val userImgUrl = yajl_tree_get(FeedItem, "userPicUrl", yajl_t_string);
+// yajl_val msg = yajl_tree_get(FeedItem, "message", yajl_t_string);
+// yajl_val date = yajl_tree_get(FeedItem, "createTime", yajl_t_number);
+// yajl_val commentCount = yajl_tree_get(FeedItem, "replyCount", yajl_t_number);
+
+ yajl_val location = yajl_tree_get(FeedItem, path9, yajl_t_object);
+ if (location)
+ {
+ structFeeds->feedItemList[i].loc.mLat = (double)YAJL_GET_INTEGER(yajl_tree_get(location, path10, yajl_t_number));
+ structFeeds->feedItemList[i].loc.mLong = (double)YAJL_GET_INTEGER(yajl_tree_get(location, path11, yajl_t_number));
+ strcpy(structFeeds->feedItemList[i].loc.mAddress, YAJL_GET_STRING(yajl_tree_get(location, path12, yajl_t_string)));
+
+// yajl_val mLat = yajl_tree_get(location, "latitude", yajl_t_number);
+// yajl_val mLong = yajl_tree_get(location, "longitude", yajl_t_number);
+// yajl_val mAddress = yajl_tree_get(location, "address", yajl_t_string);
+
+ }
+
+ yajl_val activityList = yajl_tree_get(FeedItem, path13, yajl_t_array);
+ if (activityList)
+ {
+ unsigned int ActivityItemCnt = activityList->u.array.len;
+
+ structFeeds->feedItemList[i].activityList = (ActivityItem*)calloc(ActivityItemCnt, sizeof(ActivityItem));
+
+ unsigned int j;
+
+ for (j = 0 ; j < ActivityItemCnt ; j++ )
+ {
+ yajl_val ActivityItem = activityList->u.array.values[i];
+
+ strcpy(structFeeds->feedItemList[i].activityList[j].mActivityID, YAJL_GET_STRING(yajl_tree_get(ActivityItem, path14, yajl_t_string)));
+ strcpy(structFeeds->feedItemList[i].activityList[j].mName, YAJL_GET_STRING(yajl_tree_get(ActivityItem, path15, yajl_t_string)));
+ strcpy(structFeeds->feedItemList[i].activityList[j].mType, YAJL_GET_STRING(yajl_tree_get(ActivityItem, path16, yajl_t_string)));
+ strcpy(structFeeds->feedItemList[i].activityList[j].mCategory, YAJL_GET_STRING(yajl_tree_get(ActivityItem, path17, yajl_t_string)));
+ strcpy(structFeeds->feedItemList[i].activityList[j].mPname, YAJL_GET_STRING(yajl_tree_get(ActivityItem, path18, yajl_t_string)));
+ strcpy(structFeeds->feedItemList[i].activityList[j].mIconUrl, YAJL_GET_STRING(yajl_tree_get(ActivityItem, path19, yajl_t_string)));
+ strcpy(structFeeds->feedItemList[i].activityList[j].mMarketUrl, YAJL_GET_STRING(yajl_tree_get(ActivityItem, path20, yajl_t_string)));
+ strcpy(structFeeds->feedItemList[i].activityList[j].mPlatform, YAJL_GET_STRING(yajl_tree_get(ActivityItem, path21, yajl_t_string)));
+ strcpy(structFeeds->feedItemList[i].activityList[j].mPlatform, YAJL_GET_STRING(yajl_tree_get(ActivityItem, path22, yajl_t_string)));
+ structFeeds->feedItemList[i].activityList[j].mLaunchTime = (long)YAJL_GET_INTEGER(yajl_tree_get(ActivityItem, path23, yajl_t_number));
+ structFeeds->feedItemList[i].activityList[j].mFinishTime = (long)YAJL_GET_INTEGER(yajl_tree_get(ActivityItem, path24, yajl_t_number));
+ structFeeds->feedItemList[i].activityList[j].mShareCount = (long)YAJL_GET_INTEGER(yajl_tree_get(ActivityItem, path25, yajl_t_number));
+
+// yajl_val mActivityID = yajl_tree_get(ActivityItem, "activityId", yajl_t_string);
+// yajl_val mName = yajl_tree_get(ActivityItem, "title", yajl_t_string);
+// yajl_val mType = yajl_tree_get(ActivityItem, "type", yajl_t_string);
+// yajl_val mCategory = yajl_tree_get(ActivityItem, "category", yajl_t_string);
+// yajl_val mPname = yajl_tree_get(ActivityItem, "packageName", yajl_t_string);
+// yajl_val mIconUrl = yajl_tree_get(ActivityItem, "picUrl", yajl_t_string);
+// yajl_val mMarketUrl = yajl_tree_get(ActivityItem, "link", yajl_t_string);
+// yajl_val mPlatform = yajl_tree_get(ActivityItem, "platform", yajl_t_string);
+// yajl_val mPlatformVersion = yajl_tree_get(ActivityItem, "platformVersion", yajl_t_string);
+// yajl_val mLaunchTime = yajl_tree_get(ActivityItem, "launchTime", yajl_t_number);
+// yajl_val mFinishTime = yajl_tree_get(ActivityItem, "finishTime", yajl_t_number);
+// yajl_val mShareCount = yajl_tree_get(ActivityItem, "sharedCount", yajl_t_number);
+
+ }
+ }
+ }
+
+ yajl_tree_free(root);
+
+ return structFeeds;
+ }
+
+}
+// JSON ==========================================
+*/
+
+DACI_RETURN DACI_Service_Open(int content_type)
+{
+ FW_LOGV("[DACI_Service_Open] start");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ Service_Open pFunc_Service_Open = getFunction_DataConnector_Service_Open(content_type);
+
+ if (pFunc_Service_Open == 0) {
+ FW_LOGI("%d", __LINE__);
+ return DACI_NOT_FOUND_PLUG_IN;
+ }
+
+ ret = pFunc_Service_Open();
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("[DACI_Service_Open] Fail!");
+ } else {
+ FW_LOGV("[DACI_Service_Open] Success!");
+ }
+
+ return ret;
+}
+
+DACI_RETURN DACI_Service_Close(int content_type)
+{
+ FW_LOGV("[DACI_Service_Close] start");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ Service_Close pFunc_Service_Close = getFunction_DataConnector_Service_Close(content_type);
+
+ if (pFunc_Service_Close == 0) {
+ FW_LOGI("%d", __LINE__);
+ return DACI_NOT_FOUND_PLUG_IN;
+ }
+
+ ret = pFunc_Service_Close();
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("[DACI_Service_Close] Fail!");
+ } else {
+ FW_LOGV("[DACI_Service_Close] Success!");
+ }
+
+ return ret;
+}
+
+DACI_RETURN DACI_Service_Begin(int content_type)
+{
+ FW_LOGV("[DACI_Service_Begin] start");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ Begin_Transaction pFunc_Begin_Transaction = getFunction_DataConnector_Begin_Transaction(content_type);
+
+ if (pFunc_Begin_Transaction == 0) {
+ FW_LOGI("%d", __LINE__);
+ return DACI_NOT_FOUND_PLUG_IN;
+ }
+
+ ret = pFunc_Begin_Transaction();
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("[DACI_Service_Begin] Fail!");
+ } else {
+ FW_LOGV("[DACI_Service_Begin] Success!");
+ }
+
+ return ret;
+}
+
+DACI_RETURN DACI_Service_End(int content_type, int is_success)
+{
+ FW_LOGV("[DACI_Service_End] start");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ End_Transaction pFunc_End_Transaction = getFunction_DataConnector_End_Transaction(content_type);
+
+ if (pFunc_End_Transaction == 0) {
+ FW_LOGI("%d", __LINE__);
+ return DACI_NOT_FOUND_PLUG_IN;
+ }
+
+ ret = pFunc_End_Transaction(is_success);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGE("[DACI_Service_End] Fail!");
+ } else {
+ FW_LOGV("[DACI_Service_End] Success!");
+ }
+
+ return ret;
+}
+
+DACI_RETURN DACI_Service_Add_Item(int content_type, int account_id, char *folder_id, const void *data, char **item_id)
+{
+ FW_LOGV("[DACI_Service_Add_Item] start");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int service_account_id = 0;
+ char *service_folder_id = 0;
+ void *service_data = 0;
+ Converter pFunc_Converter;
+ ADD_ITEM pFunc_AddItem;
+
+ /* 1. get service account id */
+ service_account_id = getAccountID_Service(content_type, account_id);
+ FW_LOGV("[DACI_Service_Add_Item] service_acount_id : %d", service_account_id);
+
+ /* 2. get service folder id */
+ service_folder_id = DACI_Get_Folder_Service_Id(folder_id);
+ FW_LOGV("[DACI_Service_Add_Item] service_folder_id : %s", service_folder_id);
+
+ /* 3. call plugIn dataconverter */
+ int converter_plugIn_id = getDataConverter_PlugIn_ID(content_type);
+ pFunc_Converter = getFunction_DataConverter_Converter(converter_plugIn_id);
+ if (pFunc_Converter == 0) {
+ FW_LOGI("%d", __LINE__);
+ ret = DACI_NOT_FOUND_PLUG_IN;
+ goto DACI_FINISH;
+ }
+
+ ret = pFunc_Converter(data, &service_data);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGI("%d", __LINE__);
+ goto DACI_FINISH;
+ }
+
+ /* 4. call plugIn dataconnector */
+ pFunc_AddItem = getFunction_DataConnector_ADD_ITEM(content_type);
+ if (pFunc_AddItem == 0) {
+ FW_LOGI("%d", __LINE__);
+ ret = DACI_NOT_FOUND_PLUG_IN;
+ goto DACI_FINISH;
+ }
+
+ ret = pFunc_AddItem(service_account_id, service_folder_id, service_data, item_id);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGV("[DACI_Service_Add_Item] failed pFunc_AddItem()\n");
+ } else {
+ FW_LOGV("[DACI_Service_Add_Item] success pFunc_AddItem()\n");
+ FW_LOGV("[DACI_Service_Add_Item] added service id : %s", *item_id);
+ }
+
+DACI_FINISH:
+
+ if (ret != DACI_SUCCESS)
+ *item_id = 0;
+
+ /* memory free */
+ if (service_folder_id != 0)
+ free(service_folder_id);
+
+ return ret;
+}
+
+DACI_RETURN DACI_Service_Update_Item(int content_type, int account_id, char *folder_id, char *item_id, const void *data)
+{
+ FW_LOGV("[DACI_Service_Update_Item] start");
+
+ FW_LOGV("[DACI_Service_Update_Item] account_id : %d", account_id);
+ FW_LOGV("[DACI_Service_Update_Item] folder_id : %s", folder_id);
+ FW_LOGV("[DACI_Service_Update_Item] item_id : %s", item_id);
+ FW_LOGV("[DACI_Service_Update_Item] data : %s", (char *)data);
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int service_account_id = 0;
+ char *service_folder_id = 0;
+ char *service_item_id = 0;
+ void *service_data = 0;
+ void *new_service_data = 0;
+ GET_ITEM pFunc_Get_Item;
+ UPDATE_ITEM pFunc_UPDATE_ITEM;
+ Replace_Converter pFunc_Replace_Converter;
+
+ /* 1. get service account id */
+ service_account_id = getAccountID_Service(content_type, account_id);
+ FW_LOGV("[DACI_Service_Update_Item] service_acount_id : %d", service_account_id);
+
+ /* 2. get service folder id */
+ service_folder_id = DACI_Get_Folder_Service_Id(folder_id);
+ FW_LOGV("[DACI_Service_Update_Item] service_folder_id : %s", service_folder_id);
+
+ /* 3. get service item id */
+ service_item_id = DACI_Get_Item_Service_Id(item_id);
+ FW_LOGV("[DACI_Service_Update_Item] service_item_id : %s", service_item_id);
+
+ /* 4. call plugIn dataconnector */
+ pFunc_Get_Item = getFunction_DataConnector_GET_ITEM(content_type);
+ if (pFunc_Get_Item == 0) {
+ FW_LOGI("%d", __LINE__);
+ ret = DACI_NOT_FOUND_PLUG_IN;
+ goto DACI_FINISH;
+ }
+
+ ret = pFunc_Get_Item(service_account_id, service_folder_id, service_item_id, &service_data);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGI("%d", __LINE__);
+ goto DACI_FINISH;
+ }
+
+ /* 5. call plugIn dataconverter */
+ int converter_plugIn_id = getDataConverter_PlugIn_ID(content_type);
+ pFunc_Replace_Converter = getFunction_DataConverter_Replace_Converter(converter_plugIn_id);
+ if (pFunc_Replace_Converter == 0) {
+ FW_LOGI("%d", __LINE__);
+ ret = DACI_NOT_FOUND_PLUG_IN;
+ goto DACI_FINISH;
+ }
+
+ ret = pFunc_Replace_Converter(service_data, data, &new_service_data);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGI("%d", __LINE__);
+ goto DACI_FINISH;
+ }
+
+ /* 6. call plugIn dataconverter */
+ pFunc_UPDATE_ITEM = getFunction_DataConnector_UPDATE_ITEM(content_type);
+ if (pFunc_UPDATE_ITEM == 0) {
+ FW_LOGI("%d", __LINE__);
+ ret = DACI_NOT_FOUND_PLUG_IN;
+ goto DACI_FINISH;
+ }
+
+ ret = pFunc_UPDATE_ITEM(service_account_id, service_folder_id, service_item_id, new_service_data);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGV("[DACI_Service_Update_Item] failed pFunc_UPDATE_ITEM()\n");
+ } else {
+ FW_LOGV("[DACI_Service_Update_Item] success pFunc_UPDATE_ITEM()\n");
+ }
+
+DACI_FINISH:
+
+ /* memory free */
+ if (service_folder_id != 0)
+ free(service_folder_id);
+
+ if (service_item_id != 0)
+ free(service_item_id);
+
+ return ret;
+}
+
+DACI_RETURN DACI_Service_Delete_Item(int content_type, int account_id, char *folder_id, char *item_id)
+{
+ FW_LOGV("[DACI_Service_Delete_Item] start");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int service_account_id = 0;
+ char *service_folder_id = 0;
+ char *service_item_id = 0;
+ DEL_ITEM pFunc_DelItem;
+
+ /* 1. get service account id */
+ service_account_id = getAccountID_Service(content_type, account_id);
+ FW_LOGV("[DACI_Service_Delete_Item] service_acount_id : %d", service_account_id);
+
+ /* 2. get service folder id */
+ service_folder_id = DACI_Get_Folder_Service_Id(folder_id);
+ FW_LOGV("[DACI_Service_Delete_Item] service_folder_id : %s", service_folder_id);
+
+ /* 3. get service item id */
+ service_item_id = DACI_Get_Item_Service_Id(item_id);
+ FW_LOGV("[DACI_Service_Delete_Item] service_item_id : %s", service_item_id);
+
+ /* 4. call plugIn dataconnector */
+ pFunc_DelItem = getFunction_DataConnector_DEL_ITEM(content_type);
+ if (pFunc_DelItem == 0) {
+ FW_LOGI("%d", __LINE__);
+ ret = DACI_NOT_FOUND_PLUG_IN;
+ goto DACI_FINISH;
+ }
+
+ ret = pFunc_DelItem(service_account_id, service_folder_id, service_item_id);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGV("[DACI_Service_Delete_Item] failed pFunc_DelItem()\n");
+ } else {
+ FW_LOGV("[DACI_Service_Delete_Item] success pFunc_DelItem()\n");
+ }
+
+DACI_FINISH:
+
+ /* memory free */
+ if (service_folder_id != 0)
+ free(service_folder_id);
+
+ if (service_item_id != 0)
+ free(service_item_id);
+
+ return ret;
+}
+
+DACI_RETURN DACI_Service_Delete_All_Items(int content_type, int account_id)
+{
+ FW_LOGV("[DACI_Service_Delete_All_Items] start");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int service_account_id = 0;
+/* char **folder_id_list = 0;
+ int folder_id_list_cnt = 0;
+ char *service_item_id =0;*/
+ DEL_ALL_ITEMS pFunc_Del_All_Items;
+
+ /* 1. get service account id */
+ service_account_id = getAccountID_Service(content_type, account_id);
+ FW_LOGV("[DACI_Service_Delete_All_Items] service_acount_id : %d", service_account_id);
+
+/* //2. get folder id list for account id
+ folder_id_list = DACI_Get_Folder_Folder_Id_List_By_Account_Id(account_id, &folder_id_list_cnt);
+ FW_LOGV("[DACI_Service_Delete_All_Items] folder_id_list_cnt : %d", folder_id_list_cnt);
+
+ //3. get service item id
+ service_item_id = DACI_Get_Item_Service_Id(item_id);
+ FW_LOGV("[DACI_Service_Delete_Item] service_item_id : %s", service_item_id);*/
+
+ /* 2. call plugIn dataconnector */
+ pFunc_Del_All_Items = getFunction_DataConnector_DEL_ALL_ITEMS(content_type);
+ if (pFunc_Del_All_Items == 0) {
+ FW_LOGI("%d", __LINE__);
+ return DACI_NOT_FOUND_PLUG_IN;
+ }
+
+ ret = pFunc_Del_All_Items(service_account_id);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGV("[DACI_Service_Delete_All_Items] failed pFunc_Del_All_Items()\n");
+ } else {
+ FW_LOGV("[DACI_Service_Delete_All_Items] success pFunc_Del_All_Items()\n");
+ }
+
+ /* memory free */
+/* if (service_folder_id != 0)
+ free(service_folder_id);
+
+ if (service_item_id != 0)
+ free(service_item_id);*/
+
+ return ret;
+}
+
+DACI_RETURN DACI_Service_Get_Item(int content_type, int account_id, char *folder_id, char *item_id, void **data)
+{
+ FW_LOGV("[DACI_Service_Get_Item] start");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int service_account_id = 0;
+ char *service_folder_id = 0;
+ char *service_item_id = 0;
+ void *service_data = 0;
+ GET_ITEM pFunc_Get_Item;
+ Reverse_Converter pFunc_Reverse_Converter;
+
+ /* 1. get service account id */
+ service_account_id = getAccountID_Service(content_type, account_id);
+ FW_LOGV("[DACI_Service_Get_Item] service_acount_id : %d", service_account_id);
+
+ /* 2. get service folder id */
+ service_folder_id = DACI_Get_Folder_Service_Id(folder_id);
+ FW_LOGV("[DACI_Service_Get_Item] service_folder_id : %s", service_folder_id);
+
+ /* 3. get service item id */
+ service_item_id = DACI_Get_Item_Service_Id(item_id);
+ FW_LOGV("[DACI_Service_Get_Item] service_item_id : %s", service_item_id);
+
+ /* 4. call plugIn dataconnector */
+ pFunc_Get_Item = getFunction_DataConnector_GET_ITEM(content_type);
+ if (pFunc_Get_Item == 0) {
+ FW_LOGI("%d", __LINE__);
+ ret = DACI_NOT_FOUND_PLUG_IN;
+ goto DACI_FINISH;
+ }
+
+ ret = pFunc_Get_Item(service_account_id, service_folder_id, service_item_id, &service_data);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGI("%d", __LINE__);
+ goto DACI_FINISH;
+ }
+
+ /* 5. call plugIn dataconverter */
+ int converter_plugIn_id = getDataConverter_PlugIn_ID(content_type);
+ pFunc_Reverse_Converter = getFunction_DataConverter_Reverse_Converter(converter_plugIn_id);
+ if (pFunc_Reverse_Converter == 0) {
+ FW_LOGI("%d", __LINE__);
+ ret = DACI_NOT_FOUND_PLUG_IN;
+ goto DACI_FINISH;
+ }
+
+ ret = pFunc_Reverse_Converter(service_data, data);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGV("[DACI_Service_Get_Item] failed pFunc_Reverse_Converter()\n");
+ } else {
+ FW_LOGV("[DACI_Service_Get_Item] success pFunc_Reverse_Converter()\n");
+ }
+
+DACI_FINISH:
+
+ /* memory free */
+ if (service_folder_id != 0)
+ free(service_folder_id);
+
+ if (service_item_id != 0)
+ free(service_item_id);
+
+ return ret;
+}
+
+DACI_RETURN DACI_Service_Add_Folder(int content_type, int account_id, char *folder_name, int folder_type, char **folder_id)
+{
+ FW_LOGV("[DACI_Service_Add_Folder] start");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int service_account_id = 0;
+ ADD_FOLDER pFunc_AddFolder;
+
+ /* 1. get service account id */
+ service_account_id = getAccountID_Service(content_type, account_id);
+ FW_LOGV("[DACI_Service_Add_Folder] service_acount_id: %d", service_account_id);
+
+ /* 2. call plugIn dataconnector */
+ pFunc_AddFolder = getFunction_DataConnector_ADD_FOLDER(content_type);
+ if (pFunc_AddFolder == 0) {
+ FW_LOGI("%d", __LINE__);
+ return DACI_NOT_FOUND_PLUG_IN;
+ }
+
+ ret = pFunc_AddFolder(service_account_id, folder_name, folder_type, folder_id);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGV("[DACI_Service_Add_Folder] failed pFunc_AddFolder()\n");
+ } else {
+ FW_LOGV("[DACI_Service_Add_Folder] success pFunc_AddFolder()\n");
+ FW_LOGV("[DACI_Service_Add_Folder] added service id : %s", *folder_id);
+ }
+
+ return ret;
+}
+
+DACI_RETURN DACI_Service_Delete_Folder(int content_type, int account_id, char *folder_id)
+{
+ FW_LOGV("[DACI_Service_Delete_Folder] start");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int service_account_id = 0;
+ char *service_folder_id = 0;
+ DEL_FOLDER pFunc_DelFolder;
+
+ /* 1. get service account id */
+ service_account_id = getAccountID_Service(content_type, account_id);
+ FW_LOGV("[DACI_Service_Delete_Folder] service_acount_id : %d", service_account_id);
+
+ /* 2. get service folder id */
+ service_folder_id = DACI_Get_Folder_Service_Id(folder_id);
+ FW_LOGV("[DACI_Service_Delete_Folder] service_folder_id : %s", service_folder_id);
+
+ /* 3. call plugIn dataconnector */
+ pFunc_DelFolder = getFunction_DataConnector_DEL_FOLDER(content_type);
+ if (pFunc_DelFolder == 0) {
+ FW_LOGI("%d", __LINE__);
+ ret = DACI_NOT_FOUND_PLUG_IN;
+ goto DACI_FINISH;
+ }
+
+ ret = pFunc_DelFolder(service_account_id, service_folder_id);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGV("[DACI_Service_Delete_Folder] failed pFunc_DelFolder()\n");
+ } else {
+ FW_LOGV("[DACI_Service_Delete_Folder] success pFunc_DelFolder()\n");
+ }
+
+DACI_FINISH:
+
+ if (service_folder_id != 0)
+ free(service_folder_id);
+
+ return ret;
+}
+
+DACI_RETURN DACI_Service_Get_Folder(int content_type, int account_id, char *folder_id, char **out_folder_name, int *out_folder_type)
+{
+ FW_LOGV("[DACI_Service_Get_Folder] start");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int service_account_id = 0;
+ char *service_folder_id = 0;
+ GET_FOLDER pFunc_GetFolder;
+
+ /* 1. get service account id */
+ service_account_id = getAccountID_Service(content_type, account_id);
+ FW_LOGV("[DACI_Service_Get_Folder] service_acount_id : %d", service_account_id);
+
+ /* 2. get service folder id */
+ service_folder_id = DACI_Get_Folder_Service_Id(folder_id);
+ FW_LOGV("[DACI_Service_Get_Folder] service_folder_id : %s", service_folder_id);
+
+ /* 3. call plugIn dataconnector */
+ pFunc_GetFolder = getFunction_DataConnector_GET_FOLDER(content_type);
+ if (pFunc_GetFolder == 0) {
+ FW_LOGI("%d", __LINE__);
+ ret = DACI_NOT_FOUND_PLUG_IN;
+ goto DACI_FINISH;
+ }
+
+ ret = pFunc_GetFolder(service_account_id, service_folder_id, out_folder_name, out_folder_type);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGV("[DACI_Service_Get_Folder] failed pFunc_GetFolder()\n");
+ } else {
+ FW_LOGV("[DACI_Service_Get_Folder] success pFunc_GetFolder()\n");
+ }
+
+DACI_FINISH:
+
+ if (service_folder_id != 0)
+ free(service_folder_id);
+
+ return ret;
+}
+
+DACI_RETURN DACI_Service_Execute(int content_type, int account_ID, const char *execute_key, void *execute_values, void **result)
+{
+ FW_LOGV("[DACI_Service_Execute] start");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int service_account_id = 0;
+ EXECUTE pFunc_Execute;
+
+ /* 1. get service account id */
+ service_account_id = getAccountID_Service(content_type, account_ID);
+ FW_LOGV("[DACI_Service_Execute] service_acount_id : %d", service_account_id);
+
+ /* 2. call plugIn dataconnector */
+ pFunc_Execute = getFunction_DataConnector_EXECUTE(content_type);
+ if (pFunc_Execute == 0) {
+ FW_LOGI("%d", __LINE__);
+ *result = 0;
+ return DACI_NOT_FOUND_PLUG_IN;
+ }
+
+ ret = pFunc_Execute(service_account_id, execute_key, execute_values, result);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGV("[DACI_Service_Execute] failed pFunc_Execute()\n");
+ } else {
+ FW_LOGV("[DACI_Service_Execute] success pFunc_Execute()\n");
+ }
+
+ return ret;
+}
+
+int DACI_Service_Get_Used_Item_Count(int content_type)
+{
+ FW_LOGV("[DACI_Service_Get_Used_Item_Count] start");
+
+ GET_USED_ITEM_COUNT pFunc_Get_Used_Count = getFunction_DataConnector_GET_USED_ITEM_COUNT(content_type);
+ if (pFunc_Get_Used_Count == 0) {
+ FW_LOGI("%d", __LINE__);
+ return DACI_NOT_FOUND_PLUG_IN;
+ }
+
+ /* 1. call plugIn dataconnector */
+ int used_count = pFunc_Get_Used_Count();
+ if (used_count <= -1) {
+ FW_LOGV("[DACI_Service_Get_Used_Item_Count] failed pFunc_Get_Used_Count()\n");
+ } else {
+ FW_LOGV("[DACI_Service_Get_Used_Item_Count] success pFunc_Get_Used_Count() : %d\n", used_count);
+ }
+
+ return used_count;
+}
+
+int DACI_Service_Get_Used_Item_Count_For_Folder(int content_type, int account_id, char *folder_id)
+{
+ FW_LOGV("[DACI_Service_Get_Used_Item_Count_For_Folder] start");
+
+ int used_count = DACI_SUCCESS;
+ int service_account_id = 0;
+ char *service_folder_id = 0;
+ GET_USED_COUNT_FOR_FOLDER pFunc_Get_Used_item_Count_For_Folder;
+
+ /* 1. get service account id */
+ service_account_id = getAccountID_Service(content_type, account_id);
+ FW_LOGV("[DACI_Service_Get_Used_Item_Count_For_Folder] service_acount_id : %d", service_account_id);
+
+ /* 2. get service folder id */
+ service_folder_id = DACI_Get_Folder_Service_Id(folder_id);
+ FW_LOGV("[DACI_Service_Get_Used_Item_Count_For_Folder] service_folder_id : %s", service_folder_id);
+
+ /* 3. call plugIn dataconnector */
+ pFunc_Get_Used_item_Count_For_Folder = getFunction_DataConnector_GET_USED_COUNT_FOR_FOLDER(content_type);
+ if (pFunc_Get_Used_item_Count_For_Folder == 0) {
+ FW_LOGI("%d", __LINE__);
+ used_count = DACI_NOT_FOUND_PLUG_IN;
+ goto DACI_FINISH;
+ }
+
+ used_count = pFunc_Get_Used_item_Count_For_Folder(service_account_id, service_folder_id);
+ if (used_count <= -1) {
+ FW_LOGV("[DACI_Service_Get_Used_Item_Count_For_Folder] failed pFunc_Get_Used_item_Count_For_Folder()\n");
+ } else {
+ FW_LOGV("[DACI_Service_Get_Used_Item_Count_For_Folder] success pFunc_Get_Used_item_Count_For_Folder() : %d\n", used_count);
+ }
+
+DACI_FINISH:
+
+ /* memory free */
+ if (service_folder_id != 0)
+ free(service_folder_id);
+
+ return used_count;
+}
+
+DACI_RETURN DACI_Service_Write_Items_To_FIle(int content_type, int account_id, char **file_path)
+{
+ FW_LOGV("start");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int service_account_id = 0;
+ WRITE_ITEMS_TO_FILE pFunc_Write_Items_To_Files;
+
+ /* 1. get service account id */
+ service_account_id = getAccountID_Service(content_type, account_id);
+ FW_LOGV("service_acount_id : %d", service_account_id);
+
+ /* 3. call plugIn dataconnector */
+ pFunc_Write_Items_To_Files = getFunction_DataConnector_WRITE_ITEMS_TO_FILE(content_type);
+ if (pFunc_Write_Items_To_Files == 0) {
+ FW_LOGI("%d", __LINE__);
+ ret = DACI_NOT_FOUND_PLUG_IN;
+ goto DACI_FINISH;
+ }
+
+ ret = pFunc_Write_Items_To_Files(service_account_id, file_path);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGV("failed pFunc_Write_Items_To_Files()\n");
+ } else {
+ FW_LOGV("success pFunc_Write_Items_To_Files() : %d\n", ret);
+ }
+
+DACI_FINISH:
+
+ return ret;
+}
+
+DACI_RETURN DACI_Service_Add_File_Wrote_Items_To_Datastore(int content_type, int account_id, const char *file_path)
+{
+ FW_LOGV("start");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int service_account_id = 0;
+ ADD_FILE_WROTE_ITEMS_TO_DATASTORE pFunc_Add_File_Wrote_Items_To_Datastore;
+
+ /* 1. get service account id */
+ service_account_id = getAccountID_Service(content_type, account_id);
+ FW_LOGV("service_acount_id : %d", service_account_id);
+
+ /* 3. call plugIn dataconnector */
+ pFunc_Add_File_Wrote_Items_To_Datastore = getFunction_DataConnector_ADD_FILE_WROTE_ITEM_TO_DATASTORE(content_type);
+ if (pFunc_Add_File_Wrote_Items_To_Datastore == 0) {
+ FW_LOGI("%d", __LINE__);
+ ret = DACI_NOT_FOUND_PLUG_IN;
+ goto DACI_FINISH;
+ }
+
+ ret = pFunc_Add_File_Wrote_Items_To_Datastore(service_account_id, file_path);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGV("failed pFunc_Add_File_Wrote_Items_To_Datastore()\n");
+ } else {
+ FW_LOGV("success pFunc_Add_File_Wrote_Items_To_Datastore() : %d\n", ret);
+ }
+
+DACI_FINISH:
+
+ return ret;
+}
+
+int DACI_Service_Get_MAX_Item_Count(int content_type, int folder_type)
+{
+ int max_item_count = 0;
+ GET_MAX_ITEM_COUNT pFunc_Get_Max_Item_Count;
+
+ pFunc_Get_Max_Item_Count = getFunction_DataConnector_GET_MAX_ITEM_COUNT(content_type);
+ if (pFunc_Get_Max_Item_Count == 0) {
+ FW_LOGE("[DACI_Service_Get_MAX_Item_Count] Fail!");
+ }
+
+ max_item_count = pFunc_Get_Max_Item_Count(folder_type);
+
+ FW_LOGI("End");
+ return max_item_count;
+
+}
+
+int DACI_Service_Get_MAX_Field_Length(int content_type, int field_name, int child_field_name)
+{
+ int max_field_len = 0;
+ GET_MAX_FIELD_LENGTH pFunc_Get_Max_Field_Len;
+
+ pFunc_Get_Max_Field_Len = getFunction_DataConnector_GET_MAX_FIELD_LENGTH(content_type);
+ if (pFunc_Get_Max_Field_Len == 0) {
+ FW_LOGE("[DACI_Service_Get_MAX_Field_Length] Fail!");
+ }
+
+ max_field_len = pFunc_Get_Max_Field_Len(field_name, child_field_name);
+
+ FW_LOGI("End");
+ return max_field_len;
+
+}
+
+int DACI_Service_Get_MAX_Field_Count(int content_type, int field_name, int child_field_name)
+{
+ int max_field_count = 0;
+ GET_MAX_FIELD_COUNT pFunc_Get_Max_Field_Count;
+
+ pFunc_Get_Max_Field_Count = getFunction_DataConnector_GET_MAX_FIELD_COUNT(content_type);
+ if (pFunc_Get_Max_Field_Count == 0) {
+ FW_LOGE("[DACI_Service_Get_MAX_Field_Count] Fail!");
+ }
+
+ max_field_count = pFunc_Get_Max_Field_Count(field_name, child_field_name);
+
+ FW_LOGI("End");
+ return max_field_count;
+
+}
+
+int DACI_Service_Get_Field_Value(int content_type, int field_name, int child_field_name, char **str_val, int *num_val1, int *num_val2)
+{
+ GET_FIELD_VALUE pFunc_Get_Field_Value;
+
+ pFunc_Get_Field_Value = getFunction_DataConnector_GET_FIELD_VALUE(content_type);
+ if (pFunc_Get_Field_Value == 0) {
+ FW_LOGE("[DACI_Service_Get_Field_Value] Fail!");
+ }
+
+ if (pFunc_Get_Field_Value(field_name, child_field_name, &(*str_val), num_val1, num_val2) == 0) {
+ FW_LOGE("[DACI_Service_Get_Field_Value] Error!");
+ return 0;
+ }
+
+ FW_LOGI("End");
+ return 1;
+
+}
+
+int DACI_Service_Get_Is_Support_Feature(int content_type, int feature)
+{
+ GET_IS_SUPPORT_FEATURE pFunc_Get_Is_Support_Feature;
+
+ pFunc_Get_Is_Support_Feature = getFunction_DataConnector_GET_IS_SUPPORT_FEATURE(content_type);
+ if (pFunc_Get_Is_Support_Feature == 0) {
+ FW_LOGE("[DACI_Service_Get_Is_Support_Feature] Fail!");
+ }
+
+ FW_LOGI("End");
+ return pFunc_Get_Is_Support_Feature(feature);
+
+}
diff --git a/framework/src/DataAdapter/EXT_DACI_Converter.c b/framework/src/DataAdapter/EXT_DACI_Converter.c
new file mode 100755
index 0000000..c179ff6
--- /dev/null
+++ b/framework/src/DataAdapter/EXT_DACI_Converter.c
@@ -0,0 +1,191 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ * Heeyoung Hwang <heeyoung1008.hwang@samsung.com>
+ */
+
+#include "PlugIn/PlugIn_DataConnector.h"
+#include "PlugIn/PlugIn_DataConverter.h"
+
+#include "Utility/fw_log.h"
+
+#include "DataAdapter/EXT_DACI_Converter.h"
+
+#define LOG_TAG "AF_DACI"
+
+void *T_DACI_Alloc_Obj(int content_type)
+{
+ FW_LOGV("start");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ Alloc_Object pFunc_Alloc_Object;
+
+ int converter_plugIn_id = getDataConverter_PlugIn_ID(content_type);
+ pFunc_Alloc_Object = getFunction_DataConverter_Alloc_Object(converter_plugIn_id);
+ if (pFunc_Alloc_Object == 0) {
+ FW_LOGI("%d", __LINE__);
+ }
+
+ void *result = pFunc_Alloc_Object();
+ if (result == 0) {
+ FW_LOGE("Fail!");
+ ret = DACI_ERR_OPEN_FAILED;
+ } else {
+ FW_LOGV("Success!");
+ }
+
+ return result;
+}
+
+DACI_RETURN T_DACI_Free_Obj(int content_type, void *in_object)
+{
+ FW_LOGV("start");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ Free_Object pFunc_Free_Object;
+
+ int converter_plugIn_id = getDataConverter_PlugIn_ID(content_type);
+ pFunc_Free_Object = getFunction_DataConverter_Free_Object(converter_plugIn_id);
+ if (pFunc_Free_Object == 0) {
+ FW_LOGI("%d", __LINE__);
+ }
+
+ FW_LOGV("mid");
+ int err = pFunc_Free_Object(in_object);
+ if (err != 1) {
+ FW_LOGE("Fail!");
+ ret = DACI_ERRORS;
+ } else {
+ FW_LOGV("Success!");
+ }
+
+ FW_LOGV("end");
+ return ret;
+}
+
+void *T_DACI_Set_Value_To_Obj(int content_type, void *in_object, int key, char *extension_key, void *set_value)
+{
+ FW_LOGV("start");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ Set_Value pFunc_Set_Value_To_Object;
+
+ int converter_plugIn_id = getDataConverter_PlugIn_ID(content_type);
+ pFunc_Set_Value_To_Object = getFunction_DataConverter_Set_Value_To_Object(converter_plugIn_id);
+ if (pFunc_Set_Value_To_Object == 0) {
+ FW_LOGI("%d", __LINE__);
+ }
+
+ void *result = pFunc_Set_Value_To_Object(in_object, key, extension_key, set_value);
+ if (result == 0) {
+ FW_LOGE("Fail!");
+ ret = DACI_ERRORS;
+ } else {
+ FW_LOGV("Success!");
+ }
+
+ return result;
+}
+
+void *T_DACI_Get_Value_To_Obj(int content_type, void *in_object, int key, char *extension_key)
+{
+ FW_LOGV("start");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ Get_Value pFunc_Get_Value_To_Object;
+
+ int converter_plugIn_id = getDataConverter_PlugIn_ID(content_type);
+ pFunc_Get_Value_To_Object = getFunction_DataConverter_Get_Value_To_Object(converter_plugIn_id);
+ if (pFunc_Get_Value_To_Object == 0) {
+ FW_LOGI("%d", __LINE__);
+ }
+
+ void *result = pFunc_Get_Value_To_Object(in_object, key, extension_key);
+ if (result == 0) {
+ FW_LOGE("Fail!");
+ ret = DACI_ERRORS;
+ } else {
+ FW_LOGV("Success!");
+ }
+
+ return result;
+}
+
+Object_Info *T_DACI_Get_Obj_Info(int content_type)
+{
+ FW_LOGV("start");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ Get_Obj_Info pFunc_Get_Obj_Info;
+
+ int converter_plugIn_id = getDataConverter_PlugIn_ID(content_type);
+ pFunc_Get_Obj_Info = getFunction_DataConverter_Get_Obj_Info(converter_plugIn_id);
+ if (pFunc_Get_Obj_Info == 0) {
+ FW_LOGI("%d", __LINE__);
+ }
+
+ Object_Info *result = pFunc_Get_Obj_Info();
+ if (result == 0) {
+ FW_LOGE("Fail!");
+ ret = DACI_ERRORS;
+ } else {
+ FW_LOGV("Success!");
+ }
+
+ return result;
+}
+
+DACI_RETURN T_DACI_Free_Obj_Info(int content_type, Object_Info *obj_info)
+{
+ FW_LOGV("start");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ Free_Obj_Info pFunc_Free_Obj_Info;
+
+ int converter_plugIn_id = getDataConverter_PlugIn_ID(content_type);
+ pFunc_Free_Obj_Info = getFunction_DataConverter_Free_Obj_Info(converter_plugIn_id);
+ if (pFunc_Free_Obj_Info == 0) {
+ FW_LOGI("%d", __LINE__);
+ }
+
+ int err = pFunc_Free_Obj_Info(obj_info);
+ if (err != 1) {
+ FW_LOGE("Fail!");
+ ret = DACI_ERRORS;
+ } else {
+ FW_LOGV("Success!");
+ }
+
+ FW_LOGV("end");
+ return ret;
+}
diff --git a/framework/src/Device/EXT_DCI_DevExecutor.c b/framework/src/Device/EXT_DCI_DevExecutor.c
new file mode 100755
index 0000000..53c756b
--- /dev/null
+++ b/framework/src/Device/EXT_DCI_DevExecutor.c
@@ -0,0 +1,87 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ * Seongwon Shim <seongwon.shim@samsung.com>
+ */
+#include <string.h>
+
+#include "Device/EXT_DCI_DevExecutor.h"
+#include "PlugIn/PlugIn_DeviceInfo.h"
+#include "Utility/fw_log.h"
+
+#define LOG_TAG "AF_DCI"
+
+DCI_RETURN DCI_PM_Lock_State(int device_plugIn_id, PM_State state, PM_Lock_State_Flag flag, unsigned int timeout)
+{
+ FW_LOGV("Start !! \n");
+ DCI_RETURN res = DCI_SUCCESS;
+
+ PM_Lock_State pFunc_PM_Lock_State = getFunction_PM_Lock_State(device_plugIn_id);
+ if (pFunc_PM_Lock_State == 0) {
+ FW_LOGV("[%s] cannot get pFunc !! \n", __func__);
+ }
+
+ int err = pFunc_PM_Lock_State(state, flag, timeout);
+ if (err < 0) {
+ FW_LOGV("fail !!\n");
+ res = DCI_FAIL;
+ } else {
+ FW_LOGV("success !! \n");
+ }
+
+ FW_LOGV("End !! \n");
+ return res;
+
+}
+
+DCI_RETURN DCI_PM_Unlock_State(int device_plugIn_id, PM_State state, PM_Unlock_State_Flag flag)
+{
+ FW_LOGV("Start !! \n");
+ DCI_RETURN res = DCI_SUCCESS;
+
+ PM_Unlock_State pFunc_PM_Unlock_State = getFunction_PM_Unlock_State(device_plugIn_id);
+ if (pFunc_PM_Unlock_State == 0) {
+ FW_LOGV("[%s] cannot get pFunc !! \n", __func__);
+ }
+
+ int err = pFunc_PM_Unlock_State(state, flag);
+ if (err < 0) {
+ FW_LOGV("fail !!\n");
+ res = DCI_FAIL;
+ } else {
+ FW_LOGV("success !! \n");
+ }
+
+ FW_LOGV("End !! \n");
+ return res;
+}
diff --git a/framework/src/Device/EXT_DCI_DevInfo.c b/framework/src/Device/EXT_DCI_DevInfo.c
new file mode 100755
index 0000000..9e2ee63
--- /dev/null
+++ b/framework/src/Device/EXT_DCI_DevInfo.c
@@ -0,0 +1,125 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#include <string.h>
+
+#include "Utility/fw_log.h"
+#include "Device/EXT_DCI_DevInfo.h"
+#include "PlugIn/PlugIn_DeviceInfo.h"
+
+#define LOG_TAG "AF_DCI"
+
+static GList *dev_info;
+
+DCI_RETURN DCI_Init(int device_plugIn_id)
+{
+ FW_LOGV("[%s] Start !! \n", __func__);
+ DCI_RETURN res = DCI_SUCCESS;
+
+ FW_LOGI("[%s] plug-in id : %d\n", __func__, device_plugIn_id);
+
+ Load_DevInfo pFunc_Load_DevInfo = getFunction_DeviceInfo_Load_DevInfo(device_plugIn_id);
+ if (pFunc_Load_DevInfo == 0) {
+ FW_LOGV("[%s] cannot get pFunc_Load_DevInfo !! \n", __func__);
+ return DCI_FAIL;
+ }
+
+ int err = pFunc_Load_DevInfo(&dev_info);
+ if (err != 1) {
+ FW_LOGV("[%s] fail !!\n", __func__);
+ res = DCI_FAIL;
+ } else {
+ FW_LOGV("[%s] success !! \n", __func__);
+ }
+
+ FW_LOGV("[%s] End !! \n", __func__);
+ return res;
+}
+
+DCI_RETURN DCI_Get_DevInfo(int device_plugIn_id, char *info_name, char **value)
+{
+ FW_LOGV("[%s] Start !! \n", __func__);
+ DCI_RETURN res = DCI_SUCCESS;
+
+ if (info_name == NULL || !strcmp(info_name, ""))
+ return DCI_FAIL;
+
+ Get_DevInfo pFunc_Get_DevInfo = getFunction_DeviceInfo_Get_DevInfo(device_plugIn_id);
+ if (pFunc_Get_DevInfo == 0) {
+ FW_LOGV("[%s] cannot get pFunc_Get_DevInfo !! \n", __func__);
+ return DCI_FAIL;
+ }
+
+ int err = pFunc_Get_DevInfo(dev_info, info_name, value);
+ FW_LOGV("[%s] info name : %s\n", __func__, info_name);
+ FW_LOGV("[%s] value : %s\n", __func__, *value);
+
+ if (err == 0) {
+ FW_LOGV("[%s] fail - value is null !!\n", __func__);
+ res = DCI_DEVINFO_VALUE_IS_NULL;
+ } else if (err == -1) {
+ FW_LOGV("[%s] fail - not exist this information !!\n", __func__);
+ res = DCI_NOT_EXIST_DEVINFO;
+ } else {
+ FW_LOGV("[%s] success !! \n", __func__);
+ }
+
+ FW_LOGV("[%s] End !! \n", __func__);
+
+ return res;
+}
+
+DCI_RETURN DCI_Destroy(int device_plugIn_id)
+{
+ FW_LOGV("[%s] Start !! \n", __func__);
+ DCI_RETURN res = DCI_SUCCESS;
+
+ Clear_DevInfo pFunc_Clear_DevInfo = getFunction_DeviceInfo_Clear_DevInfo(device_plugIn_id);
+ if (pFunc_Clear_DevInfo == 0) {
+ FW_LOGV("[%s] cannot get pFunc_Clear_DevInfo !! \n", __func__);
+ }
+
+ int err = pFunc_Clear_DevInfo(&dev_info);
+ if (err != 1) {
+ FW_LOGV("[%s] fail !!\n", __func__);
+ res = DCI_FAIL;
+ } else {
+ FW_LOGV("[%s] success !! \n", __func__);
+ }
+
+ FW_LOGV("[%s] End !! \n", __func__);
+
+ return res;
+}
diff --git a/framework/src/EngineController/engine_controller.c b/framework/src/EngineController/engine_controller.c
new file mode 100755
index 0000000..c3c608f
--- /dev/null
+++ b/framework/src/EngineController/engine_controller.c
@@ -0,0 +1,680 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#include <stdbool.h>
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <signal.h>
+#include "Utility/fw_assert.h"
+#include "Utility/fw_log.h"
+#include "EngineController/engine_controller.h"
+#include "EngineController/engine_controller_internal.h"
+#include "EngineController/task_message.h"
+#include "EngineController/task_spec.h"
+#include "EngineController/task_pool.h"
+#include "EngineController/task_spec_internal.h"
+
+#define LOG_TAG "AF_EC"
+
+GPrivate *pCancel_TSK = NULL;
+
+typedef void *(*engine_controller_logic_func) (engine_controller_t *);
+
+typedef void *(*thread_start_routine) (void *);
+
+static engine_controller_t *pGlobal_engine_controller = NULL;
+static engine_controller_receiver_t *pGlobal_engine_controller_receiver = NULL;
+
+typedef struct sync_task_output_s sync_task_output_t;
+struct sync_task_output_s {
+ pthread_mutex_t mutex;
+ pthread_cond_t output_set_done_cond;
+ ec_boolean output_set_done;
+ task_error_t task_error;
+ ec_uint out_param_cnt;
+ param_t **out_param_array;
+};
+
+static sync_task_output_t *alloc_and_init_sync_task_output()
+{
+ sync_task_output_t *pOutput = (sync_task_output_t *)calloc(1, sizeof(sync_task_output_t));
+ if (pOutput == NULL) {
+ goto error_part;
+ }
+
+ pOutput->output_set_done = false;
+ pthread_mutex_init(&(pOutput->mutex), NULL);
+ pthread_cond_init(&(pOutput->output_set_done_cond), NULL);
+
+ return pOutput;
+
+error_part:
+ return NULL;
+}
+
+static void destory_sync_task_output(sync_task_output_t *pOutput)
+{
+ if (pOutput != NULL) {
+ pthread_cond_destroy(&(pOutput->output_set_done_cond));
+ pthread_mutex_destroy(&(pOutput->mutex));
+
+ free(pOutput);
+ }
+}
+
+static void static_sync_task_finish_callback(task_error_t task_error, ec_uint out_param_cnt, param_t **out_param_array, ec_pointer usr_data)
+{
+ FW_LOGD("started\n");
+ sync_task_output_t *pOutput = (sync_task_output_t *)usr_data;
+
+ pthread_mutex_lock(&(pOutput->mutex));
+ /* set output */
+ pOutput->task_error = task_error;
+ pOutput->out_param_cnt = out_param_cnt;
+ pOutput->out_param_array = out_param_array;
+
+ g_atomic_int_set(&(pOutput->output_set_done), true);
+ FW_LOGD("before conditional signal\n");
+ /* wake up receiver */
+ pthread_cond_signal(&(pOutput->output_set_done_cond));
+ pthread_mutex_unlock(&(pOutput->mutex));
+ FW_LOGD("after conditional signal\n");
+
+ FW_LOGD("finished\n");
+}
+
+static void engine_controller_send_parent_task_done_msg_to_itseft(task_t *pParent_task)
+{
+ FW_LOGD("called. task_name = %s\n", pParent_task->pTask_spec->task_name);
+ task_message_t *pNew_task_msg = task_message_create(TASK_DONE, pParent_task, 0);
+ if (pNew_task_msg == NULL) {
+ FW_LOGE("error. out of memory. we can not create parent container done message.");
+ assert(false);
+ /* TODO : error handling */
+ }
+ send_msg_to_engine_controller_with_compare_priority(pNew_task_msg, compare_priority_of_task_message_append_way, NULL);
+}
+
+static void engine_controller_send_new_runnerable_child_task_msgs_to_itself(GSList *runnable_child_task_list, task_message_t *pReceived_task_msg)
+{
+ task_message_t *pNew_task_msg = NULL;
+ task_t *pChild_task = NULL;
+ GSList *iter = NULL;
+ for (iter = runnable_child_task_list; iter != NULL; iter = g_slist_next(iter)) {
+ pChild_task = (task_t *)(iter->data);
+ pNew_task_msg = task_message_create(TASK_START, pChild_task, 0);
+ if (pReceived_task_msg->task_state == TASK_START) {
+ /* note that we have to prepend task message in front of other messages with same priority */
+ /* otherwise, child task in container task always has penalty then new task input */
+ send_msg_to_engine_controller_with_compare_priority(pNew_task_msg, compare_priority_of_task_message_append_way, NULL);
+ } else if (pReceived_task_msg->task_state == TASK_DONE) {
+ send_msg_to_engine_controller_with_compare_priority(pNew_task_msg, compare_priority_of_task_message_append_way, NULL);
+ } else {
+ FW_LOGE("task msg has invalid task state");
+ assert(false);
+ }
+ }
+}
+
+static void *engine_controller_logic(engine_controller_t *pEngine_controller)
+{
+ fw_async_queue_t *pQueue = pEngine_controller->pQueue;
+ thread_pool_t *pPool = pEngine_controller->pThread_pool;
+ task_pool_t *pTask_pool = pEngine_controller->pTask_pool;
+ task_t *pTask = NULL;
+ task_t *pParent_task = NULL;
+ ec_int child_task_index_in_parent_task = -1;
+ task_message_t *pReceived_task_msg = NULL;
+ GSList *runnable_child_task_list = NULL;
+
+ FW_LOGD("started\n");
+
+ while (true) {
+ /* receive msg */
+ pReceived_task_msg = fw_async_queue_receive_msg(pQueue);
+ if (pReceived_task_msg == NULL) {
+ FW_LOGE("null returned from receive_msg_fw_async_queue\n");
+ continue;
+ }
+
+ if (pReceived_task_msg->task_state == TASK_ROOT_START) {
+ pTask = task_ref_task(pReceived_task_msg->u.pTask);
+ engine_controller_request_msg_t *pRequest_msg = (engine_controller_request_msg_t *)getData(pTask->pRequestMsg);
+ FW_LOGD("\n\n======= [CONTROLLER : TASK_ROOT_START] task(msg id : %d, task name : %s, task spec id : %d) ========= \n\n", pRequest_msg->msg_head.msg_id, pTask->pTask_spec->task_name, pRequest_msg->task_spec_id);
+
+ assert(task_is_root_task(pTask));
+ task_pool_add_task(pTask_pool, pRequest_msg->msg_head.msg_id, pTask);
+
+ task_message_t *pNew_task_msg = task_message_create(TASK_START, pTask, 0);
+ if (pNew_task_msg == NULL) {
+ /* TODO */
+ assert(false);
+ }
+ send_msg_to_engine_controller_with_compare_priority(pNew_task_msg, compare_priority_of_task_message_append_way, NULL);
+
+ task_unref_task(pTask);
+
+ } else if (pReceived_task_msg->task_state == TASK_START) {
+ pTask = task_ref_task(pReceived_task_msg->u.pTask);
+ engine_controller_request_msg_t *pRequest_msg = (engine_controller_request_msg_t *)getData(pTask->pRequestMsg);
+ FW_LOGD("\n\n======= [CONTROLLER : TASK_START] =========\ntask(task name : %s) related to root_task(msg id : %d, task spec id : %d)\n\n", pTask->pTask_spec->task_name, pRequest_msg->msg_head.msg_id, pRequest_msg->task_spec_id);
+
+ /* queuing if task applied to queuing rule */
+ ec_boolean is_pending_task = task_add_pending_task_list_of_first_progress_blocking_realized_entity(pTask);
+ if (is_pending_task) {
+ FW_LOGI("task name : %s pending by queuing rule\n", pTask->pTask_spec->task_name);
+ task_unref_task(pTask);
+ goto last;
+ }
+
+ if (task_is_simple_task(pTask)) {
+ thread_pool_push_task(pPool, pTask);
+ }
+
+ if (task_is_container_task(pTask)) {
+ /* update progress blocking realized entity when dynamic task case */
+ /* this can be done since other dynamic case conditions can be ignored now */
+ if (task_spec_is_dynamic_container_task_spec(pTask->pTask_spec)) {
+ task_update_progress_blocking_realized_entity_and_pop_if_possible(pTask);
+ }
+
+ /* check runnable child task */
+ runnable_child_task_list = collect_firstly_runnable_child_tasks(pTask);
+ if (runnable_child_task_list == NULL) {
+ FW_LOGE("no runnable child task exist.\n");
+ assert(false);
+ }
+
+ /* send task message to engine controller itself */
+ engine_controller_send_new_runnerable_child_task_msgs_to_itself(runnable_child_task_list, pReceived_task_msg);
+ }
+
+ task_unref_task(pTask);
+
+ } else if (pReceived_task_msg->task_state == TASK_ROOT_DONE) {
+ pTask = task_ref_task(pReceived_task_msg->u.pTask);
+ engine_controller_request_msg_t *pRequest_Msg = (engine_controller_request_msg_t *)getData(pTask->pRequestMsg);
+
+ FW_LOGD("\n\n======= [CONTROLLER : TASK_ROOT_DONE] task(result : %s), msg id : %d, task name : %s, task spec id : %d) ========= \n\n", task_error_string(pTask->task_error), pRequest_Msg->msg_head.msg_id, pTask->pTask_spec->task_name, pRequest_Msg->task_spec_id);
+
+ task_pool_remove_task(pTask_pool, pRequest_Msg->msg_head.msg_id);
+ task_call_task_finish_callback(pTask);
+ FW_LOGD("root task task_call_task_finish_callback done\n");
+ FW_LOGD("root task done\n");
+ } else if (pReceived_task_msg->task_state == TASK_DONE) {
+ pTask = task_ref_task(pReceived_task_msg->u.pTask);
+ engine_controller_request_msg_t *pRequest_msg = (engine_controller_request_msg_t *)getData(pTask->pRequestMsg);
+
+ /* loggiing */
+ FW_LOGD("\n\n======= [CONTROLLER : TASK_DONE : %s] =========\ntask(task name : %s) related to root_task(msg id : %d, task spec id : %d)\n\n", task_error_string(pTask->task_error), pTask->pTask_spec->task_name, pRequest_msg->msg_head.msg_id, pRequest_msg->task_spec_id);
+
+ task_update_progress_blocking_realized_entity_and_pop_if_possible(pTask);
+
+ if (task_is_root_task(pTask)) {
+
+ task_message_t *pNew_task_msg = task_message_create(TASK_ROOT_DONE, pTask, 0);
+ if (pNew_task_msg == NULL) {
+ /* TODO */
+ assert(false);
+ }
+ send_msg_to_engine_controller_with_compare_priority(pNew_task_msg, compare_priority_of_task_message_append_way, NULL);
+ } else {
+ switch (pTask->task_error) {
+ case TASK_ERROR_RUN_SUCCESS:
+ {
+ pParent_task = task_get_parent_task(pTask);
+ child_task_index_in_parent_task = task_get_child_index_in_parent_task(pTask);
+
+ task_decrease_left_child_to_run(pParent_task);
+
+ if (task_is_parent_task_done(pParent_task)) {
+ task_set_task_error(pParent_task, TASK_ERROR_RUN_SUCCESS);
+
+ /* get parent task output from child tasks */
+ task_collect_parent_task_output_parameter(pParent_task);
+
+ /* send parent task done message to engine controller itself */
+ engine_controller_send_parent_task_done_msg_to_itseft(pParent_task);
+
+ /* TODO : update */
+ } else {
+ /* remove dependencies related to done operation */
+ /* if some operations has no dependency, then push in thread_pool */
+ runnable_child_task_list = collect_become_runnable_child_tasks_by_remove_control_flow(pParent_task, child_task_index_in_parent_task);
+
+ /* send task message to engine controller itself */
+ engine_controller_send_new_runnerable_child_task_msgs_to_itself(runnable_child_task_list, pReceived_task_msg);
+ }
+ }
+ break;
+ case TASK_ERROR_RUN_FAILED:
+ case TASK_ERROR_CANCELED:
+ pParent_task = task_get_parent_task(pTask);
+
+ if (task_is_not_yet_run(pParent_task)) {
+ /* FIXME : do i have to wait other child task finished? */
+ task_set_task_error(pParent_task, pTask->task_error);
+
+ /* send parent task done message to engine controller itself */
+ engine_controller_send_parent_task_done_msg_to_itseft(pParent_task);
+ }
+ break;
+ default: /* TODO : other task error must be handled */
+ break;
+ }
+ }
+
+ task_unref_task(pTask);
+
+ } else if (pReceived_task_msg->task_state == TASK_CANCEL) {
+ pTask = task_pool_fetch_task(pTask_pool, pReceived_task_msg->u.request_msg_id);
+ if (pTask != NULL) {
+ engine_controller_request_msg_t *pRequest_msg = (engine_controller_request_msg_t *)getData(pTask->pRequestMsg);
+ FW_LOGD("\n\n======= [CONTROLLER : TASK_CANCEL] =========\ncancel task(request message id : %d, task name : %s) related to root_task(msg id : %d, task spec id : %d)\n\n", pReceived_task_msg->u.request_msg_id, pTask->pTask_spec->task_name, pRequest_msg->msg_head.msg_id, pRequest_msg->task_spec_id);
+
+ task_do_cancellation(pTask);
+ task_unref_task(pTask);
+ } else {
+ /* TODO : task request may be not handled yet. becuase cancel request has high priority */
+ FW_LOGD("\n\n======= [CONTROLLER : TASK_CANCEL] =========\ncancel task(request message id : %d) received, " "but no such task exist. it could be already executed or you never requested\n\n", pReceived_task_msg->u.request_msg_id);
+ }
+ } else if (pReceived_task_msg->task_state == TASK_CANCEL_ALL) {
+ FW_LOGD("\n\n======= [CONTROLLER : TASK_CANCEL_ALL] =========\n\n\n");
+
+ GList *all_tasks_list = task_pool_fetch_all_tasks(pTask_pool);
+ GList *iter = NULL;
+ task_t *pTask = NULL;
+ ec_uint i = 0;
+ engine_controller_request_msg_t *pRequest_msg = NULL;
+ for (i = 0, iter = all_tasks_list; iter != NULL; i++, iter = g_list_next(iter)) {
+ pTask = iter->data;
+ pRequest_msg = (engine_controller_request_msg_t *)getData(pTask->pRequestMsg);
+ FW_LOGD("\n\n======= [CONTROLLER : TASK_CANCEL_ALL_DETAIL (%d)] =========\ncancel task(request message id : %d, task name : %s) related to root_task(msg id : %d, task spec id : %d)\n\n", i, pReceived_task_msg->u.request_msg_id, pTask->pTask_spec->task_name, pRequest_msg->msg_head.msg_id, pRequest_msg->task_spec_id);
+
+ task_do_cancellation(pTask);
+ task_unref_task(pTask);
+ }
+
+ if (all_tasks_list != NULL)
+ g_list_free(all_tasks_list);
+ } else {
+ FW_LOGE("task msg has invalid task state\n");
+ assert(false);
+ }
+
+last:
+ task_message_free(pReceived_task_msg);
+ }
+
+ return NULL; /* TODO */
+}
+
+static void *engine_controller_receiver_logic(engine_controller_receiver_t *pEngine_controller_receiver)
+{
+ fw_async_queue_t *pQueue = pEngine_controller_receiver->pQueue;
+ task_info_pool_t *pTask_info_pool = pEngine_controller_receiver->pTask_info_pool;
+ queuing_rule_spec_pool_t *pQueuing_rule_spec_pool = pEngine_controller_receiver->pQueuing_rule_spec_pool;
+ engine_controller_error_t ec_error = ENGINE_CONTROLLER_OK;
+
+ task_message_t *pTask_msg = NULL;
+ fw_assert_condition(pQueue != NULL, "engine controller receiver has no queue\n");
+
+ while (true) {
+ void *pMsg = fw_async_queue_receive_msg(pQueue);
+ if (engine_controller_msg_is_register_msg(pMsg)) {
+ FW_LOGD("\n\n======= [RECEIVER : REGISTER TASK SPEC MSG] =========\n\n");
+ engine_controller_register_msg_t *pRegister_msg = (engine_controller_register_msg_t *)pMsg;
+
+ /* create task info and add to task info pool */
+ task_info_t *pTask_info = task_info_new(pRegister_msg->task_spec_id, pRegister_msg->pTask_spec);
+
+ task_info_pool_add_task_info(pTask_info_pool, pTask_info, false);
+ /* TODO */
+
+ engine_controller_msg_free_register_msg(pRegister_msg);
+ } else if (engine_controller_msg_is_unregister_msg(pMsg)) {
+ FW_LOGD("\n\n======= [RECEIVER : UNREGISTER TASK SPEC MSG] =========\n\n");
+ /* TODO */
+ } else if (engine_controller_msg_is_register_queuing_rule_spec_msg(pMsg)) {
+ FW_LOGD("\n\n======= [RECEIVER : REGISTER QUEUING RULE SPEC MSG] =========\n\n");
+ ec_uint queuing_rule_id = 0;
+ engine_controller_register_queuing_rule_spec_msg_t *pQueuing_rule_register_Msg = (engine_controller_register_queuing_rule_spec_msg_t *)pMsg;
+
+ ec_error = queuing_rule_spec_pool_add_queuing_rule_spec(pQueuing_rule_spec_pool, pQueuing_rule_register_Msg->pSpec, &queuing_rule_id);
+
+ if (pQueuing_rule_register_Msg->register_finish_callback) {
+ pQueuing_rule_register_Msg->register_finish_callback(ec_error, queuing_rule_id, pQueuing_rule_register_Msg->usr_data);
+ }
+ /* TODO */
+ } else if (engine_controller_msg_is_cancel_msg(pMsg)) {
+ FW_LOGD("\n\n======= [RECEIVER : CANCEL MSG] =========\n\n");
+ engine_controller_cancel_msg_t *pCancel_Msg = ((engine_controller_cancel_msg_t *)pMsg);
+
+ pTask_msg = task_message_create(TASK_CANCEL, NULL, pCancel_Msg->request_msg_id_to_cancel);
+ if (pTask_msg == NULL) {
+ FW_LOGE("out of memory during task_message_create\n");
+ assert(false);
+ continue;
+ }
+
+ send_msg_to_engine_controller_with_compare_priority(pTask_msg, compare_priority_of_task_message_append_way, NULL);
+
+ } else if (engine_controller_msg_is_cancel_all_msg(pMsg)) {
+ FW_LOGD("\n\n======= [RECEIVER : CANCEL ALL MSG] =========\n\n");
+
+ pTask_msg = task_message_create(TASK_CANCEL_ALL, NULL, 0);
+ if (pTask_msg == NULL) {
+ FW_LOGE("out of memory during task_message_create\n");
+ assert(false);
+ continue;
+ }
+
+ send_msg_to_engine_controller_with_compare_priority(pTask_msg, compare_priority_of_task_message_append_way, NULL);
+
+ } else if (engine_controller_msg_is_request_msg(pMsg)) {
+
+ FW_LOGD("\n\n======= [RECEIVER : REQUEST MSG] =========\n\n");
+ engine_controller_request_msg_t *pRequest_Msg = ((engine_controller_request_msg_t *)pMsg);
+
+ task_info_t *pTask_info = task_info_pool_search_task_info(pTask_info_pool, pRequest_Msg->task_spec_id);
+ task_spec_t *pTask_spec = NULL;
+ task_t *pTask = NULL;
+
+ if (pTask_info == NULL) {
+ FW_LOGI("no msg spec found\n");
+ } else {
+ /* create task */
+ pTask_spec = pTask_info->pTask_spec;
+ pTask = task_alloc_root_task(pTask_spec, pRequest_Msg, pTask_info_pool);
+ if (pTask == NULL) {
+ FW_LOGE("out of memory during task_alloc_root_task\n");
+ assert(false);
+ continue;
+ }
+
+ pTask_msg = task_message_create(TASK_ROOT_START, pTask, 0);
+ if (pTask_msg == NULL) {
+ FW_LOGE("out of memory during task_message_create\n");
+ assert(false);
+ continue;
+ }
+
+ send_msg_to_engine_controller_with_compare_priority(pTask_msg, compare_priority_of_task_message_append_way, NULL);
+ task_unref_task(pTask);
+ }
+ } else {
+ FW_LOGD("\n\n======= [RECEIVER : UNKNOWN MSG] =========\n\n");
+ /* unknown msg type */
+ FW_LOGE("unknown msg type\n");
+ }
+ }
+ return NULL; /* TODO */
+}
+
+engine_controller_t *alloc_engine_controller(ec_uint max_thread_count)
+{
+ engine_controller_t *pEngine_controller = (engine_controller_t *)calloc(1, sizeof(engine_controller_t));
+ if (pEngine_controller == NULL) {
+ goto return_part;
+ }
+
+ pEngine_controller->pQueue = fw_async_queue_alloc();
+ if (pEngine_controller->pQueue == NULL) {
+ goto error_part;
+ }
+
+ pEngine_controller->pTask_pool = task_pool_create_task_pool();
+ if (pEngine_controller->pTask_pool == NULL) {
+ goto error_part;
+ }
+
+ pEngine_controller->pQueuing_rule_spec_pool = NULL;
+
+ pEngine_controller->pThread_pool = thread_pool_alloc_and_init(max_thread_count);
+ if (pEngine_controller->pThread_pool == NULL) {
+ goto error_part;
+ }
+
+ pCancel_TSK = thread_pool_get_cancel_TSK(pEngine_controller->pThread_pool);
+ if (pCancel_TSK == NULL) {
+ goto error_part;
+ }
+
+return_part:
+ return pEngine_controller;
+
+error_part:
+ free_engine_controller(pEngine_controller);
+ return NULL;
+}
+
+void free_engine_controller(engine_controller_t *pEngine_controller)
+{
+ if (pEngine_controller != NULL) {
+ /* TODO */
+ }
+}
+
+/* TODO error handling */
+void run_engine_controller(engine_controller_t *pEngine_controller)
+{
+ pthread_create(&(pEngine_controller->thread_id), NULL, (thread_start_routine) engine_controller_logic, (void *)pEngine_controller);
+ pthread_detach(pEngine_controller->thread_id);
+}
+
+engine_controller_receiver_t *alloc_engine_controller_receiver(engine_controller_t *pEngine_controller)
+{
+ engine_controller_receiver_t *pReceiver = NULL;
+
+ pReceiver = (engine_controller_receiver_t *)calloc(1, sizeof(engine_controller_receiver_t));
+ if (pReceiver == NULL) {
+ goto return_part;
+ }
+
+ pReceiver->next_msg_id = 0;
+
+ pReceiver->pQueue = fw_async_queue_alloc();
+ if (pReceiver->pQueue == NULL) {
+ goto error_part;
+ }
+
+ pReceiver->pTask_info_pool = task_info_pool_alloc();
+ if (pReceiver->pTask_info_pool == NULL) {
+ goto error_part;
+ }
+
+ /* TODO : remove below 1024 hard coding */
+ pReceiver->pQueuing_rule_spec_pool = queuing_rule_spec_pool_alloc(1024, pReceiver->pTask_info_pool);
+ if (pReceiver->pQueuing_rule_spec_pool == NULL) {
+ goto error_part;
+ }
+
+ pReceiver->pEngine_controller = pEngine_controller;
+
+ /* TODO */
+ pEngine_controller->pQueuing_rule_spec_pool = pReceiver->pQueuing_rule_spec_pool;
+
+return_part:
+ return pReceiver;
+
+error_part:
+ free_engine_controller_receiver(pReceiver);
+ return NULL;
+}
+
+void free_engine_controller_receiver(engine_controller_receiver_t *pEngine_controller_receiver)
+{
+ if (pEngine_controller_receiver != NULL) {
+ /* TODO */
+
+ /* NOTE : do not free engine_controller */
+ }
+}
+
+/* TODO error handling */
+void run_engine_controller_receiver(engine_controller_receiver_t *pEngine_controller_receiver)
+{
+ /* TODO */
+ pthread_create(&(pEngine_controller_receiver->thread_id), NULL, (thread_start_routine) engine_controller_receiver_logic, (void *)pEngine_controller_receiver);
+ pthread_detach(pEngine_controller_receiver->thread_id);
+}
+
+void send_msg_to_engine_controller_receiver(engine_controller_msg_head_t *msg)
+{
+ /* msg id management */
+ msg->msg_id = g_atomic_int_exchange_and_add(&(pGlobal_engine_controller_receiver->next_msg_id), 1);
+ FW_LOGD("============= msg id = %d =============\n", msg->msg_id);
+
+ fw_async_queue_send_msg(pGlobal_engine_controller_receiver->pQueue, (void *)msg);
+}
+
+void send_msg_to_engine_controller(task_message_t *pTask_msg)
+{
+ fw_async_queue_send_msg(pGlobal_engine_controller->pQueue, (void *)pTask_msg);
+}
+
+void send_msg_to_engine_controller_with_compare_priority(task_message_t *pTask_msg, compare_task_msg_priority_func ctmp_func, ec_pointer user_data)
+{
+ fw_async_queue_send_msg_with_compare_priority(pGlobal_engine_controller->pQueue, (void *)pTask_msg, (compare_priority_func) ctmp_func, (void *)user_data);
+}
+
+/* external interfaces */
+bool init_engine_controller(unsigned int max_thread_count)
+{
+ bool success = true;
+ engine_controller_t *pEngine_controller = NULL;
+ engine_controller_receiver_t *pEngine_controller_receiver = NULL;
+
+ /* alloc engine controller */
+ pEngine_controller = alloc_engine_controller(max_thread_count);
+ if (pEngine_controller == NULL) {
+ success = false;
+ goto return_part;
+ }
+
+ /* alloc engine controller receiver */
+ pEngine_controller_receiver = alloc_engine_controller_receiver(pEngine_controller);
+ if (pEngine_controller_receiver == NULL) {
+ success = false;
+ goto return_part;
+ }
+
+ /* run engine controller */
+ run_engine_controller(pEngine_controller);
+ run_engine_controller_receiver(pEngine_controller_receiver);
+
+return_part:
+ if (success) {
+ pGlobal_engine_controller = pEngine_controller;
+ pGlobal_engine_controller_receiver = pEngine_controller_receiver;
+ } else {
+ /* TODO : stop engine controller & receiver & free */
+ }
+
+ return success;
+}
+
+/* TODO : error handling */
+void engine_controller_register_task_spec(ec_uint task_spec_id, ec_char *task_spec_name, task_spec_t *pTask_spec, calculate_identifier_func cal_func)
+{
+ engine_controller_register_msg_t *pRegister_msg = engine_controller_msg_create_register_msg(task_spec_id, pTask_spec, cal_func);
+ send_msg_to_engine_controller_receiver((engine_controller_msg_head_t *)pRegister_msg);
+}
+
+void engine_controller_async_register_queuing_rule_spec(queuing_rule_spec_t *pSpec, register_finish_callback_func register_finish_callback, ec_pointer usr_data)
+{
+ engine_controller_register_queuing_rule_spec_msg_t *pMsg = engine_controller_msg_create_register_queuing_rule_spec_msg(pSpec, register_finish_callback, usr_data);
+
+ send_msg_to_engine_controller_receiver((engine_controller_msg_head_t *)pMsg);
+}
+
+void engine_controller_sync_register_queuing_rule_spec(queuing_rule_spec_t *pSpec, engine_controller_error_t *ec_error, ec_uint *registered_id)
+{
+ /* TODO */
+}
+
+/* TODO : error handling */
+void engine_controller_async_request_task(ec_uint task_spec_id, ec_uint identifier, ec_int cnt_in_param, ec_int *in_param_index_array, ECValueType * in_param_value_type_array, ec_pointer * in_param_value_array, task_finish_callback_func task_finish_callback, ec_pointer simple_task_finish_callback_usr_data, ec_int *request_id)
+{
+ engine_controller_request_msg_t *pMsg = engine_controller_msg_create_request_msg(task_spec_id, identifier, cnt_in_param,
+ in_param_index_array, in_param_value_type_array, in_param_value_array,
+ task_finish_callback, simple_task_finish_callback_usr_data);
+
+ send_msg_to_engine_controller_receiver((engine_controller_msg_head_t *)pMsg);
+ *request_id = pMsg->msg_head.msg_id;
+}
+
+void engine_controller_sync_request_task(ec_uint task_spec_id, ec_uint identifier, ec_int cnt_in_param, ec_int *in_param_index_array, ECValueType * in_param_value_type_array, ec_pointer * in_param_value_array, ec_int *request_id, task_error_t * task_error, ec_uint *out_param_cnt, param_t ***out_param_array)
+{
+ task_finish_callback_func sync_task_finish_callback = static_sync_task_finish_callback;
+ sync_task_output_t *pSync_task_output = alloc_and_init_sync_task_output();
+ if (pSync_task_output == NULL) {
+ return; /* error */
+ }
+
+ engine_controller_request_msg_t *pMsg = engine_controller_msg_create_request_msg(task_spec_id, identifier, cnt_in_param,
+ in_param_index_array, in_param_value_type_array, in_param_value_array,
+ sync_task_finish_callback, pSync_task_output);
+
+ pthread_mutex_lock(&(pSync_task_output->mutex));
+ send_msg_to_engine_controller_receiver((engine_controller_msg_head_t *)pMsg);
+
+ while (!g_atomic_int_get(&(pSync_task_output->output_set_done))) {
+ pthread_cond_wait(&(pSync_task_output->output_set_done_cond), &(pSync_task_output->mutex));
+ }
+
+ pthread_mutex_unlock(&(pSync_task_output->mutex));
+
+ *request_id = pMsg->msg_head.msg_id;
+ *task_error = pSync_task_output->task_error;
+ *out_param_cnt = pSync_task_output->out_param_cnt;
+ *out_param_array = pSync_task_output->out_param_array;
+
+ destory_sync_task_output(pSync_task_output);
+}
+
+void engine_controller_cancel_task(ec_int request_id_to_cancel)
+{
+ engine_controller_cancel_msg_t *pCancel_msg = engine_controller_msg_create_cancel_msg(request_id_to_cancel);
+ send_msg_to_engine_controller_receiver((engine_controller_msg_head_t *)pCancel_msg);
+}
+
+void engine_controller_cancel_all_task()
+{
+ engine_controller_cancel_all_msg_t *pCancel_all_msg = engine_controller_msg_create_cancel_all_msg();
+ send_msg_to_engine_controller_receiver((engine_controller_msg_head_t *)pCancel_all_msg);
+}
diff --git a/framework/src/EngineController/engine_controller_message.c b/framework/src/EngineController/engine_controller_message.c
new file mode 100755
index 0000000..767eee2
--- /dev/null
+++ b/framework/src/EngineController/engine_controller_message.c
@@ -0,0 +1,235 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include "EngineController/engine_controller_message.h"
+
+void engine_controller_msg_set_msg_head(engine_controller_msg_head_t *pMsg_head, engine_controller_msg_type_t msg_type, ec_uint msg_id)
+{
+ if (pMsg_head != NULL) {
+ pMsg_head->msg_id = msg_id;
+ pMsg_head->msg_type = msg_type;
+ }
+}
+
+engine_controller_register_msg_t *engine_controller_msg_create_register_msg(ec_uint task_spec_id, task_spec_t *pTask_spec, calculate_identifier_func id_calc_func)
+{
+ engine_controller_register_msg_t *pRegister_msg = (engine_controller_register_msg_t *)calloc(1, sizeof(engine_controller_register_msg_t));
+ if (pRegister_msg == NULL) {
+ goto error_part;
+ }
+
+ engine_controller_msg_set_msg_head(&(pRegister_msg->msg_head), ENGINE_CONTROLLER_REGISTER_MSG_TYPE, 0);
+
+ pRegister_msg->task_spec_id = task_spec_id;
+ pRegister_msg->pTask_spec = task_spec_ref(pTask_spec);
+ if (id_calc_func != NULL) {
+ pRegister_msg->id_calc_func = id_calc_func;
+ }
+
+ return pRegister_msg;
+error_part:
+ engine_controller_msg_free_register_msg(pRegister_msg);
+ return NULL;
+}
+
+void engine_controller_msg_free_register_msg(engine_controller_register_msg_t *pRegister_msg)
+{
+ if (pRegister_msg != NULL) {
+ if (pRegister_msg->pTask_spec != NULL) {
+ task_spec_unref(pRegister_msg->pTask_spec);
+ }
+
+ free(pRegister_msg);
+ }
+}
+
+engine_controller_register_queuing_rule_spec_msg_t *engine_controller_msg_create_register_queuing_rule_spec_msg(queuing_rule_spec_t *pSpec, register_finish_callback_func register_finish_callback, ec_pointer usr_data)
+{
+ engine_controller_register_queuing_rule_spec_msg_t *pMsg = (engine_controller_register_queuing_rule_spec_msg_t *)calloc(1, sizeof(engine_controller_register_queuing_rule_spec_msg_t));
+ if (pMsg == NULL) {
+ goto error_part;
+ }
+
+ engine_controller_msg_set_msg_head(&(pMsg->msg_head), ENGINE_CONTROLLER_REGISTER_QUEUING_RULE_SPEC_MSG_TYPE, 0);
+ pMsg->pSpec = queuing_rule_spec_ref(pSpec);
+
+ pMsg->register_finish_callback = register_finish_callback;
+ pMsg->usr_data = usr_data;
+
+ return pMsg;
+error_part:
+ engine_controller_msg_free_register_queuing_rule_spec_msg(pMsg);
+ return NULL;
+}
+
+void engine_controller_msg_free_register_queuing_rule_spec_msg(engine_controller_register_queuing_rule_spec_msg_t *pMsg)
+{
+ if (pMsg != NULL) {
+ /* TODO */
+ }
+}
+
+engine_controller_request_msg_t *engine_controller_msg_create_request_msg(ec_uint task_spec_id, ec_uint identifier, ec_int cnt_in_param, ec_int *in_param_index_array, ECValueType * in_param_value_type_array, ec_pointer * in_param_value_array, task_finish_callback_func task_finish_callback, ec_pointer simple_task_finish_callback_usr_data)
+{
+ engine_controller_request_msg_t *pMsg = (engine_controller_request_msg_t *)calloc(1, sizeof(engine_controller_request_msg_t));
+ ec_int i = 0;
+ if (pMsg == NULL) {
+ goto error_part;
+ }
+
+ engine_controller_msg_set_msg_head(&(pMsg->msg_head), ENGINE_CONTROLLER_REQUEST_MSG_TYPE, 0);
+ pMsg->task_spec_id = task_spec_id;
+ pMsg->identifier = identifier;
+ pMsg->cnt_in_param = cnt_in_param;
+ if (cnt_in_param > 0) {
+ pMsg->in_param_index_array = (ec_int *)malloc(cnt_in_param * sizeof(ec_int));
+ if (pMsg->in_param_index_array == NULL) {
+ goto error_part;
+ }
+ memcpy(pMsg->in_param_index_array, in_param_index_array, cnt_in_param * sizeof(ec_int));
+
+ pMsg->in_param_value_array = (param_value_t *)calloc(cnt_in_param, sizeof(param_value_t));
+ if (pMsg->in_param_value_array == NULL) {
+ goto error_part;
+ }
+
+ for (i = 0; i < cnt_in_param; i++) {
+ param_value_set_value(&(pMsg->in_param_value_array[i]), in_param_value_type_array[i], in_param_value_array[i]);
+ }
+ }
+ pMsg->task_finish_callback = task_finish_callback;
+ pMsg->simple_task_finish_callback_usr_data = simple_task_finish_callback_usr_data;
+
+ return pMsg;
+
+error_part:
+ engine_controller_msg_free_request_msg(pMsg);
+ return NULL;
+}
+
+void engine_controller_msg_free_request_msg(engine_controller_request_msg_t *pMsg)
+{
+ if (pMsg != NULL) {
+ /* TODO */
+
+ free(pMsg);
+ }
+}
+
+engine_controller_cancel_all_msg_t *engine_controller_msg_create_cancel_all_msg()
+{
+ engine_controller_cancel_all_msg_t *pCancel_all_msg = (engine_controller_cancel_all_msg_t *)calloc(1, sizeof(engine_controller_cancel_all_msg_t));
+ if (pCancel_all_msg == NULL) {
+ goto error_part;
+ }
+
+ engine_controller_msg_set_msg_head(&(pCancel_all_msg->msg_head), ENGINE_CONTROLLER_CANCEL_ALL_MSG_TYPE, 0);
+
+ return pCancel_all_msg;
+error_part:
+ engine_controller_msg_free_cancel_all_msg(pCancel_all_msg);
+ return NULL;
+}
+
+void engine_controller_msg_free_cancel_all_msg(engine_controller_cancel_all_msg_t *pCancel_all_msg)
+{
+ if (pCancel_all_msg != NULL) {
+ /* TODO */
+ }
+}
+
+engine_controller_cancel_msg_t *engine_controller_msg_create_cancel_msg(ec_uint request_msg_id_to_cancel)
+{
+ engine_controller_cancel_msg_t *pCancel_msg = (engine_controller_cancel_msg_t *)calloc(1, sizeof(engine_controller_cancel_msg_t));
+ if (pCancel_msg == NULL) {
+ goto error_part;
+ }
+
+ engine_controller_msg_set_msg_head(&(pCancel_msg->msg_head), ENGINE_CONTROLLER_CANCEL_MSG_TYPE, 0);
+ pCancel_msg->request_msg_id_to_cancel = request_msg_id_to_cancel;
+
+ return pCancel_msg;
+error_part:
+ engine_controller_msg_free_cancel_msg(pCancel_msg);
+ return NULL;
+}
+
+void engine_controller_msg_free_cancel_msg(engine_controller_cancel_msg_t *pCancel_msg)
+{
+ if (pCancel_msg != NULL) {
+ /* TODO */
+ }
+}
+
+ec_boolean engine_controller_msg_check_same_msg_type(engine_controller_msg_head_t *pHead, engine_controller_msg_type_t msg_type)
+{
+ if (pHead->msg_type == msg_type) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+ec_boolean engine_controller_msg_is_register_msg(engine_controller_msg_head_t *pHead)
+{
+ return engine_controller_msg_check_same_msg_type(pHead, ENGINE_CONTROLLER_REGISTER_MSG_TYPE);
+}
+
+ec_boolean engine_controller_msg_is_unregister_msg(engine_controller_msg_head_t *pHead)
+{
+ return engine_controller_msg_check_same_msg_type(pHead, ENGINE_CONTROLLER_UNREGISTER_MSG_TYPE);
+}
+
+ec_boolean engine_controller_msg_is_register_queuing_rule_spec_msg(engine_controller_msg_head_t *pHead)
+{
+ return engine_controller_msg_check_same_msg_type(pHead, ENGINE_CONTROLLER_REGISTER_QUEUING_RULE_SPEC_MSG_TYPE);
+}
+
+ec_boolean engine_controller_msg_is_request_msg(engine_controller_msg_head_t *pHead)
+{
+ return engine_controller_msg_check_same_msg_type(pHead, ENGINE_CONTROLLER_REQUEST_MSG_TYPE);
+}
+
+ec_boolean engine_controller_msg_is_cancel_msg(engine_controller_msg_head_t *pHead)
+{
+ return engine_controller_msg_check_same_msg_type(pHead, ENGINE_CONTROLLER_CANCEL_MSG_TYPE);
+}
+
+ec_boolean engine_controller_msg_is_cancel_all_msg(engine_controller_msg_head_t *pHead)
+{
+ return engine_controller_msg_check_same_msg_type(pHead, ENGINE_CONTROLLER_CANCEL_ALL_MSG_TYPE);
+}
diff --git a/framework/src/EngineController/graph_edge_pool.c b/framework/src/EngineController/graph_edge_pool.c
new file mode 100755
index 0000000..8947bd6
--- /dev/null
+++ b/framework/src/EngineController/graph_edge_pool.c
@@ -0,0 +1,110 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#include <assert.h> /* TODO : replace with framework assert */
+#include <glib.h>
+#include <stdlib.h>
+#include "EngineController/graph_edge_pool.h"
+#include "EngineController/hash_set.h"
+
+struct graph_edge_pool_s {
+ GHashTable *from_graph_node_hash; /* containing hash_set_t* to_graph_nodes */
+};
+
+graph_edge_pool_t *graph_edge_pool_new()
+{
+ graph_edge_pool_t *pPool = (graph_edge_pool_t *)calloc(1, sizeof(graph_edge_pool_t));
+ if (pPool == NULL) {
+ goto error_part;
+ }
+
+ pPool->from_graph_node_hash = g_hash_table_new(g_direct_hash, g_direct_equal);
+ if (pPool->from_graph_node_hash == NULL) {
+ goto error_part;
+ }
+
+ return pPool;
+
+error_part:
+ graph_edge_pool_free(pPool);
+ return NULL;
+}
+
+void graph_edge_pool_free(graph_edge_pool_t *pPool)
+{
+ if (pPool != NULL) {
+ if (pPool->from_graph_node_hash != NULL) {
+ g_hash_table_destroy(pPool->from_graph_node_hash);
+ }
+ free(pPool);
+ }
+}
+
+/* return add success or not */
+/* if already exist edge added, then return false */
+ec_boolean graph_edge_pool_add_edge(graph_edge_pool_t *pPool, ec_constpointer from_node, ec_constpointer to_node)
+{
+ ec_boolean add_success = false;
+ hash_set_t *pTo_node_set = NULL;
+
+ pTo_node_set = g_hash_table_lookup(pPool->from_graph_node_hash, from_node);
+ if (pTo_node_set == NULL) {
+ pTo_node_set = hash_set_create();
+ if (pTo_node_set == NULL) {
+ assert(false);
+ }
+ g_hash_table_insert(pPool->from_graph_node_hash, (gpointer) from_node, (gpointer) pTo_node_set);
+ }
+
+ add_success = hash_set_add(pTo_node_set, to_node);
+
+ return add_success;
+}
+
+GList *graph_edge_pool_query_to_node_list(graph_edge_pool_t *pPool, ec_constpointer from_node)
+{
+ GList *to_nodes_list = NULL;
+
+ hash_set_t *pTo_node_set = NULL;
+ pTo_node_set = g_hash_table_lookup(pPool->from_graph_node_hash, from_node);
+ if (pTo_node_set == NULL) {
+ goto return_part;
+ }
+
+ to_nodes_list = hash_set_get_element_list(pTo_node_set);
+
+return_part:
+ return to_nodes_list;
+}
diff --git a/framework/src/EngineController/hash_set.c b/framework/src/EngineController/hash_set.c
new file mode 100755
index 0000000..a0ea89e
--- /dev/null
+++ b/framework/src/EngineController/hash_set.c
@@ -0,0 +1,107 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "Utility/fw_log.h"
+#include "EngineController/hash_set.h"
+
+#define LOG_TAG "AF_EC"
+
+hash_set_t *hash_set_create()
+{
+ hash_set_t *pHash_set = (hash_set_t *)calloc(1, sizeof(hash_set_t));
+ if (pHash_set == NULL) {
+ goto error_part;
+ }
+
+ pHash_set->pHashTable = NULL;
+
+ return pHash_set;
+
+error_part:
+ return NULL;
+}
+
+void hash_set_free(hash_set_t *pHash_set)
+{
+ if (pHash_set != NULL) {
+ if (pHash_set->pHashTable != NULL) {
+ g_hash_table_destroy(pHash_set->pHashTable);
+ }
+
+ free(pHash_set);
+ }
+}
+
+ec_boolean hash_set_add(hash_set_t *pHash_set, ec_constpointer pElement)
+{
+ ec_boolean success = true;
+
+ if (pHash_set == NULL) {
+ FW_LOGE("pHash_set == NULL\n");
+ success = false;
+ goto return_part;
+ }
+
+ if (pHash_set->pHashTable == NULL) {
+ pHash_set->pHashTable = g_hash_table_new(g_direct_hash, g_direct_equal);
+ }
+
+ g_hash_table_insert(pHash_set->pHashTable, (gpointer) pElement, (gpointer) pElement);
+
+return_part:
+ return success;
+}
+
+GList *hash_set_get_element_list(hash_set_t *pHash_set)
+{
+ GList *element_list = NULL;
+ if (pHash_set == NULL) {
+ FW_LOGE("pHash_set == NULL\n");
+ goto error_part;
+ }
+
+ if (pHash_set->pHashTable != NULL) {
+ element_list = g_hash_table_get_values(pHash_set->pHashTable);
+ }
+ return element_list;
+
+error_part:
+ if (element_list != NULL) {
+ g_list_free(element_list);
+ }
+ return NULL;
+}
diff --git a/framework/src/EngineController/param.c b/framework/src/EngineController/param.c
new file mode 100755
index 0000000..17392ac
--- /dev/null
+++ b/framework/src/EngineController/param.c
@@ -0,0 +1,74 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "EngineController/param.h"
+#include "EngineController/param_spec_internal.h"
+
+param_t *param_alloc_param(ec_uint read_ref_count, ec_uint write_ref_count, param_spec *pParam_spec, param_value_t *pParam_value)
+{
+ param_t *pParam = (param_t *)calloc(1, sizeof(param_t));
+ if (pParam == NULL) {
+ goto error_part;
+ }
+
+ pParam->read_ref_count = read_ref_count;
+ pParam->write_ref_count = write_ref_count;
+ pParam->pParam_spec = param_spec_ref(pParam_spec);
+
+ if (pParam_value != NULL) {
+ param_value_set_value_with_other_param_value(&(pParam->param_value), pParam_value);
+ } else {
+ if (pParam_spec->flags & EC_PARAM_FLAG_INPUT) {
+ param_value_set_value_with_other_param_value(&(pParam->param_value), &(pParam_spec->default_value));
+ }
+ }
+
+ return pParam;
+error_part:
+ param_free_param(pParam);
+ return NULL;
+}
+
+void param_free_param(param_t *pParam)
+{
+ if (pParam != NULL) {
+ if (pParam->pParam_spec != NULL) {
+ param_spec_unref(pParam->pParam_spec);
+ }
+ free(pParam);
+ }
+}
diff --git a/framework/src/EngineController/param_spec.c b/framework/src/EngineController/param_spec.c
new file mode 100755
index 0000000..0fb1ac2
--- /dev/null
+++ b/framework/src/EngineController/param_spec.c
@@ -0,0 +1,560 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <assert.h> /* TODO : replace with fw_assert.h */
+#include <glib.h>
+#include "EngineController/param_spec.h"
+#include "EngineController/param_spec_internal.h"
+
+static inline ec_boolean is_flag_on(ECParamFlags flags, ECParamFlags check_flag);
+static inline void on_flag(ECParamFlags *flags, ECParamFlags on_flag);
+
+/* TODO */
+static void free_param_spec(param_spec *pParam_spec);
+
+/* internal */
+static ec_boolean param_char_validate_func(ec_int8 value, ec_int8 minimum, ec_int8 maximum);
+static ec_boolean param_uchar_validate_func(ec_uint8 value, ec_uint8 minimum, ec_uint8 maximum);
+static ec_boolean param_int_validate_func(ec_int value, ec_int minimum, ec_int maximum);
+static ec_boolean param_uint_validate_func(ec_uint value, ec_uint minimum, ec_uint maximum);
+static ec_boolean param_float_validate_func(ec_float value, ec_float minimum, ec_float maximum);
+static ec_boolean param_double_validate_func(ec_double value, ec_double minimum, ec_double maximum);
+
+static param_spec_char_validate *alloc_init_param_spec_char_validate(ec_int8 minimum, ec_int8 maximum, char_validate_func valid_func);
+static param_spec_uchar_validate *alloc_init_param_spec_uchar_validate(ec_uint8 minimum, ec_uint8 maximum, uchar_validate_func valid_func);
+static param_spec_int_validate *alloc_init_param_spec_int_validate(ec_int minimum, ec_int maximum, int_validate_func valid_func);
+static param_spec_uint_validate *alloc_init_param_spec_uint_validate(ec_uint minimum, ec_uint maximum, uint_validate_func valid_func);
+static param_spec_float_validate *alloc_init_param_spec_float_validate(ec_float minimum, ec_float maximum, float_validate_func valid_func);
+static param_spec_double_validate *alloc_init_param_spec_double_validate(ec_double minimum, ec_double maximum, double_validate_func valid_func);
+
+static ec_boolean alloc_and_init_param_spec_number_type_validate(const ECValueType value_type, ec_constpointer minimum, ec_constpointer maximum, private_validate *pPrivate_validate);
+
+static param_spec *alloc_and_init_param_spec_default(const ECValueType value_type, const ec_char *name);
+
+static param_spec *alloc_and_init_param_spec_number_type(const ECValueType value_type, const ec_char *name, ec_boolean is_input, ec_boolean is_output, ec_boolean input_validate_on, ec_constpointer input_minimum, ec_constpointer input_maximum, ec_boolean input_default_on, ec_constpointer input_default_value, ec_boolean output_validate_on, ec_constpointer output_minimum, ec_constpointer output_maximum);
+
+static inline param_spec *alloc_and_init_param_spec_struct_type(const ec_char *name, ec_boolean is_input, ec_boolean is_output, ec_boolean input_validate_on, validate_struct_func_callback input_val_func, ec_boolean input_default_on, ec_constpointer input_default_value, ec_boolean output_validate_on, validate_struct_func_callback output_val_func, copy_struct_func_callback copy_func, free_struct_func_callback free_func);
+
+static ec_boolean param_char_validate_func(ec_int8 value, ec_int8 minimum, ec_int8 maximum)
+{
+ if (value < minimum)
+ return false;
+ if (value > maximum)
+ return false;
+ return true;
+}
+
+static ec_boolean param_uchar_validate_func(ec_uint8 value, ec_uint8 minimum, ec_uint8 maximum)
+{
+ if (value < minimum)
+ return false;
+ if (value > maximum)
+ return false;
+ return true;
+}
+
+static ec_boolean param_int_validate_func(ec_int value, ec_int minimum, ec_int maximum)
+{
+ if (value < minimum)
+ return false;
+ if (value > maximum)
+ return false;
+ return true;
+}
+
+static ec_boolean param_uint_validate_func(ec_uint value, ec_uint minimum, ec_uint maximum)
+{
+ if (value < minimum)
+ return false;
+ if (value > maximum)
+ return false;
+ return true;
+}
+
+static ec_boolean param_float_validate_func(ec_float value, ec_float minimum, ec_float maximum)
+{
+ if (value < minimum)
+ return false;
+ if (value > maximum)
+ return false;
+ return true;
+}
+
+static ec_boolean param_double_validate_func(ec_double value, ec_double minimum, ec_double maximum)
+{
+ if (value < minimum)
+ return false;
+ if (value > maximum)
+ return false;
+ return true;
+}
+
+static param_spec_char_validate *alloc_init_param_spec_char_validate(ec_int8 minimum, ec_int8 maximum, char_validate_func valid_func)
+{
+ param_spec_char_validate *pValid = (param_spec_char_validate *) malloc(sizeof(param_spec_char_validate));
+ if (pValid == NULL) {
+ return NULL;
+ }
+
+ pValid->minimum = minimum;
+ pValid->maximum = maximum;
+ pValid->valid_func = valid_func;
+
+ return pValid;
+}
+
+static param_spec_uchar_validate *alloc_init_param_spec_uchar_validate(ec_uint8 minimum, ec_uint8 maximum, uchar_validate_func valid_func)
+{
+ param_spec_uchar_validate *pValid = (param_spec_uchar_validate *) malloc(sizeof(param_spec_uchar_validate));
+ if (pValid == NULL) {
+ return NULL;
+ }
+
+ pValid->minimum = minimum;
+ pValid->maximum = maximum;
+ pValid->valid_func = valid_func;
+
+ return pValid;
+}
+
+static param_spec_int_validate *alloc_init_param_spec_int_validate(ec_int minimum, ec_int maximum, int_validate_func valid_func)
+{
+ param_spec_int_validate *pValid = (param_spec_int_validate *) malloc(sizeof(param_spec_int_validate));
+ if (pValid == NULL) {
+ return NULL;
+ }
+
+ pValid->minimum = minimum;
+ pValid->maximum = maximum;
+ pValid->valid_func = valid_func;
+
+ return pValid;
+}
+
+static param_spec_uint_validate *alloc_init_param_spec_uint_validate(ec_uint minimum, ec_uint maximum, uint_validate_func valid_func)
+{
+ param_spec_uint_validate *pValid = (param_spec_uint_validate *) malloc(sizeof(param_spec_uint_validate));
+ if (pValid == NULL) {
+ return NULL;
+ }
+
+ pValid->minimum = minimum;
+ pValid->maximum = maximum;
+ pValid->valid_func = valid_func;
+
+ return pValid;
+}
+
+static param_spec_float_validate *alloc_init_param_spec_float_validate(ec_float minimum, ec_float maximum, float_validate_func valid_func)
+{
+ param_spec_float_validate *pValid = (param_spec_float_validate *) malloc(sizeof(param_spec_float_validate));
+ if (pValid == NULL) {
+ return NULL;
+ }
+
+ pValid->minimum = minimum;
+ pValid->maximum = maximum;
+ pValid->valid_func = valid_func;
+
+ return pValid;
+}
+
+static param_spec_double_validate *alloc_init_param_spec_double_validate(ec_double minimum, ec_double maximum, double_validate_func valid_func)
+{
+ param_spec_double_validate *pValid = (param_spec_double_validate *) malloc(sizeof(param_spec_double_validate));
+ if (pValid == NULL) {
+ return NULL;
+ }
+
+ pValid->minimum = minimum;
+ pValid->maximum = maximum;
+ pValid->valid_func = valid_func;
+
+ return pValid;
+}
+
+static param_spec *alloc_and_init_param_spec_default(const ECValueType value_type, const ec_char *name)
+{
+ param_spec *pParam_spec = (param_spec *)calloc(1, sizeof(param_spec));
+ if (pParam_spec == NULL) {
+ return NULL;
+ }
+
+ ec_char *dup_name = strdup(name);
+ if (dup_name == NULL) {
+ free_param_spec(pParam_spec);
+ return NULL;
+ }
+
+ pParam_spec->ref_count = 1;
+ pParam_spec->value_type = value_type;
+ pParam_spec->name = dup_name;
+ pParam_spec->flags = EC_PARAM_FLAG_DEFAULT;
+
+ return pParam_spec;
+}
+
+static ec_boolean alloc_and_init_param_spec_number_type_validate(const ECValueType value_type, ec_constpointer minimum, ec_constpointer maximum, private_validate *pPrivate_validate)
+{
+ ec_boolean success = false;
+ switch (value_type) {
+ case EC_VALUE_TYPE_CHAR:
+ {
+ param_spec_char_validate *pValid = alloc_init_param_spec_char_validate(*(ec_int8 *) minimum, *(ec_int8 *) maximum, param_char_validate_func);
+ if (pValid == NULL) {
+ goto return_part;
+ }
+ pPrivate_validate->char_validate = pValid;
+ }
+ break;
+ case EC_VALUE_TYPE_UCHAR:
+ {
+ param_spec_uchar_validate *pValid = alloc_init_param_spec_uchar_validate(*(ec_uint8 *) minimum, *(ec_uint8 *) maximum, param_uchar_validate_func);
+ if (pValid == NULL) {
+ goto return_part;
+ }
+ pPrivate_validate->uchar_validate = pValid;
+ }
+ break;
+ case EC_VALUE_TYPE_INT:
+ {
+ param_spec_int_validate *pValid = alloc_init_param_spec_int_validate(*(ec_int *)minimum, *(ec_int *)maximum, param_int_validate_func);
+ if (pValid == NULL) {
+ goto return_part;
+ }
+ pPrivate_validate->int_validate = pValid;
+ }
+ break;
+ case EC_VALUE_TYPE_UINT:
+ {
+ param_spec_uint_validate *pValid = alloc_init_param_spec_uint_validate(*(ec_uint *)minimum, *(ec_uint *)maximum, param_uint_validate_func);
+ if (pValid == NULL) {
+ goto return_part;
+ }
+ pPrivate_validate->uint_validate = pValid;
+ }
+ break;
+ case EC_VALUE_TYPE_FLOAT:
+ {
+ param_spec_float_validate *pValid = alloc_init_param_spec_float_validate(*(ec_float *) minimum, *(ec_float *) maximum, param_float_validate_func);
+ if (pValid == NULL) {
+ goto return_part;
+ }
+ pPrivate_validate->float_validate = pValid;
+ }
+ break;
+ case EC_VALUE_TYPE_DOUBLE:
+ {
+ param_spec_double_validate *pValid = alloc_init_param_spec_double_validate(*(ec_double *) minimum, *(ec_double *) maximum, param_double_validate_func);
+ if (pValid == NULL) {
+ goto return_part;
+ }
+ pPrivate_validate->double_validate = pValid;
+ }
+ break;
+ default:
+ assert(false);
+ }
+
+ success = true;
+
+return_part:
+ return success;
+}
+
+static param_spec *alloc_and_init_param_spec_number_type(const ECValueType value_type, const ec_char *name, ec_boolean is_input, ec_boolean is_output, ec_boolean input_validate_on, ec_constpointer input_minimum, ec_constpointer input_maximum, ec_boolean input_default_on, ec_constpointer input_default_value, ec_boolean output_validate_on, ec_constpointer output_minimum, ec_constpointer output_maximum)
+{
+ ec_boolean success = true;
+ param_spec *pParam_spec = alloc_and_init_param_spec_default(value_type, name);
+ if (pParam_spec == NULL) {
+ goto error_part;
+ }
+
+ if (is_input) {
+ on_flag(&(pParam_spec->flags), EC_PARAM_FLAG_INPUT);
+
+ if (input_validate_on) {
+ on_flag(&(pParam_spec->flags), EC_PARAM_FLAG_INPUT_VALIDATE_ON);
+ success = alloc_and_init_param_spec_number_type_validate(value_type, input_minimum, input_maximum, &(pParam_spec->input_validate));
+ if (!success) {
+ goto error_part;
+ }
+ }
+
+ if (input_default_on) {
+ on_flag(&(pParam_spec->flags), EC_PARAM_FLAG_INPUT_DEFAULT_VALUE_ON);
+ param_value_set_value(&(pParam_spec->default_value), value_type, input_default_value);
+ }
+ }
+
+ if (is_output) {
+ on_flag(&(pParam_spec->flags), EC_PARAM_FLAG_OUTPUT);
+ success = alloc_and_init_param_spec_number_type_validate(value_type, output_minimum, output_maximum, &(pParam_spec->output_validate));
+ }
+
+ return pParam_spec;
+
+error_part:
+ free_param_spec(pParam_spec);
+ return NULL;
+}
+
+static inline param_spec *alloc_and_init_param_spec_struct_type(const ec_char *name, ec_boolean is_input, ec_boolean is_output, ec_boolean input_validate_on, validate_struct_func_callback input_val_func, ec_boolean input_default_on, ec_constpointer input_default_value, ec_boolean output_validate_on, validate_struct_func_callback output_val_func, copy_struct_func_callback copy_func, free_struct_func_callback free_func)
+{
+ ec_boolean success = true;
+ param_spec *pParam_spec = alloc_and_init_param_spec_default(EC_VALUE_TYPE_STRUCT, name);
+ if (pParam_spec == NULL) {
+ goto error_part;
+ }
+
+ if (is_input) {
+ on_flag(&(pParam_spec->flags), EC_PARAM_FLAG_INPUT);
+
+ if (input_validate_on) {
+ on_flag(&(pParam_spec->flags), EC_PARAM_FLAG_INPUT_VALIDATE_ON);
+ pParam_spec->input_validate.struct_validate_func = input_val_func;
+
+ if (!success) {
+ goto error_part;
+ }
+ }
+
+ if (input_default_on) {
+ on_flag(&(pParam_spec->flags), EC_PARAM_FLAG_INPUT_DEFAULT_VALUE_ON);
+ param_value_set_value(&(pParam_spec->default_value), EC_VALUE_TYPE_STRUCT, input_default_value);
+ }
+ }
+
+ if (is_output) {
+ on_flag(&(pParam_spec->flags), EC_PARAM_FLAG_OUTPUT);
+ pParam_spec->output_validate.struct_validate_func = output_val_func;
+ }
+
+ pParam_spec->copy_struct_func = copy_func;
+ pParam_spec->free_struct_func = free_func;
+
+ return pParam_spec;
+
+error_part:
+ free_param_spec(pParam_spec);
+ return NULL;
+}
+
+inline ec_boolean is_input_flag_on(ECParamFlags flags)
+{
+ return is_flag_on(flags, EC_PARAM_FLAG_INPUT);
+}
+
+inline ec_boolean is_output_flag_on(ECParamFlags flags)
+{
+ return is_flag_on(flags, EC_PARAM_FLAG_OUTPUT);
+}
+
+inline ec_boolean is_input_validate_on_flag_on(ECParamFlags flags)
+{
+ return is_flag_on(flags, EC_PARAM_FLAG_INPUT_VALIDATE_ON);
+}
+
+inline ec_boolean is_output_validate_on_flag_on(ECParamFlags flags)
+{
+ return is_flag_on(flags, EC_PARAM_FLAG_OUTPUT_VALIDATE_ON);
+}
+
+inline ec_boolean is_input_default_value_on_flag_on(ECParamFlags flags)
+{
+ return is_flag_on(flags, EC_PARAM_FLAG_INPUT_DEFAULT_VALUE_ON);
+}
+
+inline ec_boolean is_flag_on(ECParamFlags flags, ECParamFlags check_flag)
+{
+ return (flags & check_flag);
+}
+
+static inline void on_flag(ECParamFlags *flags, ECParamFlags on_flag)
+{
+ *flags |= on_flag;
+}
+
+static void free_param_spec(param_spec *pParam_spec)
+{
+ if (pParam_spec != NULL) {
+ if (pParam_spec->name != NULL) {
+ free(pParam_spec->name);
+ }
+
+ /* note : don't free pParam_spec->pTask */
+
+ /* TODO : free other element */
+ free(pParam_spec);
+ }
+}
+
+/* external */
+param_spec *param_spec_ref(param_spec *pParam_spec)
+{
+ if (pParam_spec == NULL) {
+ return NULL;
+ }
+
+ g_atomic_int_inc(&(pParam_spec->ref_count));
+
+ return pParam_spec;
+}
+
+void param_spec_unref(param_spec *pParam_spec)
+{
+ if (pParam_spec == NULL) {
+ return;
+ }
+
+ if (g_atomic_int_dec_and_test(&(pParam_spec->ref_count))) {
+ free_param_spec(pParam_spec);
+ }
+}
+
+param_spec *param_spec_boolean(const ec_char *name, ec_boolean is_input, ec_boolean is_output, ec_boolean input_default_on, ec_boolean input_default_value)
+{
+ ECValueType value_type = EC_VALUE_TYPE_BOOLEAN;
+ param_spec *pParam_spec = alloc_and_init_param_spec_default(value_type, name);
+ if (pParam_spec == NULL) {
+ goto error_part;
+ }
+
+ if (is_input) {
+ on_flag(&(pParam_spec->flags), EC_PARAM_FLAG_INPUT);
+
+ if (input_default_on) {
+ on_flag(&(pParam_spec->flags), EC_PARAM_FLAG_INPUT_DEFAULT_VALUE_ON);
+ param_value_set_value(&(pParam_spec->default_value), value_type, &input_default_value);
+ }
+ }
+
+ if (is_output) {
+ on_flag(&(pParam_spec->flags), EC_PARAM_FLAG_OUTPUT);
+ }
+
+ return pParam_spec;
+
+error_part:
+ free_param_spec(pParam_spec);
+ return NULL;
+}
+
+param_spec *param_spec_char(const ec_char *name, ec_boolean is_input, ec_boolean is_output, ec_boolean input_validate_on, ec_int8 input_minimum, ec_int8 input_maximum, ec_boolean input_default_on, ec_int8 input_default_value, ec_boolean output_validate_on, ec_int8 output_minimum, ec_int8 output_maximum)
+{
+ param_spec *pParam_spec = alloc_and_init_param_spec_number_type(EC_VALUE_TYPE_CHAR, name,
+ is_input, is_output,
+ input_validate_on, &input_minimum, &input_maximum,
+ input_default_on, &input_default_value,
+ output_validate_on, &output_minimum, &output_maximum);
+ return pParam_spec;
+}
+
+param_spec *param_spec_uchar(const ec_char *name, ec_boolean is_input, ec_boolean is_output, ec_boolean input_validate_on, ec_uint8 input_minimum, ec_uint8 input_maximum, ec_boolean input_default_on, ec_uint8 input_default_value, ec_boolean output_validate_on, ec_uint8 output_minimum, ec_uint8 output_maximum)
+{
+ param_spec *pParam_spec = alloc_and_init_param_spec_number_type(EC_VALUE_TYPE_UCHAR, name,
+ is_input, is_output,
+ input_validate_on, &input_minimum, &input_maximum,
+ input_default_on, &input_default_value,
+ output_validate_on, &output_minimum, &output_maximum);
+ return pParam_spec;
+}
+
+param_spec *param_spec_int(const ec_char *name, ec_boolean is_input, ec_boolean is_output, ec_boolean input_validate_on, ec_int input_minimum, ec_int input_maximum, ec_boolean input_default_on, ec_int input_default_value, ec_boolean output_validate_on, ec_int output_minimum, ec_int output_maximum)
+{
+ param_spec *pParam_spec = alloc_and_init_param_spec_number_type(EC_VALUE_TYPE_INT, name,
+ is_input, is_output,
+ input_validate_on, &input_minimum, &input_maximum,
+ input_default_on, &input_default_value,
+ output_validate_on, &output_minimum, &output_maximum);
+ return pParam_spec;
+}
+
+param_spec *param_spec_uint(const ec_char *name, ec_boolean is_input, ec_boolean is_output, ec_boolean input_validate_on, ec_uint input_minimum, ec_uint input_maximum, ec_boolean input_default_on, ec_uint input_default_value, ec_boolean output_validate_on, ec_uint output_minimum, ec_uint output_maximum)
+{
+ param_spec *pParam_spec = alloc_and_init_param_spec_number_type(EC_VALUE_TYPE_UINT, name,
+ is_input, is_output,
+ input_validate_on, &input_minimum, &input_maximum,
+ input_default_on, &input_default_value,
+ output_validate_on, &output_minimum, &output_maximum);
+ return pParam_spec;
+}
+
+param_spec *param_spec_float(const ec_char *name, ec_boolean is_input, ec_boolean is_output, ec_boolean input_validate_on, ec_float input_minimum, ec_float input_maximum, ec_boolean input_default_on, ec_float input_default_value, ec_boolean output_validate_on, ec_float output_minimum, ec_float output_maximum)
+{
+ param_spec *pParam_spec = alloc_and_init_param_spec_number_type(EC_VALUE_TYPE_FLOAT, name,
+ is_input, is_output,
+ input_validate_on, &input_minimum, &input_maximum,
+ input_default_on, &input_default_value,
+ output_validate_on, &output_minimum, &output_maximum);
+ return pParam_spec;
+}
+
+param_spec *param_spec_double(const ec_char *name, ec_boolean is_input, ec_boolean is_output, ec_boolean input_validate_on, ec_double input_minimum, ec_double input_maximum, ec_boolean input_default_on, ec_double input_default_value, ec_boolean output_validate_on, ec_double output_minimum, ec_double output_maximum)
+{
+ param_spec *pParam_spec = alloc_and_init_param_spec_number_type(EC_VALUE_TYPE_DOUBLE, name,
+ is_input, is_output,
+ input_validate_on, &input_minimum, &input_maximum,
+ input_default_on, &input_default_value,
+ output_validate_on, &output_minimum, &output_maximum);
+ return pParam_spec;
+}
+
+param_spec *param_spec_structure(const ec_char *name, copy_struct_func_callback copy_func, free_struct_func_callback free_func, ec_boolean is_input, ec_boolean is_output, ec_boolean input_validate_on, validate_struct_func_callback in_val_func, ec_boolean input_default_on, ec_pointer pDefault_Struct, ec_boolean output_validate_on, validate_struct_func_callback out_val_func)
+{
+ return alloc_and_init_param_spec_struct_type(name, is_input, is_output, input_validate_on, in_val_func, input_default_on, pDefault_Struct, output_validate_on, out_val_func, copy_func, free_func);
+}
+
+const ECValueType param_spec_get_value_type(param_spec *pParam_spec)
+{
+ if (pParam_spec == NULL) {
+ return EC_VALUE_TYPE_UNKNOWN;
+ }
+
+ return pParam_spec->value_type;
+}
+
+const ec_char *param_spec_get_name(param_spec *pParam_spec)
+{
+ if (pParam_spec == NULL) {
+ return NULL;
+ }
+
+ return pParam_spec->name;
+}
diff --git a/framework/src/EngineController/param_value.c b/framework/src/EngineController/param_value.c
new file mode 100755
index 0000000..467fd80
--- /dev/null
+++ b/framework/src/EngineController/param_value.c
@@ -0,0 +1,112 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include "EngineController/param_value.h"
+
+void param_value_set_value(param_value_t *pParam_value, ECValueType value_type, ec_constpointer pValue)
+{
+ if (pValue != NULL) {
+ switch (value_type) {
+ case EC_VALUE_TYPE_BOOLEAN:
+ pParam_value->boolean_value = *(ec_boolean *) pValue;
+ break;
+ case EC_VALUE_TYPE_CHAR:
+ pParam_value->char_value = *(ec_char *)pValue;
+ break;
+ case EC_VALUE_TYPE_UCHAR:
+ pParam_value->uchar_value = *(ec_uchar *) pValue;
+ break;
+ case EC_VALUE_TYPE_INT:
+ pParam_value->int_value = *(ec_int *)pValue;
+ break;
+ case EC_VALUE_TYPE_UINT:
+ pParam_value->uint_value = *(ec_uint *)pValue;
+ break;
+ case EC_VALUE_TYPE_FLOAT:
+ pParam_value->float_value = *(ec_float *) pValue;
+ break;
+ case EC_VALUE_TYPE_DOUBLE:
+ pParam_value->double_value = *(ec_double *) pValue;
+ break;
+ case EC_VALUE_TYPE_STRUCT:
+ pParam_value->pointer_value = *(ec_pointer *) pValue;
+ break;
+ default:
+ assert(false);
+ }
+ }
+}
+
+void param_value_set_value_with_other_param_value(param_value_t *pDest_param_value, param_value_t *pSrc_param_value)
+{
+ memcpy(pDest_param_value, pSrc_param_value, sizeof(param_value_t));
+}
+
+void param_value_get_value(param_value_t *pParam_value, ECValueType value_type, ec_pointer pValue)
+{
+ if (pValue != NULL) {
+ switch (value_type) {
+ case EC_VALUE_TYPE_BOOLEAN:
+ *(ec_boolean *) pValue = pParam_value->boolean_value;
+ break;
+ case EC_VALUE_TYPE_CHAR:
+ *(ec_char *)pValue = pParam_value->char_value;
+ break;
+ case EC_VALUE_TYPE_UCHAR:
+ *(ec_uchar *) pValue = pParam_value->uchar_value;
+ break;
+ case EC_VALUE_TYPE_INT:
+ *(ec_int *)pValue = pParam_value->int_value;
+ break;
+ case EC_VALUE_TYPE_UINT:
+ *(ec_uint *)pValue = pParam_value->uint_value;
+ break;
+ case EC_VALUE_TYPE_FLOAT:
+ *(ec_float *) pValue = pParam_value->float_value;
+ break;
+ case EC_VALUE_TYPE_DOUBLE:
+ *(ec_double *) pValue = pParam_value->double_value;
+ break;
+ case EC_VALUE_TYPE_STRUCT:
+ *(ec_pointer *) pValue = pParam_value->pointer_value;
+ break;
+ default:
+ assert(false);
+ }
+ }
+}
diff --git a/framework/src/EngineController/queuing_rule_spec.c b/framework/src/EngineController/queuing_rule_spec.c
new file mode 100755
index 0000000..37cdd38
--- /dev/null
+++ b/framework/src/EngineController/queuing_rule_spec.c
@@ -0,0 +1,647 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <glib.h>
+#include "Utility/fw_assert.h"
+#include "Utility/fw_log.h"
+#include "EngineController/queuing_rule_spec.h"
+#include "EngineController/queuing_rule_spec_internal.h"
+#include "EngineController/task_spec_internal.h"
+#include "EngineController/task.h"
+#include "EngineController/task_message.h"
+#include "EngineController/engine_controller_internal.h"
+
+#define LOG_TAG "AF_EC"
+
+static progress_blocking_entity_t *__queuing_rule_spec_get_progress_blocking_entity(queuing_rule_spec_t *pRule, ec_uint root_task_spec_id)
+{
+ GSList *iter = NULL;
+ progress_blocking_entity_t *pEntity = NULL;
+ for (iter = pRule->progress_blocking_entity_list; iter != NULL; iter = g_slist_next(iter)) {
+ pEntity = (progress_blocking_entity_t *)(iter->data);
+ if (pEntity->root_task_spec_id == root_task_spec_id) {
+ return pEntity;
+ }
+ }
+
+ return NULL;
+}
+
+static ec_boolean queuing_rule_spec_is_valid_child_path(task_spec_t *pRoot_task_spec, ec_uint child_depth, va_list ap)
+{
+ ec_uint i = 0;
+ ec_boolean is_dynamic = false;
+ ec_int dynamic_case = 0;
+ ec_int child_index = 0;
+
+ task_spec_t *pParent_task_spec = pRoot_task_spec;
+ ec_boolean parent_is_dynamic = false;
+ task_spec_t *pChild_task_spec = NULL;
+
+ for (i = 0; i < child_depth; i++) {
+ is_dynamic = va_arg(ap, ec_boolean);
+ dynamic_case = va_arg(ap, ec_int);
+ child_index = va_arg(ap, ec_int);
+
+ /* not container or dynamic container case */
+ if (task_spec_is_simple_task_spec(pParent_task_spec)) {
+ return false;
+ }
+
+ /* check dynamic equality */
+ parent_is_dynamic = task_spec_is_dynamic_container_task_spec(pParent_task_spec);
+ if ((is_dynamic && !parent_is_dynamic) || (!is_dynamic && parent_is_dynamic)) {
+ return false;
+ }
+
+ if (is_dynamic) {
+ if (ENGINE_CONTROLLER_OK != task_spec_valididate_child_task_index_on_dynamic_case(dynamic_case, pParent_task_spec, child_index)) {
+ return false;
+ }
+ pChild_task_spec = task_spec_get_child_task_spec_on_dynamic_case(dynamic_case, pParent_task_spec, child_index);
+ } else {
+ if (ENGINE_CONTROLLER_OK != task_spec_valididate_child_task_index(pParent_task_spec, child_index)) {
+ return false;
+ }
+ pChild_task_spec = task_spec_get_child_task_spec(pParent_task_spec, child_index);
+ }
+
+ fw_assert_condition(pChild_task_spec != NULL, "valid child but can task_spec_get_child_task_spec or task_spec_get_child_task_spec_on_dynamic_case return NULL\n");
+
+ pParent_task_spec = pChild_task_spec;
+ }
+
+ return true;
+}
+
+static void queuing_rule_spec_free_queuing_rule_spec(queuing_rule_spec_t *pRule)
+{
+ if (pRule != NULL) {
+ if (pRule->name != NULL) {
+ free(pRule->name);
+ }
+
+ if (pRule->progress_blocking_entity_list != NULL) {
+ GSList *iter = NULL;
+ progress_blocking_entity_t *pEntity = NULL;
+ for (iter = pRule->progress_blocking_entity_list; iter != NULL; iter = g_slist_next(iter)) {
+ pEntity = (progress_blocking_entity_t *)(iter->data);
+ progress_blocking_entity_free(pEntity);
+ }
+
+ g_slist_free(pRule->progress_blocking_entity_list);
+ }
+
+ if (pRule->progress_blocking_queue != NULL) {
+ g_queue_free(pRule->progress_blocking_queue);
+ }
+
+ free(pRule);
+ }
+}
+
+/* implementation of queuing_rule_spec_internal.h */
+
+n_ary_tree_node_with_flag_t *n_ary_tree_node_with_flag_new(ec_boolean blocking_flag, ec_uint tree_level, ec_boolean is_dynamic_child, ec_int dynamic_case, ec_uint child_index)
+{
+ n_ary_tree_node_with_flag_t *node = (n_ary_tree_node_with_flag_t *)malloc(sizeof(n_ary_tree_node_with_flag_t));
+ if (node == NULL) {
+ goto error_part;
+ }
+
+ node->blocking_flag = blocking_flag;
+
+ node->tree_level = tree_level;
+ node->is_dynamic_child = is_dynamic_child;
+ node->dynamic_case = dynamic_case;
+ node->child_index = child_index;
+
+ node->parent_node = NULL;
+ node->first_child_node = NULL;
+ node->next_sibling_node = NULL;
+ node->prev_sibling_node = NULL;
+
+ return node;
+
+error_part:
+ n_ary_tree_node_with_flag_free_1(node);
+ return NULL;
+}
+
+void n_ary_tree_node_with_flag_free_1(n_ary_tree_node_with_flag_t *node)
+{
+ if (node != NULL) {
+ free(node);
+ }
+}
+
+void n_ary_tree_node_with_flag_free_subtree(n_ary_tree_node_with_flag_t *node)
+{
+ if (node->parent_node != NULL) {
+ n_ary_tree_node_with_flag_unlink_child_node(node->parent_node, node);
+ }
+
+ /* destroy all children without using recursive call */
+ n_ary_tree_node_with_flag_t *current_node = node;
+ n_ary_tree_node_with_flag_t *previous_node = NULL;
+
+ ec_boolean end_of_walk = false;
+ ec_boolean has_to_check_child = true;
+ while (!end_of_walk) {
+ previous_node = current_node;
+ if (has_to_check_child) {
+ if (current_node->first_child_node == NULL) {
+ if (current_node->next_sibling_node == NULL) {
+ current_node = current_node->parent_node;
+ has_to_check_child = false;
+ } else {
+ current_node = current_node->next_sibling_node;
+ has_to_check_child = true;
+ }
+ n_ary_tree_node_with_flag_free_1(previous_node);
+ } else {
+ /* goto leaf node step by step */
+ current_node = current_node->first_child_node;
+
+ /* note that we do not free prev node in this case */
+ }
+ } else {
+ if (current_node->next_sibling_node == NULL) {
+ current_node = current_node->parent_node;
+ } else {
+ /* goto next sibling since all children of current node are freed */
+ current_node = current_node->next_sibling_node;
+ has_to_check_child = true;
+ }
+ n_ary_tree_node_with_flag_free_1(previous_node);
+ }
+
+ if (current_node == NULL) {
+ end_of_walk = true;
+ }
+ }
+}
+
+ec_uint n_ary_tree_node_with_flag_count_subtree_flag_on_number(n_ary_tree_node_with_flag_t *node)
+{
+ ec_uint count_flag_on = 0;
+
+ /* visit all children to count flag on number without using recursive call */
+ n_ary_tree_node_with_flag_t *current_node = node;
+ n_ary_tree_node_with_flag_t *previous_node = NULL;
+
+ ec_boolean end_of_walk = false;
+ ec_boolean has_to_check_child = true;
+ while (!end_of_walk) {
+ previous_node = current_node;
+ if (has_to_check_child) {
+ if (current_node->first_child_node == NULL) {
+ /* set next current node */
+ if (current_node->next_sibling_node == NULL) {
+ current_node = current_node->parent_node;
+ has_to_check_child = false;
+ } else {
+ current_node = current_node->next_sibling_node;
+ has_to_check_child = true;
+ }
+
+ if (n_ary_tree_node_with_flag_is_blocking_flag_on(previous_node)) {
+ count_flag_on++;
+ }
+ } else {
+ /* goto leaf node step by step */
+ current_node = current_node->first_child_node;
+
+ /* note that we do not free prev node in this case */
+ }
+ } else {
+ if (current_node->next_sibling_node == NULL) {
+ current_node = current_node->parent_node;
+ } else {
+ /* goto next sibling since all children of current node are freed */
+ current_node = current_node->next_sibling_node;
+ has_to_check_child = true;
+ }
+
+ if (n_ary_tree_node_with_flag_is_blocking_flag_on(previous_node)) {
+ count_flag_on++;
+ }
+ }
+
+ if (current_node == node->parent_node || current_node == node->next_sibling_node) {
+ end_of_walk = true;
+ }
+ }
+
+ return count_flag_on;
+}
+
+void n_ary_tree_node_with_flag_set_blocking_flag_on(n_ary_tree_node_with_flag_t *node)
+{
+ node->blocking_flag = true;
+}
+
+ec_boolean n_ary_tree_node_with_flag_is_blocking_flag_on(n_ary_tree_node_with_flag_t *node)
+{
+ return node->blocking_flag;
+}
+
+ec_boolean n_ary_tree_node_with_flag_has_same_content_without_blocking_flag(n_ary_tree_node_with_flag_t *node, ec_uint tree_level, ec_boolean is_dynamic_child, ec_int dynamic_case, ec_uint child_index)
+{
+ if (node->tree_level == tree_level && node->is_dynamic_child == is_dynamic_child) {
+ if (is_dynamic_child) {
+ if (node->dynamic_case == dynamic_case && node->child_index == child_index) {
+ return true;
+ }
+ } else {
+ if (node->child_index == child_index) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+n_ary_tree_node_with_flag_t *n_ary_tree_node_with_flag_add_child_node(n_ary_tree_node_with_flag_t *parent_node, ec_boolean blocking_flag, ec_boolean is_dynamic_child, ec_int dynamic_case, ec_uint child_index)
+{
+ n_ary_tree_node_with_flag_t *child_node = n_ary_tree_node_with_flag_new(blocking_flag, parent_node->tree_level + 1,
+ is_dynamic_child, dynamic_case, child_index);
+ if (child_node == NULL) {
+ return NULL;
+ }
+
+ n_ary_tree_node_with_flag_link_child_node(parent_node, child_node);
+ return child_node;
+}
+
+void n_ary_tree_node_with_flag_link_child_node(n_ary_tree_node_with_flag_t *parent_node, n_ary_tree_node_with_flag_t *child_node)
+{
+ /* set parent */
+ child_node->parent_node = parent_node;
+
+ /* set child */
+ if (parent_node->first_child_node != NULL) {
+ parent_node->first_child_node->prev_sibling_node = child_node;
+ }
+ child_node->next_sibling_node = parent_node->first_child_node;
+ parent_node->first_child_node = child_node;
+}
+
+void n_ary_tree_node_with_flag_unlink_child_node(n_ary_tree_node_with_flag_t *parent_node, n_ary_tree_node_with_flag_t *child_node)
+{
+ if (parent_node == NULL) {
+ return;
+ }
+
+ if (parent_node->first_child_node == child_node) {
+ parent_node->first_child_node = child_node->next_sibling_node;
+ }
+
+ child_node->parent_node = NULL;
+
+ /* unlink sibling list */
+ if (child_node->prev_sibling_node != NULL) {
+ child_node->prev_sibling_node->next_sibling_node = child_node->next_sibling_node;
+ }
+ if (child_node->next_sibling_node != NULL) {
+ child_node->next_sibling_node->prev_sibling_node = child_node->prev_sibling_node;
+ }
+}
+
+n_ary_tree_node_with_flag_t *n_ary_tree_node_with_flag_get_child_node(n_ary_tree_node_with_flag_t *parent_node, ec_boolean is_dynamic_child, ec_int dynamic_case, ec_uint child_index)
+{
+ n_ary_tree_node_with_flag_t *child_node = NULL;
+ for (child_node = parent_node->first_child_node; child_node != NULL; child_node = child_node->next_sibling_node) {
+ if (n_ary_tree_node_with_flag_has_same_content_without_blocking_flag(child_node, parent_node->tree_level + 1, is_dynamic_child, dynamic_case, child_index)) {
+ break;
+ }
+ }
+
+ return child_node;
+}
+
+progress_blocking_element_set_t *progress_blocking_element_set_new()
+{
+ progress_blocking_element_set_t *pSet = (progress_blocking_element_set_t *)calloc(1, sizeof(progress_blocking_element_set_t));
+ if (pSet == NULL) {
+ goto error_part;
+ }
+
+ pSet->progress_blocking_element_cnt = 0;
+ pSet->n_ary_tree_with_flag = n_ary_tree_node_with_flag_new(false, 0, 0, 0, 0); /* set root node */
+ if (pSet->n_ary_tree_with_flag == NULL) {
+ goto error_part;
+ }
+
+ return pSet;
+
+error_part:
+ progress_blocking_element_set_free(pSet);
+ return NULL;
+}
+
+void progress_blocking_element_set_free(progress_blocking_element_set_t *pSet)
+{
+ if (pSet != NULL) {
+ if (pSet->n_ary_tree_with_flag != NULL) {
+ n_ary_tree_node_with_flag_free_subtree(pSet->n_ary_tree_with_flag);
+ pSet->n_ary_tree_with_flag = NULL;
+ }
+
+ free(pSet);
+ }
+}
+
+engine_controller_error_t progress_blocking_element_add(progress_blocking_element_set_t *pSet, ec_uint depth, va_list ap)
+{
+ engine_controller_error_t ec_error = ENGINE_CONTROLLER_OK;
+
+ n_ary_tree_node_with_flag_t *root_node = pSet->n_ary_tree_with_flag; /* note that root_node != NULL */
+ n_ary_tree_node_with_flag_t *last_exist_parent_node = NULL;
+ n_ary_tree_node_with_flag_t *first_alloc_node = NULL;
+ n_ary_tree_node_with_flag_t *parent_node = NULL;
+ n_ary_tree_node_with_flag_t *child_node = NULL;
+
+ ec_boolean is_dynamic_child = false;
+ ec_int dynamic_case = 0;
+ ec_uint child_index = 0;
+
+ ec_uint i = 0;
+
+ if (depth == 0) {
+ if (!(root_node->blocking_flag)) {
+ (pSet->progress_blocking_element_cnt)++;
+ n_ary_tree_node_with_flag_set_blocking_flag_on(root_node);
+ }
+
+ return ec_error;
+ }
+
+ parent_node = root_node;
+ for (i = 1; i <= depth; i++) {
+ is_dynamic_child = va_arg(ap, ec_boolean);
+ dynamic_case = va_arg(ap, ec_int);
+ child_index = va_arg(ap, ec_int);
+
+ child_node = n_ary_tree_node_with_flag_get_child_node(parent_node, is_dynamic_child, dynamic_case, child_index);
+
+ if (child_node == NULL) {
+ last_exist_parent_node = parent_node;
+ first_alloc_node = n_ary_tree_node_with_flag_add_child_node(parent_node, i == depth, is_dynamic_child, dynamic_case, child_index);
+ if (first_alloc_node == NULL) {
+ ec_error = ENGINE_CONTROLLER_OUT_OF_MEMORY;
+ goto error_part;
+ }
+
+ if (i == depth) {
+ (pSet->progress_blocking_element_cnt)++;
+ goto return_part;
+ }
+
+ parent_node = first_alloc_node;
+ break;
+ }
+ parent_node = child_node;
+ }
+
+ if (child_node != NULL) {
+ /* already exist child node */
+ if (!(child_node->blocking_flag)) {
+ n_ary_tree_node_with_flag_set_blocking_flag_on(child_node);
+ (pSet->progress_blocking_element_cnt)++;
+ }
+ goto return_part;
+ } else {
+ /* add child node */
+ for (i++; i <= depth; i++) {
+ is_dynamic_child = va_arg(ap, ec_boolean);
+ dynamic_case = va_arg(ap, ec_int);
+ child_index = va_arg(ap, ec_int);
+
+ child_node = n_ary_tree_node_with_flag_add_child_node(parent_node, (i == depth), is_dynamic_child, dynamic_case, child_index);
+ if (child_node == NULL) {
+ goto error_part;
+ }
+
+ parent_node = child_node;
+ }
+ (pSet->progress_blocking_element_cnt)++;
+ }
+
+return_part:
+ if (last_exist_parent_node == NULL) { /* when pSet->n_ary_tree_with_flag == NULL */
+ pSet->n_ary_tree_with_flag = first_alloc_node;
+ }
+
+ return ec_error;
+
+error_part:
+ if (first_alloc_node != NULL) {
+ n_ary_tree_node_with_flag_free_subtree(first_alloc_node);
+ }
+ return ec_error;
+}
+
+progress_blocking_entity_t *progress_blocking_entity_new(ec_uint root_task_spec_id, queuing_rule_spec_t *pQueuing_rule_spec)
+{
+ progress_blocking_entity_t *pEntity = (progress_blocking_entity_t *)calloc(1, sizeof(progress_blocking_entity_t));
+ if (pEntity == NULL) {
+ goto error_part;
+ }
+
+ pEntity->ref_count = 1;
+ pEntity->root_task_spec_id = root_task_spec_id;
+ pEntity->pQueuing_rule_spec = queuing_rule_spec_ref(pQueuing_rule_spec);
+ pEntity->pElement_set = progress_blocking_element_set_new();
+ if (pEntity->pElement_set == NULL) {
+ goto error_part;
+ }
+
+ return pEntity;
+
+error_part:
+ progress_blocking_entity_free(pEntity);
+ return NULL;
+}
+
+void progress_blocking_entity_free(progress_blocking_entity_t *pEntity)
+{
+ if (pEntity != NULL) {
+ if (pEntity->pElement_set != NULL) {
+ progress_blocking_element_set_free(pEntity->pElement_set);
+ }
+ if (pEntity->pQueuing_rule_spec != NULL) {
+ queuing_rule_spec_unref(pEntity->pQueuing_rule_spec);
+ }
+ }
+}
+
+progress_blocking_entity_t *progress_blocking_entity_ref(progress_blocking_entity_t *pEntity)
+{
+ if (pEntity == NULL) {
+ return NULL;
+ }
+
+ g_atomic_int_inc(&(pEntity->ref_count));
+
+ return pEntity;
+}
+
+void progress_blocking_entity_unref(progress_blocking_entity_t *pEntity)
+{
+ if (pEntity == NULL) {
+ return;
+ }
+
+ if (g_atomic_int_dec_and_test(&(pEntity->ref_count))) {
+ progress_blocking_entity_free(pEntity);
+ }
+}
+
+/* implementation of queuing_rule_spec.h */
+
+queuing_rule_spec_t *queuing_rule_spec_create_queuing_rule_spec_outline(ec_char *queuing_rule_name)
+{
+ queuing_rule_spec_t *pRule = (queuing_rule_spec_t *)calloc(1, sizeof(queuing_rule_spec_t));
+ if (pRule == NULL) {
+ goto error_part;
+ }
+
+ pRule->ref_count = 1;
+ pRule->name = strdup(queuing_rule_name);
+ if (pRule->name == NULL) {
+ goto error_part;
+ }
+
+ pRule->total_progress_blocking_element_cnt = 0;
+ pRule->progress_blocking_entity_list = NULL;
+
+ pRule->progress_blocking_queue = g_queue_new();
+ if (pRule->progress_blocking_queue == NULL) {
+ goto error_part;
+ }
+
+ return pRule;
+
+error_part:
+ queuing_rule_spec_free_queuing_rule_spec(pRule);
+ return NULL;
+}
+
+/* TODO : better performance expected if validation & check duplication & add new queuing element are done by one scanning */
+engine_controller_error_t queuing_rule_spec_add_progress_blocking_element(queuing_rule_spec_t *pRule, ec_uint root_task_spec_id, task_spec_t *pRoot_task_spec, ec_uint child_depth, ...)
+{
+ /* ec_boolean is_dynamic, ec_int dynamic_case, ec_int child_index */
+ engine_controller_error_t ec_error = ENGINE_CONTROLLER_OK;
+ ec_boolean new_entity = false;
+
+ va_list ap;
+ va_start(ap, child_depth);
+
+ /* check validity of child path */
+ if (!queuing_rule_spec_is_valid_child_path(pRoot_task_spec, child_depth, ap)) {
+ ec_error = ENGINE_CONTROLLER_INVALID_CHILD_PATH;
+ va_end(ap);
+
+ goto return_part;
+ }
+
+ va_end(ap);
+ va_start(ap, child_depth);
+
+ /* find progress blocking entity */
+ progress_blocking_entity_t *pEntity = __queuing_rule_spec_get_progress_blocking_entity(pRule, root_task_spec_id);
+ if (pEntity == NULL) {
+ pEntity = progress_blocking_entity_new(root_task_spec_id, pRule);
+ if (pEntity == NULL) {
+ ec_error = ENGINE_CONTROLLER_OUT_OF_MEMORY;
+ goto return_part;
+ } else {
+ new_entity = true;
+ }
+ }
+
+ /* add_child_path to blocking entity */
+ ec_error = progress_blocking_element_add(pEntity->pElement_set, child_depth, ap);
+ if (ec_error != ENGINE_CONTROLLER_OK) {
+ va_end(ap);
+ goto return_part;
+ }
+
+ va_end(ap);
+
+ if (new_entity) {
+ pRule->total_progress_blocking_element_cnt++;
+ pRule->progress_blocking_entity_list = g_slist_prepend(pRule->progress_blocking_entity_list, pEntity);
+ }
+
+return_part:
+ return ec_error;
+
+/*
+error_part:
+ if (new_entity) {
+ progress_blocking_entity_unref(pEntity);
+ }
+ return ec_error;
+*/
+}
+
+queuing_rule_spec_t *queuing_rule_spec_ref(queuing_rule_spec_t *pRule)
+{
+ fw_assert_condition(pRule != NULL, "error. pRule == NULL\n");
+
+ g_atomic_int_inc(&(pRule->ref_count));
+ return pRule;
+}
+
+void queuing_rule_spec_unref(queuing_rule_spec_t *pRule)
+{
+ if (pRule == NULL) {
+ return;
+ }
+
+ if (g_atomic_int_get(&(pRule->ref_count)) <= 0) {
+ FW_LOGE("ref count <= 0\n");
+ }
+
+ if (g_atomic_int_dec_and_test(&(pRule->ref_count))) {
+ queuing_rule_spec_free_queuing_rule_spec(pRule);
+ }
+}
diff --git a/framework/src/EngineController/queuing_rule_spec_pool.c b/framework/src/EngineController/queuing_rule_spec_pool.c
new file mode 100755
index 0000000..93ec916
--- /dev/null
+++ b/framework/src/EngineController/queuing_rule_spec_pool.c
@@ -0,0 +1,141 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#include <stdlib.h>
+#include <assert.h>
+#include "EngineController/queuing_rule_spec_pool.h"
+
+queuing_rule_spec_pool_t *queuing_rule_spec_pool_alloc(ec_uint queuing_rule_max_cnt, task_info_pool_t *pTask_info_pool)
+{
+ queuing_rule_spec_pool_t *pPool = NULL;
+ if (queuing_rule_max_cnt == 0) {
+ goto error_part;
+ }
+
+ pPool = (queuing_rule_spec_pool_t *)calloc(1, sizeof(queuing_rule_spec_pool_t));
+ if (pPool == NULL) {
+ goto return_part;
+ }
+
+ pPool->pId_provider = id_provider_create(queuing_rule_max_cnt - 1, 12, false);
+ if (pPool->pId_provider == NULL) {
+ goto error_part;
+ }
+
+ pPool->pQueuing_rule_spec_hash = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) queuing_rule_spec_unref);
+ if (pPool->pQueuing_rule_spec_hash == NULL) {
+ goto error_part;
+ }
+
+ pPool->pTask_info_pool = pTask_info_pool;
+
+return_part:
+ return pPool;
+
+error_part:
+ queuing_rule_spec_pool_free(pPool);
+ return NULL;
+}
+
+void queuing_rule_spec_pool_free(queuing_rule_spec_pool_t *pPool)
+{
+ if (pPool != NULL) {
+ if (pPool->pId_provider != NULL) {
+ id_provider_destroy(pPool->pId_provider);
+ }
+ if (pPool->pQueuing_rule_spec_hash != NULL) {
+ g_hash_table_destroy(pPool->pQueuing_rule_spec_hash);
+ }
+ }
+}
+
+engine_controller_error_t queuing_rule_spec_pool_add_queuing_rule_spec(queuing_rule_spec_pool_t *pPool, queuing_rule_spec_t *pSpec, ec_uint *queuing_rule_id)
+{
+ engine_controller_error_t ec_error = ENGINE_CONTROLLER_OK;
+
+ task_info_pool_t *pTask_info_pool = pPool->pTask_info_pool;
+
+ /* generate id */
+ id_provider_error_t id_error = ID_PROVIDER_OK;
+ ec_uint new_id = 0;
+ id_error = id_provider_provide_id(pPool->pId_provider, &new_id);
+ if (id_error != ID_PROVIDER_OK) {
+ if (id_error == ID_PROVIDER_NOT_ENOUGH_ID) {
+ ec_error = ENGINE_CONTROLLER_OUT_OF_FREE_ID;
+ } else {
+ ec_error = ENGINE_CONTROLLER_UNKNOWN_ERROR;
+ }
+ goto error_part;
+ }
+
+ /* TODO : error handling */
+
+ /* add queuing_rule_spec info to each task_specs */
+ progress_blocking_entity_t *pEntity = NULL;
+ task_info_t *pTask_info = NULL;
+ GSList *iter = NULL;
+ for (iter = pSpec->progress_blocking_entity_list; iter != NULL; iter = g_slist_next(iter)) {
+ pEntity = (progress_blocking_entity_t *)(iter->data);
+
+ pTask_info = task_info_pool_search_task_info(pTask_info_pool, pEntity->root_task_spec_id);
+ ec_error = task_info_add_progress_blocking_entity(pTask_info, pEntity);
+ if (ec_error != ENGINE_CONTROLLER_OK) {
+ /* undo */
+ GSList *iter2 = NULL;
+ progress_blocking_entity_t *pEntity2 = NULL;
+ for (iter2 = pSpec->progress_blocking_entity_list; iter2 != iter; iter2 = g_slist_next(iter2)) {
+ pEntity2 = (progress_blocking_entity_t *)(iter2->data);
+ task_info_remove_blocking_entity(pTask_info, pEntity2);
+ }
+
+ assert(ID_PROVIDER_OK == id_provider_delete_id(pPool->pId_provider, new_id));
+ goto error_part;
+ }
+ }
+
+ g_hash_table_insert(pPool->pQueuing_rule_spec_hash, (gpointer) new_id, pSpec);
+
+ *queuing_rule_id = new_id;
+
+error_part:
+ return ec_error;
+}
+
+queuing_rule_spec_t *queueing_rule_spec_pool_search_queuing_rule_spec(queuing_rule_spec_pool_t *pPool, ec_uint queuing_rule_id)
+{
+ queuing_rule_spec_t *pQueuing_rule_spec = g_hash_table_lookup(pPool->pQueuing_rule_spec_hash, (gconstpointer) queuing_rule_id);
+
+ return pQueuing_rule_spec;
+}
diff --git a/framework/src/EngineController/task.c b/framework/src/EngineController/task.c
new file mode 100755
index 0000000..80bf322
--- /dev/null
+++ b/framework/src/EngineController/task.c
@@ -0,0 +1,1033 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include "Utility/fw_ref.h"
+#include "Utility/fw_assert.h"
+#include "Utility/fw_log.h"
+#include "EngineController/engine_controller_internal.h"
+#include "EngineController/task.h"
+#include "EngineController/task_spec_internal.h"
+#include "EngineController/param_spec_internal.h"
+
+#define LOG_TAG "AF_EC"
+
+static param_t *task_fetch_from_param(task_t *pParent_task, ec_int to_child_task_index, ec_int to_param_index);
+static void task_free_task(task_t *pTask);
+
+static param_t *task_fetch_from_param(task_t *pParent_task, ec_int to_child_task_index, ec_int to_param_index)
+{
+ param_t *pFetched_param = NULL;
+ task_spec_t *pParent_task_spec = pParent_task->pTask_spec;
+ child_tasks_info_t *pChild_task_info = NULL;
+ if (task_spec_is_container_task_spec(pParent_task_spec)) {
+ pChild_task_info = task_spec_find_child_tasks_info(pParent_task_spec);
+ } else if (task_spec_is_dynamic_container_task_spec(pParent_task_spec)) {
+ pChild_task_info = task_spec_find_case_specific_child_tasks_info(pParent_task_spec, pParent_task->dynamic_case);
+ } else {
+ assert(false);
+ }
+
+ data_flow_edges_t *pData_flow_edges;
+
+ if (pChild_task_info != NULL) {
+ pData_flow_edges = pChild_task_info->pData_flow_edges;
+ } else {
+ goto error_part;
+ }
+
+ ec_int from_task_index = 0;
+ ec_int from_param_index = 0;
+ ec_boolean find_success = data_flow_edges_get_from_param_info(pData_flow_edges,
+ to_child_task_index, to_param_index,
+ &from_task_index, &from_param_index);
+ if (find_success) {
+ if (from_task_index == -1) {
+ /* get from parent_task */
+ pFetched_param = pParent_task->param_array[from_param_index];
+ } else {
+ /* validation from_task_index */
+ engine_controller_error_t ec_error = ENGINE_CONTROLLER_OK;
+ if (task_spec_is_container_task_spec(pParent_task_spec)) {
+ ec_error = task_spec_valididate_child_task_index(pParent_task_spec, from_task_index);
+ } else if (task_spec_is_dynamic_container_task_spec(pParent_task_spec)) {
+ ec_error = task_spec_valididate_child_task_index_on_dynamic_case(pParent_task->dynamic_case, pParent_task_spec, from_task_index);
+ }
+ if (ec_error != ENGINE_CONTROLLER_OK) {
+ goto error_part;
+ }
+
+ /* get from child task */
+ task_t *pChild_task = pParent_task->child_task_array[from_task_index];
+ pFetched_param = pChild_task->param_array[from_param_index];
+ }
+ }
+
+ return pFetched_param;
+
+error_part:
+ return NULL;
+}
+
+/* TODO : handling error case */
+GSList *task_construct_progress_blocking_realized_entity_list(task_info_t *pTask_info)
+{
+ GSList *progress_blocking_realized_entity_list = NULL;
+
+ /* add progress blocking entity according to queuing rule */
+ GSList *iter = NULL;
+ progress_blocking_entity_t *pEntity = NULL;
+ progress_blocking_realized_entity_t *pRealized_entity = NULL;
+ for (iter = pTask_info->progress_blocking_entity_list; iter != NULL; iter = g_slist_next(iter)) {
+ pEntity = (progress_blocking_entity_t *)(iter->data);
+
+ pRealized_entity = progress_blocking_realized_entity_new(pEntity);
+
+ progress_blocking_realized_entity_list = g_slist_prepend(progress_blocking_realized_entity_list, pRealized_entity);
+
+ /* create progress_queuing_entity */
+ g_queue_push_tail(pEntity->pQueuing_rule_spec->progress_blocking_queue, pRealized_entity);
+ }
+
+ return progress_blocking_realized_entity_list;
+}
+
+/* TODO : handling error case */
+GSList *task_construct_current_node_in_progress_blocking_entity_list(task_info_t *pTask_info)
+{
+ GSList *current_node_in_progress_blocking_entity_list = NULL;
+
+ /* add progress blocking entity according to queuing rule */
+ GSList *iter = NULL;
+ progress_blocking_entity_t *pEntity = NULL;
+ for (iter = pTask_info->progress_blocking_entity_list; iter != NULL; iter = g_slist_next(iter)) {
+ pEntity = (progress_blocking_entity_t *)(iter->data);
+
+ current_node_in_progress_blocking_entity_list = g_slist_prepend(current_node_in_progress_blocking_entity_list, pEntity->pElement_set->n_ary_tree_with_flag);
+ }
+
+ return current_node_in_progress_blocking_entity_list;
+}
+
+GSList *task_construct_current_node_in_progress_blocking_entity_list_from_parent_task(task_t *pParent_task, ec_int child_index)
+{
+ GSList *current_node_in_progress_blocking_entity_list = NULL;
+
+ /* add progress blocking entity according to queuing rule */
+ GSList *iter = NULL;
+ n_ary_tree_node_with_flag_t *parent_tree_node = NULL;
+ n_ary_tree_node_with_flag_t *child_tree_node = NULL;
+ for (iter = pParent_task->current_node_in_progress_blocking_entity_list; iter != NULL; iter = g_slist_next(iter)) {
+ parent_tree_node = (n_ary_tree_node_with_flag_t *)(iter->data);
+ if (parent_tree_node == NULL) {
+ child_tree_node = NULL;
+ } else {
+ child_tree_node = n_ary_tree_node_with_flag_get_child_node(parent_tree_node, task_spec_is_dynamic_container_task_spec(pParent_task->pTask_spec), pParent_task->dynamic_case, child_index);
+ /* note that child_tree_node could be NULL */
+ }
+
+ current_node_in_progress_blocking_entity_list = g_slist_prepend(current_node_in_progress_blocking_entity_list, child_tree_node);
+ }
+
+ return current_node_in_progress_blocking_entity_list;
+}
+
+task_t *task_alloc_root_task(task_spec_t *pTask_spec, engine_controller_request_msg_t *pRequest_Msg, task_info_pool_t *pTask_info_pool)
+{
+ task_t *pTask = NULL;
+ ec_int i = 0;
+ ec_uint child_task_cnt = 0;
+
+ if (pTask_spec == NULL) {
+ FW_LOGD("input task is NULL");
+ goto error_part;
+ }
+
+ pTask = (task_t *)calloc(1, sizeof(task_t));
+ if (pTask == NULL) {
+ goto error_part;
+ }
+
+ pTask->ref_count = 1;
+ pTask->task_error = TASK_ERROR_NOT_YET_RUN;
+
+ pTask->pTask_info = task_info_pool_search_task_info(pTask_info_pool, pRequest_Msg->task_spec_id);
+
+ pTask->progress_blocking_realized_entity_list = task_construct_progress_blocking_realized_entity_list(pTask->pTask_info);
+
+ pTask->current_node_in_progress_blocking_entity_list = task_construct_current_node_in_progress_blocking_entity_list(pTask->pTask_info);
+
+ pTask->pParent_task = NULL;
+ pTask->child_task_index_in_parent_task = 0; /* meaningless value */
+
+ pTask->param_array = (param_t **)calloc(pTask_spec->task_param_cnt, sizeof(param_t *));
+ if (pTask->param_array == NULL) {
+ goto error_part;
+ }
+
+ /* set parameter values in param_array */
+ int index = 0;
+ for (i = 0; i < pRequest_Msg->cnt_in_param; i++) {
+ index = pRequest_Msg->in_param_index_array[i];
+ pTask->param_array[index] = param_alloc_param(1, 1, /* TODO : set ref count */
+ pTask_spec->task_param_spec_array[index], &(pRequest_Msg->in_param_value_array[i]));
+ }
+
+ /* set output parameter values */
+ for (i = 0; i < pTask_spec->task_param_cnt; i++) {
+ if (pTask->param_array[i] == NULL) {
+ pTask->param_array[i] = param_alloc_param(1, 1, /* TODO : set ref count */
+ pTask_spec->task_param_spec_array[i], NULL);
+ }
+ }
+
+ if (task_spec_is_container_task_spec(pTask_spec)) {
+ child_task_cnt = task_spec_get_child_task_cnt(pTask_spec);
+ } else if (task_spec_is_dynamic_container_task_spec(pTask_spec)) {
+ /* compute case */
+ calculate_case_callback_func calculate_case_func = task_spec_get_calculate_case_callback_func(pTask_spec);
+ pTask->dynamic_case = calculate_case_func(pTask_spec->task_param_cnt, pTask->param_array);
+
+ child_task_cnt = task_spec_get_child_task_cnt_on_dynamic_case(pTask_spec, pTask->dynamic_case);
+ }
+
+ if (child_task_cnt > 0) {
+ pTask->child_task_array = (task_t **)calloc(child_task_cnt, sizeof(task_t *));
+ if (pTask->child_task_array == NULL) {
+ goto error_part;
+ }
+ }
+
+ task_set_left_child_to_run(pTask, child_task_cnt);
+
+ if (task_spec_is_container_task_spec(pTask_spec)) {
+ /* copy child_task_control_flow_in_degree */
+ pTask->current_child_task_control_flow_in_degree_array = task_spec_duplicate_child_task_control_flow_in_degree(pTask_spec);
+ if (pTask->current_child_task_control_flow_in_degree_array == NULL) {
+ goto error_part;
+ }
+ } else if (task_spec_is_dynamic_container_task_spec(pTask_spec)) {
+ pTask->current_child_task_control_flow_in_degree_array = task_spec_duplicate_child_task_control_flow_in_degree_on_dynamic_case(pTask_spec, pTask->dynamic_case);
+ if (pTask->current_child_task_control_flow_in_degree_array == NULL) {
+ goto error_part;
+ }
+ } else {
+ pTask->current_child_task_control_flow_in_degree_array = NULL;
+ }
+
+ pTask->pTask_spec = task_spec_ref(pTask_spec);
+ refObject_t *pRequest_Msg_ref = create_refObject(pRequest_Msg, NULL); /* TODO : free fucntion */
+ if (pRequest_Msg_ref == NULL) {
+ goto error_part;
+ }
+ pTask->pRequestMsg = pRequest_Msg_ref;
+
+ pTask->pCancel_Information = task_cancel_info_init(pRequest_Msg_ref);
+ if (pTask->pCancel_Information == NULL) {
+ goto error_part;
+ }
+
+ if (-1 == gettimeofday(&(pTask->create_time), NULL)) {
+ goto error_part;
+ }
+
+ return pTask;
+
+error_part:
+ task_free_task(pTask);
+ return NULL;
+}
+
+task_t *task_alloc_child_task(task_t *pParent_task, ec_int child_index)
+{
+ task_t *pChild_task = NULL;
+ task_spec_t *pParent_task_spec = pParent_task->pTask_spec;
+ child_tasks_info_t *pChild_tasks_info = NULL;
+
+ /* validation & get child_task_info */
+ if (task_spec_is_container_task_spec(pParent_task_spec)) {
+ engine_controller_error_t ec_error = task_spec_valididate_child_task_index(pParent_task_spec, child_index);
+ if (ec_error != ENGINE_CONTROLLER_OK) {
+ FW_LOGE("invalid child index, child_index = %d\n", child_index);
+ goto error_part;
+ }
+
+ pChild_tasks_info = task_spec_find_child_tasks_info(pParent_task_spec);
+ } else if (task_spec_is_dynamic_container_task_spec(pParent_task_spec)) {
+ engine_controller_error_t ec_error = task_spec_valididate_child_task_index_on_dynamic_case(pParent_task->dynamic_case, pParent_task_spec, child_index);
+ if (ec_error != ENGINE_CONTROLLER_OK) {
+ FW_LOGE("invalid child index, child_index = %d\n", child_index);
+ goto error_part;
+ }
+
+ pChild_tasks_info = task_spec_find_case_specific_child_tasks_info(pParent_task_spec, pParent_task->dynamic_case);
+ }
+
+ task_spec_t *pChild_task_spec;
+
+ if (pChild_tasks_info != NULL) {
+ pChild_task_spec = pChild_tasks_info->child_task_array[child_index];
+ } else {
+ goto error_part;
+ }
+
+ ec_int i = 0;
+ ec_uint grand_child_task_cnt = 0;
+
+ pChild_task = (task_t *)calloc(1, sizeof(task_t));
+ if (pChild_task == NULL) {
+ goto error_part;
+ }
+
+ pChild_task->ref_count = 1;
+ pChild_task->task_error = TASK_ERROR_NOT_YET_RUN;
+ pChild_task->pParent_task = pParent_task;
+ pChild_task->child_task_index_in_parent_task = child_index;
+
+ pChild_task->progress_blocking_realized_entity_list = pParent_task->progress_blocking_realized_entity_list;
+ pChild_task->current_node_in_progress_blocking_entity_list = task_construct_current_node_in_progress_blocking_entity_list_from_parent_task(pParent_task, child_index);
+
+ pChild_task->param_array = (param_t **)calloc(pChild_task_spec->task_param_cnt, sizeof(param_t *));
+ if (pChild_task->param_array == NULL) {
+ goto error_part;
+ }
+
+ /* set parameter values */
+ for (i = 0; i < pChild_task_spec->task_param_cnt; i++) {
+ param_t *pFrom_param = task_fetch_from_param(pParent_task, child_index, i);
+ pChild_task->param_array[i] = param_alloc_param(1, 1, /* TODO : set ref count */
+ pChild_task_spec->task_param_spec_array[i], pFrom_param != NULL ? &(pFrom_param->param_value) : NULL);
+ }
+
+ if (task_spec_is_container_task_spec(pChild_task_spec)) {
+ grand_child_task_cnt = task_spec_get_child_task_cnt(pChild_task_spec);
+ } else if (task_spec_is_dynamic_container_task_spec(pChild_task_spec)) {
+ /* compute dynamic case */
+ calculate_case_callback_func calculate_case_func = task_spec_get_calculate_case_callback_func(pChild_task_spec);
+ pChild_task->dynamic_case = calculate_case_func(pChild_task_spec->task_param_cnt, pChild_task->param_array);
+
+ grand_child_task_cnt = task_spec_get_child_task_cnt_on_dynamic_case(pChild_task_spec, pChild_task->dynamic_case);
+ }
+ pChild_task->child_task_array = (task_t **)calloc(grand_child_task_cnt, sizeof(task_t *));
+ if (pChild_task->child_task_array == NULL) {
+ goto error_part;
+ }
+
+ task_set_left_child_to_run(pChild_task, grand_child_task_cnt);
+
+ if (task_spec_is_container_task_spec(pChild_task_spec)) {
+ /* copy child_task_control_flow_in_degree */
+ pChild_task->current_child_task_control_flow_in_degree_array = task_spec_duplicate_child_task_control_flow_in_degree(pChild_task_spec);
+ if (pChild_task->current_child_task_control_flow_in_degree_array == NULL) {
+ goto error_part;
+ }
+ } else if (task_spec_is_dynamic_container_task_spec(pChild_task_spec)) {
+ pChild_task->current_child_task_control_flow_in_degree_array = task_spec_duplicate_child_task_control_flow_in_degree_on_dynamic_case(pChild_task_spec, pChild_task->dynamic_case);
+ if (pChild_task->current_child_task_control_flow_in_degree_array == NULL) {
+ goto error_part;
+ }
+ } else {
+ pChild_task->current_child_task_control_flow_in_degree_array = NULL;
+ }
+
+ pChild_task->pTask_info = task_info_ref(pParent_task->pTask_info);
+ pChild_task->pTask_spec = task_spec_ref(pChild_task_spec);
+ pChild_task->pRequestMsg = getRef(pParent_task->pRequestMsg);
+ pChild_task->pCancel_Information = task_cancel_info_ref(pParent_task->pCancel_Information);
+
+ if (-1 == gettimeofday(&(pChild_task->create_time), NULL)) {
+ goto error_part;
+ }
+
+ return pChild_task;
+
+error_part:
+
+ if (pChild_task) {
+ task_free_task(pChild_task);
+ }
+ return NULL;
+}
+
+static void task_free_task(task_t *pTask)
+{
+ FW_LOGD("called\n");
+ if (pTask != NULL) {
+ /* TODO */
+
+ task_cancel_info_unref(pTask->pCancel_Information);
+ free(pTask);
+ }
+}
+
+task_t *task_ref_task(task_t *pTask)
+{
+ fw_assert_condition(pTask != NULL, "error. pTask == NULL\n");
+
+ g_atomic_int_inc(&(pTask->ref_count));
+ return pTask;
+}
+
+void task_unref_task(task_t *pTask)
+{
+ if (pTask == NULL) {
+ return;
+ }
+
+ if (g_atomic_int_get(&(pTask->ref_count)) <= 0) {
+ FW_LOGE("ref count <= 0\n");
+ }
+
+ if (g_atomic_int_dec_and_test(&(pTask->ref_count))) {
+ task_free_task(pTask);
+ }
+}
+
+ec_boolean task_is_simple_task(task_t *pTask)
+{
+ if (pTask == NULL) {
+ FW_LOGW("pTask == NULL\n");
+ return false;
+ }
+
+ task_spec_t *pTask_spec = pTask->pTask_spec;
+ return task_spec_is_simple_task_spec(pTask_spec);
+}
+
+ec_boolean task_is_container_task(task_t *pTask)
+{
+ if (pTask == NULL) {
+ FW_LOGW("pTask == NULL\n");
+ return false;
+ }
+
+ task_spec_t *pTask_spec = pTask->pTask_spec;
+ return (task_spec_is_container_task_spec(pTask_spec) || task_spec_is_dynamic_container_task_spec(pTask_spec));
+}
+
+ec_boolean task_is_root_task(task_t *pTask)
+{
+ task_t *pParent_task = task_get_parent_task(pTask);
+ if (pParent_task == NULL) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+ec_int task_get_param_cnt(task_t *pTask)
+{
+ if (pTask == NULL) {
+ FW_LOGE("pTask == NULL\n");
+ return -1;
+ }
+
+ return task_spec_get_param_cnt(pTask->pTask_spec);
+}
+
+ec_boolean task_get_output_param_info(task_t *pTask, ec_int *pOutput_param_cnt, ec_int **pOutput_param_index_array)
+{
+ if (pTask == NULL) {
+ FW_LOGE("pTask == NULL");
+ return false;
+ }
+
+ if (pTask->pTask_spec == NULL) {
+ FW_LOGE("pTask->pTask_spec == NULL\n");
+ return false;
+ }
+
+ return task_spec_get_output_param_info(pTask->pTask_spec, pOutput_param_cnt, pOutput_param_index_array);
+}
+
+ec_uint task_get_child_task_cnt(task_t *pTask)
+{
+ if (pTask == NULL) {
+ FW_LOGE("pTask == NULL\n");
+ return -1;
+ }
+
+ return task_spec_get_child_task_cnt(pTask->pTask_spec);
+}
+
+task_t *task_get_parent_task(task_t *pTask)
+{
+ if (pTask == NULL) {
+ FW_LOGE("pTask == NULL\n");
+ return NULL;
+ }
+
+ return pTask->pParent_task;
+}
+
+ec_int task_get_child_index_in_parent_task(task_t *pTask)
+{
+ if (pTask == NULL) {
+ FW_LOGE("pTask == NULL\n");
+ return -1;
+ }
+
+ return pTask->child_task_index_in_parent_task;
+}
+
+void task_set_task_error(task_t *pTask, task_error_t task_error)
+{
+ if (pTask == NULL) {
+ FW_LOGE("pTask == NULL\n");
+ return;
+ }
+
+ pTask->task_error = task_error;
+}
+
+ec_boolean task_check_same_task_error(task_t *pTask, task_error_t task_error)
+{
+ if (pTask == NULL) {
+ FW_LOGE("pTask == NULL\n");
+ return false;
+ }
+
+ if (pTask->task_error == task_error) {
+ return true;
+ }
+ return false;
+}
+
+ec_boolean task_is_not_yet_run(task_t *pTask)
+{
+ return task_check_same_task_error(pTask, TASK_ERROR_NOT_YET_RUN);
+}
+
+void task_do_cancellation(task_t *pTask)
+{
+ FW_LOGD("started\n");
+
+ g_mutex_lock(pTask->pCancel_Information->cancel_info_mutex);
+
+ task_cancel_info_set_cancel_flag_atomic(pTask->pCancel_Information);
+ FW_LOGD("pTask->pCancel_Information->cancel_flag = %d\n", pTask->pCancel_Information->cancel_flag);
+ task_cancel_info_call_cancel_callbacks_unlocked(pTask->pCancel_Information);
+
+ g_mutex_unlock(pTask->pCancel_Information->cancel_info_mutex);
+ FW_LOGD("ended\n");
+}
+
+void task_call_task_finish_callback(task_t *pTask)
+{
+ engine_controller_request_msg_t *pRequest_msg = (engine_controller_request_msg_t *)getData(pTask->pRequestMsg);
+ task_finish_callback_func task_finish_callback = pRequest_msg->task_finish_callback;
+ ec_pointer simple_task_finish_callback_usr_data = pRequest_msg->simple_task_finish_callback_usr_data;
+ FW_LOGD("started\n");
+
+ if (task_finish_callback != NULL) {
+ FW_LOGD("call finish callback\n");
+ task_error_t task_error = pTask->task_error;
+ ec_int i = 0;
+ ec_int cnt_out_param = 0;
+ ec_int out_param_index = 0;
+ ec_int *out_param_index_array = NULL;
+ param_t **out_param_array = NULL;
+ if (!task_get_output_param_info(pTask, &cnt_out_param, &out_param_index_array)) {
+ FW_LOGE("out of memory during task_get_output_param_info\n");
+ assert(false);
+ }
+
+ if (cnt_out_param > 0 && out_param_index_array != NULL) {
+ out_param_array = (param_t **)calloc(cnt_out_param, sizeof(param_t *));
+ if (out_param_array == NULL) {
+ FW_LOGE("out of memory during task_get_output_param_info\n");
+ assert(false);
+ }
+
+ for (i = 0; i < cnt_out_param; i++) {
+ out_param_index = out_param_index_array[i];
+ out_param_array[i] = pTask->param_array[out_param_index];
+ }
+ }
+
+ if (out_param_index_array != NULL) {
+ free(out_param_index_array);
+ }
+
+ /* call task_finish_callback */
+ task_finish_callback(task_error, cnt_out_param, out_param_array, simple_task_finish_callback_usr_data);
+
+ } else {
+ FW_LOGD("cannot call finish callback\n");
+ /* TODO : remove output parameters since we have to nothing to return but prevent memory leak */
+ }
+}
+
+void task_remove_control_flow(task_t *pParent_task, ec_int from_task_index, ec_int to_task_index)
+{
+ if (pParent_task == NULL) {
+ FW_LOGE("pParent_task == NULL\n");
+ return;
+ }
+
+ task_spec_t *pParent_task_spec = pParent_task->pTask_spec;
+ engine_controller_error_t ec_error = ENGINE_CONTROLLER_OK;
+ if (task_spec_is_container_task_spec(pParent_task_spec)) {
+ ec_error = task_spec_valididate_child_task_index(pParent_task_spec, to_task_index);
+
+ } else if (task_spec_is_dynamic_container_task_spec(pParent_task_spec)) {
+ ec_error = task_spec_valididate_child_task_index_on_dynamic_case(pParent_task->dynamic_case, pParent_task_spec, to_task_index);
+ }
+
+ if (ec_error != ENGINE_CONTROLLER_OK) {
+ FW_LOGE("invalid to_task_index. to_task_index = %d\n", to_task_index);
+ return;
+ }
+
+ /* remove in_degree of to_task */
+ pParent_task->current_child_task_control_flow_in_degree_array[to_task_index] -= 1;
+}
+
+void task_set_left_child_to_run(task_t *pParent_task, ec_uint number)
+{
+ pParent_task->cnt_left_child_task_to_finish = number;
+}
+
+ec_boolean task_is_left_child_to_run_zero(task_t *pParent_task)
+{
+ return (pParent_task->cnt_left_child_task_to_finish == 0);
+}
+
+void task_decrease_left_child_to_run(task_t *pParent_task)
+{
+ (pParent_task->cnt_left_child_task_to_finish)--;
+}
+
+ec_boolean task_is_parent_task_done(task_t *pParent_task)
+{
+ if (task_is_left_child_to_run_zero(pParent_task)) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void task_collect_parent_task_output_parameter(task_t *pParent_task)
+{
+ if (pParent_task == NULL) {
+ FW_LOGE("pParent_task == NULL\n");
+ return;
+ }
+
+ if (!task_is_container_task(pParent_task)) {
+ FW_LOGE("pParent_task is not container task\n");
+ return;
+ }
+
+ param_t *pTo_param = NULL;
+ param_spec *pTo_param_spec = NULL;
+ param_t *pFrom_param = NULL;
+
+ ec_int i = 0;
+ ec_int param_cnt = task_get_param_cnt(pParent_task);
+ for (i = 0; i < param_cnt; i++) {
+ pTo_param = pParent_task->param_array[i];
+ pTo_param_spec = pTo_param->pParam_spec;
+
+ if (is_output_flag_on(pTo_param_spec->flags)) {
+ pFrom_param = task_fetch_from_param(pParent_task, -1, i);
+
+ if (pFrom_param != NULL) {
+ /* set output parameter values */
+ param_value_set_value_with_other_param_value(&(pTo_param->param_value), &(pFrom_param->param_value));
+ }
+ }
+ }
+}
+
+GSList *collect_firstly_runnable_child_tasks(task_t *pParent_task)
+{
+ GSList *runnable_child_task_list = NULL;
+ if (!task_is_container_task(pParent_task)) {
+ goto error_part;
+ }
+
+ ec_int i = 0;
+ task_spec_t *pParent_task_spec = pParent_task->pTask_spec;
+ child_tasks_info_t *pChild_task_info = NULL;
+ if (task_spec_is_container_task_spec(pParent_task_spec)) {
+ pChild_task_info = task_spec_find_child_tasks_info(pParent_task_spec);
+ } else if (task_spec_is_dynamic_container_task_spec(pParent_task_spec)) {
+ pChild_task_info = task_spec_find_case_specific_child_tasks_info(pParent_task_spec, pParent_task->dynamic_case);
+ } else {
+ assert(false);
+ }
+
+ ec_int child_task_cnt;
+ ec_uint *child_task_control_flow_in_degree;
+
+ if (pChild_task_info != NULL) {
+ child_task_cnt = pChild_task_info->child_task_cnt;
+ child_task_control_flow_in_degree = pChild_task_info->child_task_control_flow_in_degree;
+ } else {
+ goto error_part;
+ }
+
+ task_t *pChild_task = NULL;
+ for (i = 0; i < child_task_cnt; i++) {
+ if (child_task_control_flow_in_degree[i] == 0) {
+ pChild_task = task_alloc_child_task(pParent_task, i);
+ if (pChild_task == NULL) {
+ goto error_part;
+ }
+
+ pParent_task->child_task_array[i] = pChild_task;
+ runnable_child_task_list = g_slist_append(runnable_child_task_list, pChild_task);
+ }
+ }
+
+ return runnable_child_task_list;
+
+error_part:
+ if (runnable_child_task_list != NULL) {
+ GSList *iter = NULL;
+ for (iter = runnable_child_task_list; iter != NULL; iter = g_slist_next(iter)) {
+ pChild_task = (task_t *)(iter->data);
+ task_unref_task(pChild_task);
+ }
+ g_slist_free(runnable_child_task_list);
+ }
+
+ return NULL;
+}
+
+GSList *collect_become_runnable_child_tasks_by_remove_control_flow(task_t *pParent_task, ec_int from_child_task_index)
+{
+ GSList *runnable_child_task_list = NULL;
+ if (!task_is_container_task(pParent_task)) {
+ goto error_part;
+ }
+
+ /* validation */
+ task_spec_t *pParent_task_spec = pParent_task->pTask_spec;
+ engine_controller_error_t ec_error = ENGINE_CONTROLLER_OK;
+ if (task_spec_is_container_task_spec(pParent_task_spec)) {
+ ec_error = task_spec_valididate_child_task_index(pParent_task_spec, from_child_task_index);
+
+ } else if (task_spec_is_dynamic_container_task_spec(pParent_task_spec)) {
+ ec_error = task_spec_valididate_child_task_index_on_dynamic_case(pParent_task->dynamic_case, pParent_task_spec, from_child_task_index);
+ }
+ if (ec_error != ENGINE_CONTROLLER_OK) {
+ FW_LOGE("invalid from child task index. from child task index = %d\n", from_child_task_index);
+ goto error_part;
+ }
+
+ child_tasks_info_t *pChild_task_info = NULL;
+ if (task_spec_is_container_task_spec(pParent_task_spec)) {
+ pChild_task_info = task_spec_find_child_tasks_info(pParent_task_spec);
+ } else if (task_spec_is_dynamic_container_task_spec(pParent_task_spec)) {
+ pChild_task_info = task_spec_find_case_specific_child_tasks_info(pParent_task_spec, pParent_task->dynamic_case);
+ } else {
+ assert(false);
+ }
+
+ graph_edge_pool_t *pControl_edge_pool;
+
+ if (pChild_task_info != NULL) {
+ pControl_edge_pool = pChild_task_info->pControl_edge_pool;
+ } else {
+ goto error_part;
+ }
+
+ /* get to node list from child_index */
+ /* note that to nodes_list containing ec_int */
+ GList *to_node_list = graph_edge_pool_query_to_node_list(pControl_edge_pool, (ec_constpointer) from_child_task_index);
+
+ /* remove control flow from child task at child_index of parent task */
+ GList *iter = NULL;
+ ec_int to_child_task_index = 0;
+ task_t *pTo_child_task = NULL;
+ for (iter = to_node_list; iter != NULL; iter = g_list_next(iter)) {
+ to_child_task_index = (ec_int)(iter->data);
+ task_remove_control_flow(pParent_task, from_child_task_index, to_child_task_index);
+
+ /* if zero in-degree of control flow detected, make child task and append runnable_child_task_list */
+ if (pParent_task->current_child_task_control_flow_in_degree_array[to_child_task_index] == 0) {
+ pTo_child_task = task_alloc_child_task(pParent_task, to_child_task_index);
+ if (pTo_child_task == NULL) {
+ FW_LOGE("out of memory\n");
+ goto error_part;
+ }
+
+ pParent_task->child_task_array[to_child_task_index] = pTo_child_task;
+ runnable_child_task_list = g_slist_append(runnable_child_task_list, pTo_child_task);
+ }
+ }
+
+ return runnable_child_task_list;
+
+error_part:
+ if (runnable_child_task_list != NULL) {
+ GSList *iter = NULL;
+ task_t *pChild_task;
+ for (iter = runnable_child_task_list; iter != NULL; iter = g_slist_next(iter)) {
+ pChild_task = (task_t *)(iter->data);
+ task_unref_task(pChild_task);
+ }
+ g_slist_free(runnable_child_task_list);
+ }
+
+ return NULL;
+}
+
+task_error_t task_run_simple_task(task_t *pSimple_task)
+{
+ task_error_t task_error = TASK_ERROR_NOT_YET_RUN;
+
+ task_spec_t *pTask_spec = pSimple_task->pTask_spec;
+ task_cancel_info_t *pCancel_Info = pSimple_task->pCancel_Information;
+
+ refObject_t *pRequestMsg_ref = pSimple_task->pRequestMsg;
+ engine_controller_request_msg_t *pRequestMsg = (engine_controller_request_msg_t *)getData(pRequestMsg_ref);
+
+ ec_int request_msg_id = pRequestMsg->msg_head.msg_id;
+
+ if (-1 == gettimeofday(&(pSimple_task->run_time), NULL)) {
+ FW_LOGW("setting run time error\n");
+ }
+
+ if (task_cancel_info_get_cancel_flag_atomic(pCancel_Info)) {
+ FW_LOGD("cancel flag on case\n");
+
+ /* do not run task if cancellation flag on */
+ task_error = TASK_ERROR_CANCELED;
+ } else {
+ FW_LOGD("cancel flag off case\n");
+ task_error = pTask_spec->u.task_process(pSimple_task->pTask_spec->task_param_cnt, pSimple_task->param_array);
+ }
+
+ if (-1 == gettimeofday(&(pSimple_task->finish_time), NULL)) {
+ FW_LOGE("setting finish time error\n");
+ }
+
+ /* set task error information */
+ task_set_task_error(pSimple_task, task_error);
+
+ if (pTask_spec->post_func != NULL) {
+ pTask_spec->post_func(pTask_spec->usr_post_task_func_data, request_msg_id);
+ }
+
+ return task_error;
+}
+
+ec_boolean task_add_pending_task_list_of_first_progress_blocking_realized_entity(task_t *pTask)
+{
+ ec_boolean is_pending_task = false;
+
+ GSList *iter_current_node = NULL;
+ GSList *iter_realized_entity = NULL;
+ n_ary_tree_node_with_flag_t *current_node = NULL;
+ progress_blocking_realized_entity_t *pRealized_entity = NULL;
+ progress_blocking_realized_entity_t *pPrev_realized_entity = NULL;
+ GQueue *progress_blocking_queue = NULL;
+
+ /* iterate all queuing rules related to pTask */
+ for (iter_current_node = pTask->current_node_in_progress_blocking_entity_list, iter_realized_entity = pTask->progress_blocking_realized_entity_list; iter_current_node != NULL && iter_realized_entity != NULL; iter_current_node = g_slist_next(iter_current_node), iter_realized_entity = g_slist_next(iter_realized_entity)) {
+ current_node = (n_ary_tree_node_with_flag_t *)(iter_current_node->data);
+ pRealized_entity = (progress_blocking_realized_entity_t *)(iter_realized_entity->data);
+
+ progress_blocking_queue = pRealized_entity->pEntity->pQueuing_rule_spec->progress_blocking_queue;
+ if (current_node != NULL && n_ary_tree_node_with_flag_is_blocking_flag_on(current_node) && g_queue_peek_head(progress_blocking_queue) != pRealized_entity) {
+ /* pending condition */
+ GList *realized_entity_node = g_queue_find(progress_blocking_queue, pRealized_entity);
+ GList *prev_realized_entity_node = realized_entity_node->prev;
+
+ pPrev_realized_entity = (progress_blocking_realized_entity_t *)(prev_realized_entity_node->data);
+ progress_blocking_realized_entity_add_pending_task(pPrev_realized_entity, pTask);
+ is_pending_task = true;
+ break; /* note that only append first found queue */
+ }
+ }
+
+ return is_pending_task;
+}
+
+void task_update_progress_blocking_realized_entity_and_pop_if_possible(task_t *pTask)
+{
+ GSList *iter_current_node = NULL;
+ GSList *iter_realized_entity = NULL;
+ n_ary_tree_node_with_flag_t *current_node = NULL;
+ progress_blocking_realized_entity_t *pRealized_entity = NULL;
+ GQueue *progress_blocking_queue = NULL;
+
+ for (iter_current_node = pTask->current_node_in_progress_blocking_entity_list, iter_realized_entity = pTask->progress_blocking_realized_entity_list; iter_current_node != NULL && iter_realized_entity != NULL; iter_current_node = g_slist_next(iter_current_node), iter_realized_entity = g_slist_next(iter_realized_entity)) {
+ current_node = (n_ary_tree_node_with_flag_t *)(iter_current_node->data);
+ pRealized_entity = (progress_blocking_realized_entity_t *)(iter_realized_entity->data);
+ if (progress_blocking_realized_entity_update_and_test_left_progress_blocking_element_cnt(pRealized_entity, current_node, pTask)) {
+ /* pop pRealized_entity in queue */
+ progress_blocking_queue = pRealized_entity->pEntity->pQueuing_rule_spec->progress_blocking_queue;
+ g_queue_remove(progress_blocking_queue, pRealized_entity);
+
+ /* restart pending tasks due to pRealized_entity */
+ progress_blocking_realized_entity_restart_pending_task(pRealized_entity);
+ }
+ }
+}
+
+#include "EngineController/task_message.h"
+
+progress_blocking_realized_entity_t *progress_blocking_realized_entity_new(progress_blocking_entity_t *pEntity)
+{
+ progress_blocking_realized_entity_t *pRealized_entity = (progress_blocking_realized_entity_t *)calloc(1, sizeof(progress_blocking_realized_entity_t));
+ if (pRealized_entity == NULL) {
+ goto error_part;
+ }
+
+ pRealized_entity->pEntity = progress_blocking_entity_ref(pEntity);
+ pRealized_entity->left_progress_blocking_element_cnt = pEntity->pElement_set->progress_blocking_element_cnt;
+ pRealized_entity->pending_task_list = NULL;
+
+ return pRealized_entity;
+
+error_part:
+ progress_blocking_realized_entity_free(pRealized_entity);
+ return NULL;
+}
+
+void progress_blocking_realized_entity_free(progress_blocking_realized_entity_t *pRealized_entity)
+{
+ if (pRealized_entity != NULL) {
+ if (pRealized_entity->pEntity != NULL) {
+ progress_blocking_entity_unref(pRealized_entity->pEntity);
+ }
+
+ if (pRealized_entity->pending_task_list != NULL) {
+ GSList *iter = NULL;
+ task_t *pPending_task = NULL;
+ for (iter = pRealized_entity->pending_task_list; iter != NULL; iter = g_slist_next(iter)) {
+ pPending_task = (task_t *)(iter->data);
+ task_unref_task(pPending_task);
+ }
+
+ g_slist_free(pRealized_entity->pending_task_list);
+ }
+
+ free(pRealized_entity);
+ }
+}
+
+void progress_blocking_realized_entity_restart_pending_task(progress_blocking_realized_entity_t *pRealized_entity)
+{
+ GSList *iter = NULL;
+ task_t *pPending_task = NULL;
+ engine_controller_request_msg_t *pRequest_msg = NULL;
+ task_message_t *pNew_task_msg = NULL;
+ for (iter = pRealized_entity->pending_task_list; iter != NULL; iter = g_slist_next(iter)) {
+ pPending_task = (task_t *)(iter->data);
+ pRequest_msg = (engine_controller_request_msg_t *)getData(pPending_task->pRequestMsg);
+
+ FW_LOGD("pending task (request msg id = %d, task spec id = %d, task spec name = %s) by queuing rule restarted\n", pRequest_msg->msg_head.msg_id, pPending_task->pTask_info->task_spec_id, pPending_task->pTask_info->pTask_spec->task_name);
+
+ /* send msg to engine controller itself */
+ pNew_task_msg = task_message_create(TASK_START, pPending_task, 0);
+ send_msg_to_engine_controller_with_compare_priority(pNew_task_msg, compare_priority_of_task_message_append_way, NULL);
+
+ /* TODO : error handling */
+ }
+}
+
+void progress_blocking_realized_entity_add_pending_task(progress_blocking_realized_entity_t *pEntity, task_t *pending_task)
+{
+ pEntity->pending_task_list = g_slist_append(pEntity->pending_task_list, task_ref_task(pending_task));
+}
+
+ec_boolean progress_blocking_realized_entity_update_and_test_left_progress_blocking_element_cnt(progress_blocking_realized_entity_t *pRealized_entity, n_ary_tree_node_with_flag_t *current_node, task_t *pTask)
+{
+ if (progress_blocking_realized_entity_is_zero_left_progress_blocking_element_cnt(pRealized_entity)) {
+ return false;
+ }
+
+ ec_boolean become_zero_after_update = false;
+
+ switch (pTask->task_error) {
+ case TASK_ERROR_INVALID_TASK:
+ FW_LOGW("invalid task error returned\n");
+ case TASK_ERROR_RUN_FAILED:
+ case TASK_ERROR_CANCELED:
+ become_zero_after_update = true;
+ pRealized_entity->left_progress_blocking_element_cnt = 0;
+ break;
+ case TASK_ERROR_RUN_SUCCESS:
+ if (current_node != NULL && n_ary_tree_node_with_flag_is_blocking_flag_on(current_node)) {
+ (pRealized_entity->left_progress_blocking_element_cnt)--;
+
+ if (progress_blocking_realized_entity_is_zero_left_progress_blocking_element_cnt(pRealized_entity)) {
+ become_zero_after_update = true;
+ }
+ }
+ break;
+ case TASK_ERROR_NOT_YET_RUN:
+ if (current_node != NULL && task_spec_is_dynamic_container_task_spec(pTask->pTask_spec)) {
+ /* we can remove other dynamic case progress_blocking_element */
+
+ ec_uint can_remove_flag_on_cnt = 0;
+
+ n_ary_tree_node_with_flag_t *child_node = NULL;
+ for (child_node = current_node->first_child_node; child_node != NULL; child_node = child_node->next_sibling_node) {
+ if (child_node->dynamic_case != pTask->dynamic_case) {
+ can_remove_flag_on_cnt += n_ary_tree_node_with_flag_count_subtree_flag_on_number(child_node);
+ }
+ }
+
+ if (can_remove_flag_on_cnt > 0) {
+ (pRealized_entity->left_progress_blocking_element_cnt) -= can_remove_flag_on_cnt;
+
+ if (progress_blocking_realized_entity_is_zero_left_progress_blocking_element_cnt(pRealized_entity)) {
+ become_zero_after_update = true;
+ }
+ }
+ }
+ break;
+ default:
+ FW_LOGW("unknown task error returned\n");
+ become_zero_after_update = true;
+ pRealized_entity->left_progress_blocking_element_cnt = 0;
+ break;
+ }
+
+ return become_zero_after_update;
+}
+
+ec_boolean progress_blocking_realized_entity_is_zero_left_progress_blocking_element_cnt(progress_blocking_realized_entity_t *pRealized_entity)
+{
+ return pRealized_entity->left_progress_blocking_element_cnt == 0;
+}
diff --git a/framework/src/EngineController/task_cancel_info.c b/framework/src/EngineController/task_cancel_info.c
new file mode 100755
index 0000000..955e453
--- /dev/null
+++ b/framework/src/EngineController/task_cancel_info.c
@@ -0,0 +1,284 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#include <stdlib.h>
+#include "Utility/fw_log.h"
+#include "EngineController/task_message.h"
+#include "EngineController/task_cancel_info.h"
+
+#define LOG_TAG "AF_EC"
+
+static void task_cancel_info_destroy(task_cancel_info_t *pInfo)
+{
+ if (pInfo != NULL) {
+ if (pInfo->pRequestMsg != NULL) {
+ unref_refObject(pInfo->pRequestMsg);
+ }
+ if (pInfo->cancel_info_mutex != NULL) {
+ g_mutex_free(pInfo->cancel_info_mutex);
+ }
+ if (pInfo->cancel_callback_infos != NULL) {
+ GSList *iter = NULL;
+ cancel_callback_info_t *pCancel_callback_info = NULL;
+ for (iter = pInfo->cancel_callback_infos; iter != NULL; iter = g_slist_next(iter)) {
+ pCancel_callback_info = iter->data;
+ cancel_callback_info_destroy(pCancel_callback_info);
+ }
+ g_slist_free(pInfo->cancel_callback_infos);
+ }
+ free(pInfo);
+ }
+}
+
+cancel_callback_info_t *cancel_callback_info_init(GThread *who_registered, cancel_callback how_to_do, ec_pointer user_data)
+{
+ cancel_callback_info_t *pCancel_callback_info = (cancel_callback_info_t *)malloc(sizeof(cancel_callback_info_t));
+ if (pCancel_callback_info == NULL) {
+ goto error_part;
+ }
+
+ pCancel_callback_info->who_registered = who_registered;
+ pCancel_callback_info->how_to_do = how_to_do;
+ pCancel_callback_info->user_data = user_data;
+
+ return pCancel_callback_info;
+
+error_part:
+ cancel_callback_info_destroy(pCancel_callback_info);
+ return NULL;
+}
+
+ec_boolean cancel_callback_info_compare(cancel_callback_info_t *pCancel_callback_info, GThread *who_registered, cancel_callback how_to_do, ec_pointer user_data)
+{
+ FW_LOGD("started\n");
+ ec_boolean is_same = false;
+ if (pCancel_callback_info == NULL) {
+ FW_LOGW("pCancel_callback_info == NULL\n");
+ goto return_part;
+ }
+
+ if (pCancel_callback_info->who_registered == who_registered && pCancel_callback_info->how_to_do == how_to_do && pCancel_callback_info->user_data == user_data) {
+ is_same = true;
+ }
+
+return_part:
+ FW_LOGD("ended with return = %d\n", is_same);
+ return is_same;
+}
+
+void cancel_callback_info_call_callback(cancel_callback_info_t *pCancel_callback_info)
+{
+ FW_LOGD("started\n");
+ if (pCancel_callback_info != NULL) {
+ /* call callback */
+ FW_LOGD("cancel callback will be called by thread (thread structure = %p)\n", pCancel_callback_info->who_registered);
+ FW_LOGD("before call cancel callback\n");
+ pCancel_callback_info->how_to_do(pCancel_callback_info->user_data);
+ FW_LOGD("after call cancel callback\n");
+ } else {
+ FW_LOGW("pCancel_callback_info = NULL. Do nothing\n");
+ }
+ FW_LOGD("ended\n");
+}
+
+void cancel_callback_info_destroy(cancel_callback_info_t *pCancel_callback_info)
+{
+ FW_LOGD("started\n");
+ if (pCancel_callback_info != NULL) {
+ free(pCancel_callback_info);
+ } else {
+ FW_LOGW("pCancel_callback_info = NULL. Do nothing\n");
+ }
+ FW_LOGD("ended\n");
+}
+
+task_cancel_info_t *task_cancel_info_init(refObject_t *pRequestMsg)
+{
+ task_cancel_info_t *pInfo = (task_cancel_info_t *)calloc(1, sizeof(task_cancel_info_t));
+ if (pInfo == NULL) {
+ goto error_part;
+ }
+
+ pInfo->cancel_info_mutex = g_mutex_new();
+ if (pInfo->cancel_info_mutex == NULL) {
+ goto error_part;
+ }
+ pInfo->cancel_flag = false;
+ pInfo->pRequestMsg = getRef(pRequestMsg);
+ pInfo->ref_count = 1;
+
+ return pInfo;
+
+error_part:
+ task_cancel_info_destroy(pInfo);
+ return NULL;
+}
+
+task_cancel_info_t *task_cancel_info_ref(task_cancel_info_t *pInfo)
+{
+ if (pInfo == NULL) {
+ return NULL;
+ }
+
+ g_atomic_int_inc(&(pInfo->ref_count));
+
+ return pInfo;
+}
+
+void task_cancel_info_unref(task_cancel_info_t *pInfo)
+{
+ if (pInfo == NULL) {
+ return;
+ }
+
+ if (g_atomic_int_dec_and_test(&(pInfo->ref_count))) {
+ task_cancel_info_destroy(pInfo);
+ }
+}
+
+ec_boolean task_cancel_info_get_cancel_flag_atomic(task_cancel_info_t *pCancel_info)
+{
+ if (pCancel_info == NULL) {
+ FW_LOGE("pCancel_info == NULL\n");
+ return false;
+ }
+ return g_atomic_int_get(&(pCancel_info->cancel_flag));
+}
+
+void task_cancel_info_set_cancel_flag_atomic(task_cancel_info_t *pCancel_info)
+{
+ FW_LOGD("start\n");
+ if (pCancel_info == NULL) {
+ FW_LOGE("pCancel_info == NULL\n");
+ return;
+ }
+ g_atomic_int_set(&(pCancel_info->cancel_flag), true);
+ FW_LOGD("end\n");
+}
+
+ec_int task_cancel_info_get_request_msg_id(task_cancel_info_t *pCancel_info)
+{
+ FW_LOGD("start\n");
+ if (pCancel_info == NULL) {
+ FW_LOGE("pCancel_info == NULL\n");
+ return -1;
+ }
+ if (pCancel_info->pRequestMsg == NULL) {
+ FW_LOGE("pCancel_info->pRequestMsg == NULL\n");
+ return -1;
+ }
+
+ engine_controller_request_msg_t *pRequest_msg = (engine_controller_request_msg_t *)getData(pCancel_info->pRequestMsg);
+ FW_LOGD("end with return = %d\n", pRequest_msg->msg_head.msg_id);
+ return pRequest_msg->msg_head.msg_id;
+}
+
+void task_cancel_info_call_cancel_callbacks_unlocked(task_cancel_info_t *pCancel_info)
+{
+ FW_LOGD("start\n");
+ if (pCancel_info == NULL) {
+ FW_LOGE("pCancel_info == NULL\n");
+ return;
+ }
+
+ GSList *iter = NULL;
+ cancel_callback_info_t *pCancel_callback_info = NULL;
+ FW_LOGD("%d number of cancel callback is registered by threads of thread pool\n", g_slist_length(pCancel_info->cancel_callback_infos));
+ for (iter = pCancel_info->cancel_callback_infos; iter != NULL; iter = g_slist_next(iter)) {
+ pCancel_callback_info = iter->data;
+ cancel_callback_info_call_callback(pCancel_callback_info);
+ }
+ FW_LOGD("end\n");
+}
+
+engine_controller_error_t task_cancel_info_register_cancel_callback_unlocked(task_cancel_info_t *pCancel_info, cancel_callback callback_func, ec_pointer user_data)
+{
+ FW_LOGD("start\n");
+ engine_controller_error_t ec_error = ENGINE_CONTROLLER_OK;
+
+ if (pCancel_info == NULL) {
+ FW_LOGE("pCancel_info == NULL\n");
+ ec_error = ENGINE_CONTROLLER_INVALID_PARAMETER;
+ goto return_part;
+ }
+
+ /* create cancel callback info */
+ cancel_callback_info_t *pCancel_callback_info = cancel_callback_info_init(g_thread_self(), callback_func, user_data);
+ if (pCancel_callback_info == NULL) {
+ FW_LOGE("cancel_callback_info_init failed because of out of memory\n");
+ ec_error = ENGINE_CONTROLLER_OUT_OF_MEMORY;
+ goto return_part;
+ }
+
+ pCancel_info->cancel_callback_infos = g_slist_prepend(pCancel_info->cancel_callback_infos, pCancel_callback_info);
+
+return_part:
+ FW_LOGD("end with return = %d\n", ec_error);
+ return ec_error;
+}
+
+engine_controller_error_t task_cancel_info_unregister_cancel_callback_unlocked(task_cancel_info_t *pCancel_info, cancel_callback callback_func, ec_pointer user_data)
+{
+ FW_LOGD("start\n");
+ engine_controller_error_t ec_error = ENGINE_CONTROLLER_OK;
+
+ if (pCancel_info == NULL) {
+ FW_LOGE("pCancel_info == NULL\n");
+ ec_error = ENGINE_CONTROLLER_INVALID_PARAMETER;
+ goto return_part;
+ }
+
+ /* remove in callback list */
+ GThread *current_thread = g_thread_self();
+ GSList *iter = NULL;
+ cancel_callback_info_t *pCancel_callback_info = NULL;
+ ec_boolean is_same = false;
+ for (iter = pCancel_info->cancel_callback_infos; iter != NULL; iter = g_slist_next(iter)) {
+ pCancel_callback_info = iter->data;
+
+ is_same = cancel_callback_info_compare(pCancel_callback_info, current_thread, callback_func, user_data);
+ if (is_same) {
+ cancel_callback_info_destroy(pCancel_callback_info);
+ pCancel_info->cancel_callback_infos = g_slist_delete_link(pCancel_info->cancel_callback_infos, iter);
+ break;
+ }
+ }
+
+ FW_LOGD("no same callback exist in the list\n");
+
+return_part:
+ FW_LOGD("end with return = %d\n", ec_error);
+ return ec_error;
+}
diff --git a/framework/src/EngineController/task_error.c b/framework/src/EngineController/task_error.c
new file mode 100755
index 0000000..45d463e
--- /dev/null
+++ b/framework/src/EngineController/task_error.c
@@ -0,0 +1,64 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#include "EngineController/task_error.h"
+
+typedef struct task_error_map_s task_error_map_t;
+struct task_error_map_s {
+ task_error_t err;
+ ec_char *str;
+};
+
+static task_error_map_t task_error_string_tbl[5] = {
+ {TASK_ERROR_NOT_YET_RUN, "not yet run"},
+ {TASK_ERROR_RUN_SUCCESS, "success"},
+ {TASK_ERROR_RUN_FAILED, "failed"},
+ {TASK_ERROR_CANCELED, "canceled"},
+ {TASK_ERROR_INVALID_TASK, "invalid"}
+};
+
+ec_char *task_error_string(task_error_t error)
+{
+ ec_char *str = task_error_string_tbl[4].str;
+ ec_int i = 0;
+ for (i = 0; i < 5; i++) {
+ if (error == task_error_string_tbl[i].err) {
+ str = task_error_string_tbl[i].str;
+ break;
+ }
+ }
+
+ return str;
+}
diff --git a/framework/src/EngineController/task_info_pool.c b/framework/src/EngineController/task_info_pool.c
new file mode 100755
index 0000000..fded975
--- /dev/null
+++ b/framework/src/EngineController/task_info_pool.c
@@ -0,0 +1,194 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#include <stdlib.h>
+#include "Utility/fw_log.h"
+#include "EngineController/task_info_pool.h"
+#include "EngineController/queuing_rule_spec.h"
+
+#define LOG_TAG "AF_EC"
+
+task_info_t *task_info_new(ec_int task_spec_id, task_spec_t *pTask_spec)
+{
+ task_info_t *pTask_info = (task_info_t *)calloc(1, sizeof(task_info_t));
+ if (pTask_info == NULL) {
+ goto error_part;
+ }
+
+ pTask_info->task_spec_id = task_spec_id;
+ pTask_info->progress_blocking_entity_list = NULL;
+ pTask_info->pTask_spec = task_spec_ref(pTask_spec);
+
+ return pTask_info;
+
+error_part:
+ task_info_free(pTask_info);
+ return NULL;
+}
+
+void task_info_free(task_info_t *pTask_info)
+{
+ if (pTask_info != NULL) {
+ if (pTask_info->pTask_spec != NULL) {
+ task_spec_unref(pTask_info->pTask_spec);
+ }
+
+ if (pTask_info->progress_blocking_entity_list != NULL) {
+ GSList *iter = NULL;
+ progress_blocking_entity_t *pEntity = NULL;
+ for (iter = pTask_info->progress_blocking_entity_list; iter != NULL; iter = g_slist_next(iter)) {
+ pEntity = (progress_blocking_entity_t *)(iter->data);
+ progress_blocking_entity_unref(pEntity);
+ }
+ g_slist_free(pTask_info->progress_blocking_entity_list);
+ }
+
+ free(pTask_info);
+ }
+}
+
+task_info_t *task_info_ref(task_info_t *pTask_info)
+{
+ /* TODO */
+ return pTask_info;
+}
+
+void task_info_unref(task_info_t *pTask_info)
+{
+ /* TODO */
+}
+
+ec_boolean task_info_is_progress_blocking_entity_exist(task_info_t *pTask_info, progress_blocking_entity_t *pEntity)
+{
+ GSList *found_node = g_slist_find(pTask_info->progress_blocking_entity_list, pEntity);
+ if (found_node != NULL) {
+ return true;
+ }
+
+ return false;
+}
+
+engine_controller_error_t task_info_add_progress_blocking_entity(task_info_t *pTask_info, progress_blocking_entity_t *pEntity)
+{
+ engine_controller_error_t ec_error = ENGINE_CONTROLLER_OK;
+
+ if (task_info_is_progress_blocking_entity_exist(pTask_info, pEntity)) {
+ FW_LOGW("task info has already same entity");
+ goto return_part;
+ }
+
+ pTask_info->progress_blocking_entity_list = g_slist_prepend(pTask_info->progress_blocking_entity_list, pEntity);
+ /* TODO : error handling */
+
+return_part:
+ return ec_error;
+}
+
+engine_controller_error_t task_info_remove_blocking_entity(task_info_t *pTask_info, progress_blocking_entity_t *pEntity)
+{
+ engine_controller_error_t ec_error = ENGINE_CONTROLLER_OK;
+
+ if (!task_info_is_progress_blocking_entity_exist(pTask_info, pEntity)) {
+ FW_LOGW("task info has no such entity");
+ goto return_part;
+ }
+
+ pTask_info->progress_blocking_entity_list = g_slist_remove(pTask_info->progress_blocking_entity_list, pEntity);
+
+return_part:
+ return ec_error;
+}
+
+task_info_pool_t *task_info_pool_alloc()
+{
+ task_info_pool_t *pTask_info_pool = (task_info_pool_t *)calloc(1, sizeof(task_info_pool_t));
+ if (pTask_info_pool == NULL) {
+ goto return_part;
+ }
+
+ pTask_info_pool->pTask_info_pool = g_hash_table_new(g_direct_hash, g_direct_equal);
+ if (pTask_info_pool->pTask_info_pool == NULL) {
+ goto error_part;
+ }
+
+return_part:
+ return pTask_info_pool;
+
+error_part:
+ task_info_pool_free(pTask_info_pool);
+ return NULL;
+}
+
+void task_info_pool_free(task_info_pool_t *pTask_info_pool)
+{
+ if (pTask_info_pool != NULL) {
+ /* TODO */
+ }
+}
+
+ec_boolean task_info_pool_add_task_info(task_info_pool_t *pTask_info_pool, task_info_t *pTask_info, ec_boolean replace)
+{
+ ec_boolean success = false;
+
+ GHashTable *pHash = pTask_info_pool->pTask_info_pool;
+ if (replace) {
+ g_hash_table_replace(pHash, (gpointer) (pTask_info->task_spec_id), pTask_info); /* TODO : check free well done */
+ success = true;
+ } else {
+ gpointer tmp = g_hash_table_lookup(pHash, (gpointer) (pTask_info->task_spec_id));
+ if (tmp != NULL) {
+ success = false;
+ } else {
+ g_hash_table_insert(pHash, (gpointer) (pTask_info->task_spec_id), pTask_info);
+ }
+ }
+
+ return success;
+}
+
+ec_boolean task_info_pool_remove_task_info(task_info_pool_t *pTask_info_pool, ec_uint msg_type)
+{
+ /* TODO */
+ return true;
+}
+
+task_info_t *task_info_pool_search_task_info(task_info_pool_t *pTask_info_pool, ec_uint msg_type)
+{
+ GHashTable *pHash = pTask_info_pool->pTask_info_pool;
+ task_info_t *pTask_info = NULL;
+
+ pTask_info = (task_info_t *)g_hash_table_lookup(pHash, (gpointer) msg_type);
+ return pTask_info;
+}
diff --git a/framework/src/EngineController/task_message.c b/framework/src/EngineController/task_message.c
new file mode 100755
index 0000000..0488585
--- /dev/null
+++ b/framework/src/EngineController/task_message.c
@@ -0,0 +1,114 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#include <stdlib.h>
+#include "EngineController/task_message.h"
+
+/* lower priority, more urgent */
+ec_uint task_state_priority(task_state_t state)
+{
+ ec_uint priority = 0;
+ switch (state) {
+ case TASK_ROOT_START:
+ case TASK_ROOT_DONE:
+ case TASK_CANCEL:
+ case TASK_CANCEL_ALL:
+ priority = 0;
+ break;
+ case TASK_DONE:
+ priority = 1;
+ break;
+ case TASK_START:
+ priority = 2;
+ break;
+ }
+
+ return priority;
+}
+
+ec_int compare_priority_of_task_message_append_way(task_message_t *pTask_message1, task_message_t *pTask_message2, ec_pointer user_data)
+{
+ if (pTask_message1->priority < pTask_message2->priority) {
+ return -1;
+ } else if (pTask_message1->priority == pTask_message2->priority) {
+ return 0;
+ } else {
+ return 1;
+ }
+}
+
+ec_int compare_priority_of_task_message_prepend_way(task_message_t *pTask_message1, task_message_t *pTask_message2, ec_pointer user_data)
+{
+ if (pTask_message1->priority < pTask_message2->priority) {
+ return -1;
+ } else {
+ return 1;
+ }
+}
+
+task_message_t *task_message_create(task_state_t state, task_t *pTask, ec_uint request_msg_id)
+{
+ task_message_t *pTask_msg = (task_message_t *)calloc(1, sizeof(task_message_t));
+ if (pTask_msg == NULL) {
+ goto error_part;
+ }
+ pTask_msg->priority = task_state_priority(state);
+ pTask_msg->task_state = state;
+ if (state == TASK_CANCEL) {
+ pTask_msg->u.request_msg_id = request_msg_id;
+ } else if (state == TASK_CANCEL_ALL) {
+ /* nothing */
+ } else {
+ pTask_msg->u.pTask = task_ref_task(pTask);
+ }
+
+ return pTask_msg;
+error_part:
+ task_message_free(pTask_msg);
+ return NULL;
+}
+
+void task_message_free(task_message_t *pTask_msg)
+{
+ if (pTask_msg != NULL) {
+ if (pTask_msg->task_state != TASK_CANCEL) {
+ if (pTask_msg->u.pTask != NULL) {
+ task_unref_task(pTask_msg->u.pTask);
+ }
+ }
+
+ free(pTask_msg);
+ }
+}
diff --git a/framework/src/EngineController/task_pool.c b/framework/src/EngineController/task_pool.c
new file mode 100755
index 0000000..a3b5f2a
--- /dev/null
+++ b/framework/src/EngineController/task_pool.c
@@ -0,0 +1,121 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "EngineController/task_pool.h"
+
+task_pool_t *task_pool_create_task_pool()
+{
+ task_pool_t *pTask_pool = (task_pool_t *)calloc(1, sizeof(task_pool_t));
+ if (pTask_pool == NULL) {
+ goto return_part;
+ }
+
+ pTask_pool->pTask_hash = g_hash_table_new(g_direct_hash, g_direct_equal);
+ if (pTask_pool->pTask_hash == NULL) {
+ goto error_part;
+ }
+
+return_part:
+ return pTask_pool;
+
+error_part:
+ task_pool_free_task_pool(pTask_pool);
+ return NULL;
+}
+
+void task_pool_free_task_pool(task_pool_t *pTask_pool)
+{
+ if (pTask_pool != NULL) {
+ GHashTable *pTask_hash = pTask_pool->pTask_hash;
+ if (pTask_hash != NULL) {
+ GHashTableIter iter;
+ ec_int *request_msg_id_key = NULL;
+ task_t *pTask = NULL;
+ g_hash_table_iter_init(&iter, pTask_hash);
+ while (g_hash_table_iter_next(&iter, (void **)&request_msg_id_key, (void **)&pTask)) {
+ if (pTask != NULL) {
+ task_unref_task(pTask);
+ }
+ }
+
+ g_hash_table_destroy(pTask_hash);
+ }
+
+ free(pTask_pool);
+ }
+}
+
+void task_pool_add_task(task_pool_t *pTask_pool, ec_uint request_id, task_t *pTask)
+{
+ g_hash_table_insert(pTask_pool->pTask_hash, (gpointer) request_id, (gpointer) task_ref_task(pTask));
+}
+
+task_t *task_pool_fetch_task(task_pool_t *pTask_pool, ec_uint request_id)
+{
+ GHashTable *pTask_hash = pTask_pool->pTask_hash;
+ task_t *pTask = (task_t *)g_hash_table_lookup(pTask_hash, (gconstpointer) request_id);
+
+ if (pTask != NULL) {
+ return task_ref_task(pTask);
+ } else {
+ return NULL;
+ }
+}
+
+GList *task_pool_fetch_all_tasks(task_pool_t *pTask_pool)
+{
+ GList *all_task_list = g_hash_table_get_values(pTask_pool->pTask_hash);
+ GList *iter = NULL;
+ task_t *pTask = NULL;
+ for (iter = all_task_list; iter != NULL; iter = g_list_next(iter)) {
+ pTask = iter->data;
+ task_ref_task(pTask);
+ }
+
+ return all_task_list;
+}
+
+void task_pool_remove_task(task_pool_t *pTask_pool, ec_uint request_id)
+{
+ GHashTable *pTask_hash = pTask_pool->pTask_hash;
+ task_t *pTask = (task_t *)g_hash_table_lookup(pTask_hash, (gconstpointer) request_id);
+ if (pTask != NULL) {
+ task_unref_task(pTask);
+ g_hash_table_remove(pTask_hash, (gconstpointer) request_id);
+ }
+}
diff --git a/framework/src/EngineController/task_process.c b/framework/src/EngineController/task_process.c
new file mode 100755
index 0000000..cfab13c
--- /dev/null
+++ b/framework/src/EngineController/task_process.c
@@ -0,0 +1,88 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#include <glib.h>
+#include "EngineController/task_process.h"
+#include "EngineController/task_cancel_info.h"
+#include "Utility/fw_log.h"
+#include "Utility/fw_assert.h"
+
+#define LOG_TAG "AF_EC"
+
+extern GPrivate *pCancel_TSK;
+
+ec_boolean task_process_check_cancel_flag(void)
+{
+ task_cancel_info_t *pCancel_info = g_private_get(pCancel_TSK);
+
+ return task_cancel_info_get_cancel_flag_atomic(pCancel_info);
+}
+
+void task_process_register_cancel_callback_when_cancel_flag_off(process_cancel_callback callback_func, ec_pointer user_data)
+{
+ task_cancel_info_t *pCancel_info = g_private_get(pCancel_TSK);
+
+ g_mutex_lock(pCancel_info->cancel_info_mutex);
+ if (!task_cancel_info_get_cancel_flag_atomic(pCancel_info)) {
+ FW_LOGD("cancel flag is off. Register cancel callback\n");
+ engine_controller_error_t ec_error = task_cancel_info_register_cancel_callback_unlocked(pCancel_info, callback_func, user_data);
+ fw_assert_condition(ec_error == ENGINE_CONTROLLER_OK, "task_cancel_info_register_cancel_callback_unlocked failed\n");
+ } else {
+ FW_LOGD("cancel flag is on. Do nothing\n");
+ }
+ g_mutex_unlock(pCancel_info->cancel_info_mutex);
+}
+
+void task_process_unregister_cancel_callback_when_cancel_flag_off(process_cancel_callback callback_func, ec_pointer user_data)
+{
+ task_cancel_info_t *pCancel_info = g_private_get(pCancel_TSK);
+
+ g_mutex_lock(pCancel_info->cancel_info_mutex);
+ if (!task_cancel_info_get_cancel_flag_atomic(pCancel_info)) {
+ FW_LOGD("cancel flag is off. Unregister cancel callback\n");
+ engine_controller_error_t ec_error = task_cancel_info_unregister_cancel_callback_unlocked(pCancel_info, callback_func, user_data);
+ fw_assert_condition(ec_error == ENGINE_CONTROLLER_OK, "task_cancel_info_unregister_cancel_callback_unlocked failed\n");
+ } else {
+ FW_LOGD("cancel flag is on. Do nothing\n");
+ }
+ g_mutex_unlock(pCancel_info->cancel_info_mutex);
+}
+
+ec_int task_process_get_self_request_id(void)
+{
+ task_cancel_info_t *pCancel_info = g_private_get(pCancel_TSK);
+
+ return task_cancel_info_get_request_msg_id(pCancel_info);
+}
diff --git a/framework/src/EngineController/task_spec.c b/framework/src/EngineController/task_spec.c
new file mode 100755
index 0000000..5fffabe
--- /dev/null
+++ b/framework/src/EngineController/task_spec.c
@@ -0,0 +1,1043 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include "Utility/fw_log.h"
+#include "EngineController/task_spec.h"
+#include "EngineController/task_spec_internal.h"
+#include "EngineController/param_spec_internal.h"
+
+#define LOG_TAG "AF_EC"
+
+static task_spec_t *task_spec_new_default_task_spec(ec_char *task_name, ec_pointer post_task_func_usr_data, post_task_callback_func post_task_callback, ec_uint param_cnt, param_spec **param_spec_array);
+static void task_spec_free_task_spec(task_spec_t *pTask_spec);
+
+static child_tasks_info_t *task_spec_new_child_tasks_info(ec_uint parent_param_cnt, ec_uint child_task_cnt, task_spec_t **child_task_array);
+
+static void task_spec_free_child_tasks_info(child_tasks_info_t *pChild_task_info);
+
+static dynamic_container_task_specific_t *task_spec_new_dynamic_container_task_specific(ec_uint parent_param_cnt, calculate_case_callback_func calculate_case_func, ec_uint case_cnt, ec_int *case_array, ec_uint *child_task_cnt_array, task_spec_t ***child_task_array_per_case_array);
+
+static void task_spec_free_dynamic_container_task_specific(dynamic_container_task_specific_t *pDynamic_container_task_specific);
+
+static param_spec *task_spec_find_param_spec(task_spec_t *pTask_spec, ec_int param_index);
+
+static engine_controller_error_t task_spec_validate_container_task_spec(task_spec_t *pContainer_task_spec);
+
+static engine_controller_error_t task_spec_validate_dynamic_container_task_spec(task_spec_t *pDynamic_container_task_spec);
+
+static engine_controller_error_t task_spec_validate_param_index(task_spec_t *pTask_spec, ec_int param_index);
+
+static engine_controller_error_t task_spec_validate_set_control_flow_input_parameters(task_spec_t *pContainer_task_spec, ec_int from_task_index, ec_int to_task_index);
+
+static engine_controller_error_t task_spec_validate_set_control_flow_input_parameters_on_dynamic_case(ec_int dynamic_case, task_spec_t *pDynamic_container_task_spec, ec_int from_task_index, ec_int to_task_index);
+
+static engine_controller_error_t task_spec_validate_set_data_flow_input_parameters(task_spec_t *pContainer_task_spec, ec_int from_task_index, ec_int from_param_index, ec_int to_task_index, ec_int to_param_index);
+
+static engine_controller_error_t task_spec_validate_set_data_flow_input_parameters_on_dynamic_case(ec_int dynamic_case, task_spec_t *pContainer_task_spec, ec_int from_task_index, ec_int from_param_index, ec_int to_task_index, ec_int to_param_index);
+
+data_flow_edges_t *data_flow_edges_new(ec_int parent_task_param_cnt, ec_uint child_task_cnt, task_spec_t **child_task_array)
+{
+ ec_int i = 0;
+ ec_int total_param_cnt = 0;
+
+ data_flow_edges_t *pData_flow_edges = (data_flow_edges_t *)calloc(1, sizeof(data_flow_edges_t));
+ if (pData_flow_edges == NULL) {
+ goto error_part;
+ }
+
+ pData_flow_edges->child_task_param_start_index_array = (ec_int *)calloc(child_task_cnt, sizeof(ec_int));
+ if (pData_flow_edges->child_task_param_start_index_array == NULL) {
+ goto error_part;
+ }
+
+ /* compute total param cnt and child_task_param_start_index_array */
+ total_param_cnt = parent_task_param_cnt;
+ for (i = 0; i < child_task_cnt; i++) {
+ pData_flow_edges->child_task_param_start_index_array[i] = total_param_cnt;
+ total_param_cnt += child_task_array[i]->task_param_cnt;
+ }
+
+ pData_flow_edges->child_task_cnt = child_task_cnt;
+ pData_flow_edges->total_param_cnt = total_param_cnt;
+
+ ec_int *from_param_array = (ec_int *)malloc(total_param_cnt * sizeof(ec_int));
+ if (from_param_array == NULL) {
+ goto error_part;
+ }
+
+ pData_flow_edges->from_param_array = from_param_array;
+ for (i = 0; i < total_param_cnt; i++) {
+ from_param_array[i] = -1; /* when -1, no from_param exist */
+ }
+
+ return pData_flow_edges;
+
+error_part:
+ data_flow_edges_free(pData_flow_edges);
+ return NULL;
+}
+
+void data_flow_edges_free(data_flow_edges_t *pData_flow_edges)
+{
+ if (pData_flow_edges != NULL) {
+ if (pData_flow_edges->child_task_param_start_index_array != NULL) {
+ free(pData_flow_edges->child_task_param_start_index_array);
+ }
+
+ if (pData_flow_edges->from_param_array != NULL) {
+ free(pData_flow_edges->from_param_array);
+ }
+
+ free(pData_flow_edges);
+ }
+}
+
+ec_int data_flow_edges_compute_internal_index(data_flow_edges_t *pData_flow_edges, ec_int task_index, ec_int param_index)
+{
+ ec_int *child_task_param_start_index_array = pData_flow_edges->child_task_param_start_index_array;
+
+ if (task_index == -1) {
+ return param_index;
+ } else {
+ return param_index + child_task_param_start_index_array[task_index];
+ }
+}
+
+ec_boolean data_flow_edges_compute_task_index_and_param_index(data_flow_edges_t *pData_flow_edges, ec_int internal_index, ec_int *pTask_index, ec_int *pParam_index)
+{
+ ec_boolean valid_internal_index = false;
+ ec_int task_index = -1;
+ ec_int param_index = -1;
+ ec_int i = 0;
+
+ if (internal_index >= 0 && internal_index < pData_flow_edges->total_param_cnt) {
+ valid_internal_index = true;
+
+ for (i = 0; i < pData_flow_edges->child_task_cnt; i++) {
+ if (internal_index < pData_flow_edges->child_task_param_start_index_array[i]) {
+ task_index = i - 1;
+
+ if (i == 0) {
+ param_index = internal_index;
+ } else {
+ param_index = internal_index - pData_flow_edges->child_task_param_start_index_array[i - 1];
+ }
+ break;
+ }
+ }
+
+ if (i == pData_flow_edges->child_task_cnt) {
+ task_index = i - 1;
+ param_index = internal_index - pData_flow_edges->child_task_param_start_index_array[i - 1];
+ }
+
+ *pTask_index = task_index;
+ *pParam_index = param_index;
+ }
+
+ return valid_internal_index;
+}
+
+ec_boolean data_flow_edges_add_edge(data_flow_edges_t *pData_flow_edges, ec_int from_task_index, ec_int from_param_index, ec_int to_task_index, ec_int to_param_index)
+{
+ ec_boolean success = false;
+
+ ec_int from_param_internal_index = data_flow_edges_compute_internal_index(pData_flow_edges, from_task_index, from_param_index);
+ ec_int to_param_internal_index = data_flow_edges_compute_internal_index(pData_flow_edges, to_task_index, to_param_index);
+
+ /* record edge */
+ if (pData_flow_edges->from_param_array[to_param_internal_index] == -1) { /* -1 means no from param exist */
+ success = true;
+ pData_flow_edges->from_param_array[to_param_internal_index] = from_param_internal_index;
+ }
+
+ return success;
+}
+
+/* TODO : make this function accessible by other operation file */
+ec_boolean data_flow_edges_get_from_param_info(data_flow_edges_t *pData_flow_edges, ec_int to_task_index, ec_int to_param_index, ec_int *from_task_index, ec_int *from_param_index)
+{
+ ec_boolean from_part_exist = false;
+
+ ec_int to_internal_index = data_flow_edges_compute_internal_index(pData_flow_edges, to_task_index, to_param_index);
+ ec_int from_internal_index = pData_flow_edges->from_param_array[to_internal_index];
+ if (from_internal_index != -1) {
+ data_flow_edges_compute_task_index_and_param_index(pData_flow_edges, from_internal_index, from_task_index, from_param_index);
+ from_part_exist = true;
+ }
+
+ return from_part_exist;
+}
+
+task_spec_t *task_spec_get_child_task_spec_from_child_task_info(child_tasks_info_t *pChild_tasks_info, ec_uint child_task_index)
+{
+ if (0 <= child_task_index && child_task_index < pChild_tasks_info->child_task_cnt)
+ return pChild_tasks_info->child_task_array[child_task_index];
+ else
+ return NULL;
+}
+
+ec_uint *task_spec_duplicate_child_task_control_flow_in_degree(task_spec_t *pTask_spec)
+{
+ ec_uint *duplcated_child_task_control_flow_in_degree = NULL;
+
+ if (!task_spec_is_container_task_spec(pTask_spec)) {
+ goto error_part;
+ }
+
+ child_tasks_info_t *pChild_task_info = task_spec_find_child_tasks_info(pTask_spec);
+ ec_uint child_task_cnt = pChild_task_info->child_task_cnt;
+ ec_uint *child_task_control_flow_in_degree = pChild_task_info->child_task_control_flow_in_degree;
+
+ duplcated_child_task_control_flow_in_degree = (ec_uint *)malloc(child_task_cnt * sizeof(ec_uint));
+ if (duplcated_child_task_control_flow_in_degree == NULL) {
+ goto error_part;
+ }
+
+ memcpy(duplcated_child_task_control_flow_in_degree, child_task_control_flow_in_degree, child_task_cnt * sizeof(ec_uint));
+
+ return duplcated_child_task_control_flow_in_degree;
+
+error_part:
+ if (duplcated_child_task_control_flow_in_degree != NULL) {
+ free(duplcated_child_task_control_flow_in_degree);
+ }
+ return NULL;
+}
+
+ec_uint *task_spec_duplicate_child_task_control_flow_in_degree_on_dynamic_case(task_spec_t *pDynamic_task_spec, ec_int dynamic_case)
+{
+ ec_uint *duplcated_child_task_control_flow_in_degree = NULL;
+
+ if (!task_spec_is_dynamic_container_task_spec(pDynamic_task_spec)) {
+ goto error_part;
+ }
+
+ ec_uint child_task_cnt;
+ ec_uint *child_task_control_flow_in_degree;
+
+ child_tasks_info_t *pChild_task_info = task_spec_find_case_specific_child_tasks_info(pDynamic_task_spec, dynamic_case);
+ if (pChild_task_info != NULL) {
+ child_task_cnt = pChild_task_info->child_task_cnt;
+ child_task_control_flow_in_degree = pChild_task_info->child_task_control_flow_in_degree;
+ } else {
+ goto error_part;
+ }
+
+ duplcated_child_task_control_flow_in_degree = (ec_uint *)malloc(child_task_cnt * sizeof(ec_uint));
+ if (duplcated_child_task_control_flow_in_degree == NULL) {
+ goto error_part;
+ }
+
+ memcpy(duplcated_child_task_control_flow_in_degree, child_task_control_flow_in_degree, child_task_cnt * sizeof(ec_uint));
+
+ return duplcated_child_task_control_flow_in_degree;
+
+error_part:
+ if (duplcated_child_task_control_flow_in_degree != NULL) {
+ free(duplcated_child_task_control_flow_in_degree);
+ }
+ return NULL;
+}
+
+static task_spec_t *task_spec_new_default_task_spec(ec_char *task_name, ec_pointer post_task_func_usr_data, post_task_callback_func post_task_callback, ec_uint param_cnt, param_spec **param_spec_array)
+{
+ int i = 0;
+ task_spec_t *pTask = NULL;
+
+ /* TODO : input parameter validation */
+
+ pTask = (task_spec_t *)calloc(1, sizeof(task_spec_t));
+ if (pTask == NULL) {
+ goto return_part;
+ }
+
+ pTask->task_name = strdup(task_name);
+ if (pTask->task_name == NULL) {
+ goto error_part;
+ }
+
+ pTask->task_param_spec_array = (param_spec **)calloc(param_cnt, sizeof(param_spec *));
+ if (pTask->task_param_spec_array == NULL) {
+ goto error_part;
+ }
+
+ pTask->task_param_cnt = param_cnt;
+ for (i = 0; i < param_cnt; i++) {
+ pTask->task_param_spec_array[i] = param_spec_ref(param_spec_array[i]);
+ }
+
+ pTask->usr_post_task_func_data = post_task_func_usr_data;
+ pTask->post_func = post_task_callback;
+ pTask->ref_count = 1;
+
+return_part:
+ return pTask;
+
+error_part:
+ task_spec_free_task_spec(pTask);
+ return NULL;
+}
+
+static void task_spec_free_task_spec(task_spec_t *pTask_spec)
+{
+ if (pTask_spec != NULL) {
+ if (pTask_spec->task_name != NULL) {
+ free(pTask_spec->task_name);
+ }
+
+ if (pTask_spec->task_param_cnt > 0) {
+ int i = 0;
+ for (i = 0; i < pTask_spec->task_param_cnt; i++) {
+ param_spec_unref(pTask_spec->task_param_spec_array[i]);
+ }
+ }
+
+ /* TODO : child_parallel_task_list when container task */
+ /* TODO : usr_task_data */
+
+ free(pTask_spec);
+ }
+}
+
+static child_tasks_info_t *task_spec_new_child_tasks_info(ec_uint parent_param_cnt, ec_uint child_task_cnt, task_spec_t **child_task_array)
+{
+ ec_uint i = 0;
+ child_tasks_info_t *pChild_task_info = (child_tasks_info_t *)calloc(1, sizeof(child_tasks_info_t));
+
+ pChild_task_info->child_task_cnt = child_task_cnt;
+ pChild_task_info->child_task_array = (task_spec_t **)calloc(child_task_cnt, sizeof(task_spec_t *));
+ if (pChild_task_info->child_task_array == NULL) {
+ goto error_part;
+ }
+
+ for (i = 0; i < child_task_cnt; i++) {
+ pChild_task_info->child_task_array[i] = task_spec_ref(child_task_array[i]);
+ }
+
+ pChild_task_info->child_task_control_flow_in_degree = (ec_uint *)calloc(child_task_cnt, sizeof(ec_uint));
+ if (pChild_task_info->child_task_control_flow_in_degree == NULL) {
+ goto error_part;
+ }
+
+ pChild_task_info->pControl_edge_pool = graph_edge_pool_new();
+ if (pChild_task_info->pControl_edge_pool == NULL) {
+ goto error_part;
+ }
+
+ pChild_task_info->pData_flow_edges = data_flow_edges_new(parent_param_cnt, child_task_cnt, child_task_array);
+ if (pChild_task_info->pData_flow_edges == NULL) {
+ goto error_part;
+ }
+
+ return pChild_task_info;
+
+error_part:
+ task_spec_free_child_tasks_info(pChild_task_info);
+ return NULL;
+}
+
+static void task_spec_free_child_tasks_info(child_tasks_info_t *pChild_task_info)
+{
+ if (pChild_task_info != NULL) {
+ ec_uint cnt = pChild_task_info->child_task_cnt;
+ ec_uint i = 0;
+
+ if (pChild_task_info->pData_flow_edges != NULL) {
+ data_flow_edges_free(pChild_task_info->pData_flow_edges);
+ }
+
+ if (pChild_task_info->pControl_edge_pool != NULL) {
+ graph_edge_pool_free(pChild_task_info->pControl_edge_pool);
+ }
+
+ if (pChild_task_info->child_task_control_flow_in_degree != NULL) {
+ free(pChild_task_info->child_task_control_flow_in_degree);
+ }
+
+ if (pChild_task_info->child_task_array != NULL) {
+ for (i = 0; i < cnt; i++) {
+ task_spec_unref(pChild_task_info->child_task_array[i]);
+ }
+ free(pChild_task_info->child_task_array);
+ }
+
+ free(pChild_task_info);
+ }
+}
+
+static dynamic_container_task_specific_t *task_spec_new_dynamic_container_task_specific(ec_uint parent_param_cnt, calculate_case_callback_func calculate_case_func, ec_uint case_cnt, ec_int *case_array, ec_uint *child_task_cnt_array, task_spec_t ***child_task_array_per_case_array)
+{
+ ec_uint i = 0;
+ dynamic_container_task_specific_t *pDynamic_container_task_specific = (dynamic_container_task_specific_t *)calloc(1, sizeof(dynamic_container_task_specific_t));
+
+ pDynamic_container_task_specific->calculate_case_func = calculate_case_func;
+ pDynamic_container_task_specific->case_cnt = case_cnt;
+ pDynamic_container_task_specific->case_array = (ec_int *)malloc(case_cnt * sizeof(ec_int));
+ if (pDynamic_container_task_specific->case_array == NULL) {
+ goto error_part;
+ }
+ memcpy(pDynamic_container_task_specific->case_array, case_array, case_cnt * sizeof(ec_int));
+
+ pDynamic_container_task_specific->case_specific_child_task_info_array = (child_tasks_info_t **)calloc(case_cnt, sizeof(child_tasks_info_t));
+ if (pDynamic_container_task_specific->case_specific_child_task_info_array == NULL) {
+ goto error_part;
+ }
+
+ for (i = 0; i < case_cnt; i++) {
+ pDynamic_container_task_specific->case_specific_child_task_info_array[i] = task_spec_new_child_tasks_info(parent_param_cnt, child_task_cnt_array[i], child_task_array_per_case_array[i]);
+ if (pDynamic_container_task_specific->case_specific_child_task_info_array[i] == NULL) {
+ goto error_part;
+ }
+ }
+
+ return pDynamic_container_task_specific;
+
+error_part:
+ task_spec_free_dynamic_container_task_specific(pDynamic_container_task_specific);
+ return NULL;
+}
+
+static void task_spec_free_dynamic_container_task_specific(dynamic_container_task_specific_t *pDynamic_container_task_specific)
+{
+ if (pDynamic_container_task_specific != NULL) {
+ /* TODO */
+ }
+}
+
+child_tasks_info_t *task_spec_find_child_tasks_info(task_spec_t *pParent_container_task_spec)
+{
+ return pParent_container_task_spec->u.pContainer_task_specific;
+}
+
+child_tasks_info_t *task_spec_find_case_specific_child_tasks_info(task_spec_t *pParent_dynamic_task_spec, ec_int dynamic_case)
+{
+ child_tasks_info_t *pChild_task_info = NULL;
+
+ dynamic_container_task_specific_t *pDynmaic_container_task_specific = pParent_dynamic_task_spec->u.pDynmaic_container_task_specific;
+ ec_uint case_cnt = pDynmaic_container_task_specific->case_cnt;
+ ec_int *case_array = pDynmaic_container_task_specific->case_array;
+ child_tasks_info_t **case_specific_child_task_info_array = pDynmaic_container_task_specific->case_specific_child_task_info_array;
+
+ ec_uint i = 0;
+ for (i = 0; i < case_cnt; i++) {
+ if (case_array[i] == dynamic_case) {
+ pChild_task_info = case_specific_child_task_info_array[i];
+ break;
+ }
+ }
+
+ return pChild_task_info;
+}
+
+static param_spec *task_spec_find_param_spec(task_spec_t *pTask_spec, ec_int param_index)
+{
+ param_spec *pParam_spec = NULL;
+ ec_int param_cnt = task_spec_get_param_cnt(pTask_spec);
+ param_spec **param_spec_array = pTask_spec->task_param_spec_array;
+
+ if (param_index >= 0 && param_index < param_cnt) {
+ pParam_spec = param_spec_array[param_index];
+ }
+
+ return pParam_spec;
+}
+
+static engine_controller_error_t task_spec_validate_container_task_spec(task_spec_t *pContainer_task_spec)
+{
+ engine_controller_error_t err = ENGINE_CONTROLLER_OK;
+ if (pContainer_task_spec == NULL) {
+ err = ENGINE_CONTROLLER_INVALID_TASK;
+ goto error_part;
+ }
+
+ if (pContainer_task_spec->task_type != TASK_CONTAINER) {
+ if (pContainer_task_spec->task_type == TASK_SIMPLE || pContainer_task_spec->task_type == TASK_DYNAMIC_CONTAINER) {
+ err = ENGINE_CONTROLLER_MUST_USE_CONTAINER_TASK;
+ } else {
+ err = ENGINE_CONTROLLER_INVALID_TASK;
+ }
+ goto error_part;
+ }
+
+error_part:
+ return err;
+}
+
+static engine_controller_error_t task_spec_validate_dynamic_container_task_spec(task_spec_t *pDynamic_container_task_spec)
+{
+ engine_controller_error_t err = ENGINE_CONTROLLER_OK;
+ if (pDynamic_container_task_spec == NULL) {
+ err = ENGINE_CONTROLLER_INVALID_TASK;
+ goto error_part;
+ }
+
+ if (pDynamic_container_task_spec->task_type != TASK_DYNAMIC_CONTAINER) {
+ if (pDynamic_container_task_spec->task_type == TASK_SIMPLE || pDynamic_container_task_spec->task_type == TASK_CONTAINER) {
+ err = ENGINE_CONTROLLER_MUST_USE_DYNAMIC_CONTAINER_TASK;
+ } else {
+ err = ENGINE_CONTROLLER_INVALID_TASK;
+ }
+ goto error_part;
+ }
+
+error_part:
+ return err;
+}
+
+/*
+engine_controller_error_t task_spec_attach_queuing_rule_spec(task_spec_t* pSpec, queuing_rule_spec_t* pQueuing_rule_spec)
+{
+ engine_controller_error_t err = ENGINE_CONTROLLER_OK;
+ GSList* listnode = g_slist_find(pSpec->queuing_rule_spec_list, pQueuing_rule_spec);
+ if (listnode != NULL) {
+ err = ENGINE_CONTROLLER_DUPLICATE_QUEUING_RULE_SPEC;
+ goto error_part;
+ }
+
+ pSpec->queuing_rule_spec_list = g_slist_prepend(pSpec->queuing_rule_spec_list, queuing_rule_spec_ref(pQueuing_rule_spec));
+
+ error_part:
+ return err;
+}
+*/
+
+engine_controller_error_t task_spec_valididate_child_task_index(task_spec_t *pContainer_task_spec, ec_int child_task_index)
+{
+ engine_controller_error_t err = ENGINE_CONTROLLER_OK;
+
+ task_spec_t *pChild_task_spec = task_spec_get_child_task_spec(pContainer_task_spec, child_task_index);
+ if (pChild_task_spec == NULL) {
+ err = ENGINE_CONTROLLER_INVALID_CHILD_TASK_INDEX;
+ }
+
+ return err;
+}
+
+engine_controller_error_t task_spec_valididate_child_task_index_on_dynamic_case(ec_int dynamic_case, task_spec_t *pDynamic_container_task_spec, ec_int child_task_index)
+{
+ engine_controller_error_t err = ENGINE_CONTROLLER_OK;
+
+ task_spec_t *pChild_task_spec = task_spec_get_child_task_spec_on_dynamic_case(dynamic_case,
+ pDynamic_container_task_spec,
+ child_task_index);
+ if (pChild_task_spec == NULL) {
+ err = ENGINE_CONTROLLER_INVALID_CHILD_TASK_INDEX;
+ }
+
+ return err;
+}
+
+static engine_controller_error_t task_spec_validate_param_index(task_spec_t *pTask_spec, ec_int param_index)
+{
+ engine_controller_error_t err = ENGINE_CONTROLLER_OK;
+
+ param_spec *pParam_spec = task_spec_find_param_spec(pTask_spec, param_index);
+ if (pParam_spec == NULL) {
+ err = ENGINE_CONTROLLER_INVALID_PARAM_INDEX;
+ }
+
+ return err;
+}
+
+static engine_controller_error_t task_spec_validate_set_control_flow_input_parameters(task_spec_t *pContainer_task_spec, ec_int from_task_index, ec_int to_task_index)
+{
+ engine_controller_error_t err = ENGINE_CONTROLLER_OK;
+
+ err = task_spec_validate_container_task_spec(pContainer_task_spec);
+ if (err != ENGINE_CONTROLLER_OK) {
+ goto error_part;
+ }
+
+ err = task_spec_valididate_child_task_index(pContainer_task_spec, from_task_index);
+ if (err != ENGINE_CONTROLLER_OK) {
+ goto error_part;
+ }
+
+ err = task_spec_valididate_child_task_index(pContainer_task_spec, to_task_index);
+
+error_part:
+ return err;
+}
+
+static engine_controller_error_t task_spec_validate_set_control_flow_input_parameters_on_dynamic_case(ec_int dynamic_case, task_spec_t *pDynamic_container_task_spec, ec_int from_task_index, ec_int to_task_index)
+{
+ engine_controller_error_t err = ENGINE_CONTROLLER_OK;
+
+ err = task_spec_validate_dynamic_container_task_spec(pDynamic_container_task_spec);
+ if (err != ENGINE_CONTROLLER_OK) {
+ goto error_part;
+ }
+
+ err = task_spec_valididate_child_task_index_on_dynamic_case(dynamic_case, pDynamic_container_task_spec, from_task_index);
+ if (err != ENGINE_CONTROLLER_OK) {
+ goto error_part;
+ }
+
+ err = task_spec_valididate_child_task_index_on_dynamic_case(dynamic_case, pDynamic_container_task_spec, to_task_index);
+
+error_part:
+ return err;
+}
+
+static engine_controller_error_t task_spec_validate_set_data_flow_input_parameters(task_spec_t *pContainer_task_spec, ec_int from_task_index, ec_int from_param_index, ec_int to_task_index, ec_int to_param_index)
+{
+ engine_controller_error_t err = ENGINE_CONTROLLER_OK;
+
+ err = task_spec_validate_container_task_spec(pContainer_task_spec);
+ if (err != ENGINE_CONTROLLER_OK) {
+ goto error_part;
+ }
+
+ task_spec_t *pFrom_task_spec = NULL;
+ task_spec_t *pTo_task_spec = NULL;
+ if (from_task_index != -1) {
+ err = task_spec_valididate_child_task_index(pContainer_task_spec, from_task_index);
+ if (err != ENGINE_CONTROLLER_OK) {
+ goto error_part;
+ }
+
+ pFrom_task_spec = task_spec_get_child_task_spec(pContainer_task_spec, from_task_index);
+ } else {
+ pFrom_task_spec = pContainer_task_spec;
+ }
+ err = task_spec_validate_param_index(pFrom_task_spec, from_param_index);
+ if (err != ENGINE_CONTROLLER_OK) {
+ goto error_part;
+ }
+
+ if (to_task_index != -1) {
+ err = task_spec_valididate_child_task_index(pContainer_task_spec, to_task_index);
+ if (err != ENGINE_CONTROLLER_OK) {
+ goto error_part;
+ }
+
+ pTo_task_spec = task_spec_get_child_task_spec(pContainer_task_spec, to_task_index);
+ } else {
+ pTo_task_spec = pContainer_task_spec;
+ }
+ err = task_spec_validate_param_index(pTo_task_spec, to_param_index);
+
+error_part:
+ return err;
+}
+
+static engine_controller_error_t task_spec_validate_set_data_flow_input_parameters_on_dynamic_case(ec_int dynamic_case, task_spec_t *pDynamic_container_task_spec, ec_int from_task_index, ec_int from_param_index, ec_int to_task_index, ec_int to_param_index)
+{
+ engine_controller_error_t err = ENGINE_CONTROLLER_OK;
+
+ err = task_spec_validate_dynamic_container_task_spec(pDynamic_container_task_spec);
+ if (err != ENGINE_CONTROLLER_OK) {
+ goto error_part;
+ }
+
+ task_spec_t *pFrom_task_spec = NULL;
+ task_spec_t *pTo_task_spec = NULL;
+ if (from_task_index != -1) {
+ err = task_spec_valididate_child_task_index_on_dynamic_case(dynamic_case, pDynamic_container_task_spec, from_task_index);
+ if (err != ENGINE_CONTROLLER_OK) {
+ goto error_part;
+ }
+
+ pFrom_task_spec = task_spec_get_child_task_spec_on_dynamic_case(dynamic_case, pDynamic_container_task_spec, from_task_index);
+ } else {
+ pFrom_task_spec = pDynamic_container_task_spec;
+ }
+ err = task_spec_validate_param_index(pFrom_task_spec, from_param_index);
+ if (err != ENGINE_CONTROLLER_OK) {
+ goto error_part;
+ }
+
+ if (to_task_index != -1) {
+ err = task_spec_valididate_child_task_index_on_dynamic_case(dynamic_case, pDynamic_container_task_spec, to_task_index);
+ if (err != ENGINE_CONTROLLER_OK) {
+ goto error_part;
+ }
+
+ pTo_task_spec = task_spec_get_child_task_spec_on_dynamic_case(dynamic_case, pDynamic_container_task_spec, to_task_index);
+ } else {
+ pTo_task_spec = pDynamic_container_task_spec;
+ }
+ err = task_spec_validate_param_index(pTo_task_spec, to_param_index);
+
+error_part:
+ return err;
+}
+
+task_spec_t *task_spec_alloc_simple_task_spec(ec_char *task_name, TASK_PROCESS task_process, ec_pointer post_task_func_usr_data, post_task_callback_func post_task_callback, ec_uint param_cnt, param_spec **param_spec_array)
+{
+ task_spec_t *pTask = NULL;
+
+ pTask = task_spec_new_default_task_spec(task_name, post_task_func_usr_data, post_task_callback, param_cnt, param_spec_array);
+
+ if (pTask == NULL) {
+ return NULL;
+ }
+ pTask->task_type = TASK_SIMPLE;
+ pTask->u.task_process = task_process;
+
+ return pTask;
+}
+
+task_spec_t *task_spec_ref(task_spec_t *pTask_spec)
+{
+ if (pTask_spec == NULL) {
+ return NULL;
+ }
+
+ g_atomic_int_inc(&(pTask_spec->ref_count));
+
+ return pTask_spec;
+}
+
+void task_spec_unref(task_spec_t *pTask_spec)
+{
+ if (pTask_spec == NULL) {
+ return;
+ }
+
+ if (g_atomic_int_dec_and_test(&(pTask_spec->ref_count))) {
+ task_spec_free_task_spec(pTask_spec);
+ }
+}
+
+ec_boolean task_spec_is_same(task_spec_t *pTask_spec1, task_spec_t *pTask_spec2)
+{
+ if (pTask_spec1 == pTask_spec2) {
+ return true;
+ }
+ return false;
+}
+
+ec_boolean task_spec_is_simple_task_spec(task_spec_t *pTask_spec)
+{
+ if (pTask_spec == NULL) {
+ FW_LOGW("pTask_spec == NULL\n");
+ return false;
+ }
+
+ if (pTask_spec->task_type == TASK_SIMPLE) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+ec_boolean task_spec_is_container_task_spec(task_spec_t *pTask_spec)
+{
+ if (pTask_spec == NULL) {
+ FW_LOGW("pTask_spec == NULL\n");
+ return false;
+ }
+
+ if (pTask_spec->task_type == TASK_CONTAINER) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+ec_boolean task_spec_is_dynamic_container_task_spec(task_spec_t *pTask_spec)
+{
+ if (pTask_spec == NULL) {
+ FW_LOGW("pTask_spec == NULL\n");
+ return false;
+ }
+
+ if (pTask_spec->task_type == TASK_DYNAMIC_CONTAINER) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+ec_uint task_spec_get_child_task_cnt(task_spec_t *pTask_spec)
+{
+ if (task_spec_is_container_task_spec(pTask_spec)) {
+ return pTask_spec->u.pContainer_task_specific->child_task_cnt;
+ } else {
+ return 0;
+ }
+}
+
+task_spec_t *task_spec_get_child_task_spec(task_spec_t *pParent_task_spec, ec_int child_task_index)
+{
+ task_spec_t *pChild_task_spec = NULL;
+
+ child_tasks_info_t *pChild_task_info = task_spec_find_child_tasks_info(pParent_task_spec);
+ pChild_task_spec = task_spec_get_child_task_spec_from_child_task_info(pChild_task_info, child_task_index);
+
+ return pChild_task_spec;
+}
+
+ec_uint task_spec_get_child_task_cnt_on_dynamic_case(task_spec_t *pDynamic_task_spec, ec_int dynamic_case)
+{
+ if (task_spec_is_dynamic_container_task_spec(pDynamic_task_spec)) {
+ child_tasks_info_t *pChild_task_info = task_spec_find_case_specific_child_tasks_info(pDynamic_task_spec, dynamic_case);
+ if (pChild_task_info != NULL) {
+ return pChild_task_info->child_task_cnt;
+ } else {
+ return 0;
+ }
+ } else {
+ return 0;
+ }
+}
+
+task_spec_t *task_spec_get_child_task_spec_on_dynamic_case(ec_int dynamic_case, task_spec_t *pParent_dynamic_task_spec, ec_int child_task_index)
+{
+ task_spec_t *pChild_task_spec = NULL;
+
+ engine_controller_error_t ec_error = task_spec_validate_dynamic_container_task_spec(pParent_dynamic_task_spec);
+ if (ec_error != ENGINE_CONTROLLER_OK) {
+ goto error_part;
+ }
+
+ child_tasks_info_t *pChild_task_info = task_spec_find_case_specific_child_tasks_info(pParent_dynamic_task_spec, dynamic_case);
+ pChild_task_spec = task_spec_get_child_task_spec_from_child_task_info(pChild_task_info, child_task_index);
+
+ return pChild_task_spec;
+
+error_part:
+ return NULL;
+}
+
+ec_int task_spec_get_param_cnt(task_spec_t *pTask_spec)
+{
+ return pTask_spec->task_param_cnt;
+}
+
+calculate_case_callback_func task_spec_get_calculate_case_callback_func(task_spec_t *pDynamic_container_task_spec)
+{
+ return pDynamic_container_task_spec->u.pDynmaic_container_task_specific->calculate_case_func;
+}
+
+ec_boolean task_spec_get_output_param_info(task_spec_t *pTask_spec, ec_int *pOutput_param_cnt, ec_int **pOutput_param_index_array)
+{
+ if (pTask_spec == NULL || pOutput_param_cnt == NULL || pOutput_param_index_array == NULL) {
+ goto error_part;
+ }
+
+ ec_int i = 0;
+ ec_int param_cnt = task_spec_get_param_cnt(pTask_spec);
+ param_spec **task_param_spec_array = pTask_spec->task_param_spec_array;
+
+ ec_int output_param_cnt = 0;
+ ec_int *output_param_index_array = NULL;
+ output_param_index_array = (ec_int *)calloc(param_cnt, sizeof(ec_int));
+ if (output_param_index_array == NULL) {
+ goto error_part;
+ }
+
+ param_spec *pParam_spec = NULL;
+ for (i = 0; i < param_cnt; i++) {
+ pParam_spec = task_param_spec_array[i];
+ if (is_output_flag_on(pParam_spec->flags)) {
+ output_param_index_array[output_param_cnt] = i;
+ output_param_cnt++;
+ }
+ }
+
+ *pOutput_param_cnt = output_param_cnt;
+ *pOutput_param_index_array = output_param_index_array;
+
+ return true;
+
+error_part:
+
+ return false;
+}
+
+task_spec_t *task_spec_alloc_container_task_spec_outline(ec_char *task_name, ec_pointer usr_post_task_func_data, post_task_callback_func post_func, ec_uint param_cnt, param_spec **param_spec_array, ec_uint child_task_cnt, task_spec_t **child_task_array)
+{
+ task_spec_t *pTask_spec = NULL;
+
+ pTask_spec = task_spec_new_default_task_spec(task_name, usr_post_task_func_data, post_func, param_cnt, param_spec_array);
+
+ if (pTask_spec == NULL) {
+ return NULL;
+ }
+ pTask_spec->task_type = TASK_CONTAINER;
+ pTask_spec->u.pContainer_task_specific = task_spec_new_child_tasks_info(param_cnt, child_task_cnt, child_task_array);
+
+ if (pTask_spec->u.pContainer_task_specific == NULL) {
+ goto error_part;
+ }
+
+ return pTask_spec;
+
+error_part:
+ task_spec_free_task_spec(pTask_spec);
+ return NULL;
+}
+
+engine_controller_error_t task_spec_set_data_flow(task_spec_t *pContainer_task_spec, ec_int from_task_index, ec_int from_param_index, ec_int to_task_index, ec_int to_param_index)
+{
+ engine_controller_error_t err = ENGINE_CONTROLLER_OK;
+
+ /* validation */
+ err = task_spec_validate_set_data_flow_input_parameters(pContainer_task_spec, from_task_index, from_param_index, to_task_index, to_param_index);
+ if (err != ENGINE_CONTROLLER_OK) {
+ goto error_part;
+ }
+
+ if (from_task_index != -1 && to_task_index != -1) {
+ /* add control flow */
+ err = task_spec_set_control_flow(pContainer_task_spec, from_task_index, to_task_index);
+ if (err != ENGINE_CONTROLLER_OK) {
+ goto error_part;
+ }
+ }
+
+ /* add data flow */
+ child_tasks_info_t *pChild_task_info = task_spec_find_child_tasks_info(pContainer_task_spec);
+ data_flow_edges_t *pData_flow_edges = pChild_task_info->pData_flow_edges;
+ if (!data_flow_edges_add_edge(pData_flow_edges, from_task_index, from_param_index, to_task_index, to_param_index)) {
+ err = ENGINE_CONTROLLER_DUPLICATE_DATA_FLOW_EDGE;
+ }
+
+error_part:
+ return err;
+}
+
+engine_controller_error_t task_spec_set_data_flow_on_dynamic_case(ec_int dynamic_case, task_spec_t *pDynamic_container_task_spec, ec_int from_task_index, ec_int from_param_index, ec_int to_task_index, ec_int to_param_index)
+{
+ engine_controller_error_t err = ENGINE_CONTROLLER_OK;
+
+ /* validation */
+ err = task_spec_validate_set_data_flow_input_parameters_on_dynamic_case(dynamic_case, pDynamic_container_task_spec, from_task_index, from_param_index, to_task_index, to_param_index);
+ if (err != ENGINE_CONTROLLER_OK) {
+ goto error_part;
+ }
+
+ if (from_task_index != -1 && to_task_index != -1) {
+ /* add control flow */
+ err = task_spec_set_control_flow_on_dynamic_case(dynamic_case, pDynamic_container_task_spec, from_task_index, to_task_index);
+ if (err != ENGINE_CONTROLLER_OK) {
+ goto error_part;
+ }
+ }
+
+ /* add data flow */
+ data_flow_edges_t *pData_flow_edges;
+ child_tasks_info_t *pChild_task_info = task_spec_find_case_specific_child_tasks_info(pDynamic_container_task_spec, dynamic_case);
+ if (pChild_task_info != NULL) {
+ pData_flow_edges = pChild_task_info->pData_flow_edges;
+ } else {
+ err = ENGINE_CONTROLLER_INVALID_TASK;
+ goto error_part;
+ }
+ if (!data_flow_edges_add_edge(pData_flow_edges, from_task_index, from_param_index, to_task_index, to_param_index)) {
+ err = ENGINE_CONTROLLER_DUPLICATE_DATA_FLOW_EDGE;
+ }
+
+error_part:
+ return err;
+}
+
+engine_controller_error_t task_spec_set_control_flow(task_spec_t *pContainer_task_spec, ec_int from_task_index, ec_int to_task_index)
+{
+ engine_controller_error_t err = ENGINE_CONTROLLER_OK;
+
+ err = task_spec_validate_set_control_flow_input_parameters(pContainer_task_spec, from_task_index, to_task_index);
+ if (err != ENGINE_CONTROLLER_OK) {
+ goto error_part;
+ }
+
+ child_tasks_info_t *pChild_task_info = task_spec_find_child_tasks_info(pContainer_task_spec);
+ graph_edge_pool_t *pControl_edge_pool = pChild_task_info->pControl_edge_pool;
+ ec_uint *control_flow_in_degree_array = pChild_task_info->child_task_control_flow_in_degree;
+
+ /* add edge and in_degree count */
+ if (graph_edge_pool_add_edge(pControl_edge_pool, (ec_constpointer) from_task_index, (ec_constpointer) to_task_index)) {
+ control_flow_in_degree_array[to_task_index]++;
+ }
+
+error_part:
+ return err;
+}
+
+engine_controller_error_t task_spec_set_control_flow_on_dynamic_case(ec_int dynamic_case, task_spec_t *pDynamic_container_task_spec, ec_int from_task_index, ec_int to_task_index)
+{
+ engine_controller_error_t err = ENGINE_CONTROLLER_OK;
+
+ err = task_spec_validate_set_control_flow_input_parameters_on_dynamic_case(dynamic_case, pDynamic_container_task_spec, from_task_index, to_task_index);
+ if (err != ENGINE_CONTROLLER_OK) {
+ goto error_part;
+ }
+
+ graph_edge_pool_t *pControl_edge_pool;
+ child_tasks_info_t *pChild_task_info = task_spec_find_case_specific_child_tasks_info(pDynamic_container_task_spec, dynamic_case);
+ if (pChild_task_info != NULL) {
+ pControl_edge_pool = pChild_task_info->pControl_edge_pool;
+ } else {
+ err = ENGINE_CONTROLLER_INVALID_TASK;
+ goto error_part;
+ }
+ ec_uint *control_flow_in_degree_array = pChild_task_info->child_task_control_flow_in_degree;
+
+ /* add edge and in_degree count */
+ if (graph_edge_pool_add_edge(pControl_edge_pool, (ec_constpointer) from_task_index, (ec_constpointer) to_task_index)) {
+ control_flow_in_degree_array[to_task_index]++;
+ }
+
+error_part:
+ return err;
+}
+
+task_spec_t *task_spec_alloc_dynamic_container_task_spec_outline(ec_char *task_name, ec_pointer usr_post_task_func_data, post_task_callback_func post_func, ec_uint param_cnt, param_spec **param_spec_array, calculate_case_callback_func calculate_case_func, ec_uint case_cnt, ec_int *case_array, ec_uint *child_task_cnt_array, task_spec_t ***child_task_array_per_case_array)
+{
+ task_spec_t *pTask_spec = NULL;
+
+ pTask_spec = task_spec_new_default_task_spec(task_name, usr_post_task_func_data, post_func, param_cnt, param_spec_array);
+
+ if (pTask_spec == NULL) {
+ return NULL;
+ }
+ pTask_spec->task_type = TASK_DYNAMIC_CONTAINER;
+ pTask_spec->u.pDynmaic_container_task_specific = task_spec_new_dynamic_container_task_specific(param_cnt, calculate_case_func, case_cnt, case_array, child_task_cnt_array, child_task_array_per_case_array);
+
+ if (pTask_spec->u.pDynmaic_container_task_specific == NULL) {
+ goto error_part;
+ }
+
+ return pTask_spec;
+
+error_part:
+ task_spec_free_task_spec(pTask_spec);
+ return NULL;
+}
diff --git a/framework/src/EngineController/thread_pool.c b/framework/src/EngineController/thread_pool.c
new file mode 100755
index 0000000..1e54fba
--- /dev/null
+++ b/framework/src/EngineController/thread_pool.c
@@ -0,0 +1,169 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "Utility/fw_log.h"
+#include "EngineController/param_spec.h"
+#include "EngineController/param_spec_internal.h"
+#include "EngineController/thread_pool.h"
+#include "EngineController/task_spec_internal.h"
+#include "EngineController/engine_controller_message.h"
+#include "EngineController/task_message.h"
+#include "EngineController/engine_controller_internal.h"
+
+#define LOG_TAG "AF_EC"
+
+void thread_pool_run_operation(task_t *pTask, gpointer user_data)
+{
+ FW_LOGD("started\n");
+
+ task_error_t err = TASK_ERROR_RUN_SUCCESS;
+ task_message_t *pTask_msg = NULL;
+ GPrivate *cancel_tsk = (GPrivate *) user_data;
+
+ if (pTask != NULL) {
+ task_spec_t *pTask_spec = pTask->pTask_spec;
+ FW_LOGD("run task\n");
+
+ /* set thread specific value related to cancellation */
+ g_private_set(cancel_tsk, task_cancel_info_ref(pTask->pCancel_Information));
+
+ /* run task */
+ if (pTask_spec->task_type == TASK_SIMPLE) {
+ err = task_run_simple_task(pTask);
+ } else if (pTask_spec->task_type == TASK_CONTAINER) {
+ err = TASK_ERROR_INVALID_TASK;
+ FW_LOGE("container task! only simple task can be put in thread pool\n");
+ } else {
+ err = TASK_ERROR_INVALID_TASK;
+ FW_LOGE("invalid task type. task type must be either simple or container\n");
+ }
+
+ /* set thread specific value related to cancellation */
+ /* Note that this part must be done before send_msg_to_engine_controller_with_compare_priority */
+ /* othrewise, we can lost pTask->pCancel_Information because of threading race between engine controller & thread inside thread pool */
+ task_cancel_info_unref(pTask->pCancel_Information);
+
+ /* send task result report to engine controller */
+ pTask_msg = task_message_create(TASK_DONE, pTask, 0);
+ send_msg_to_engine_controller_with_compare_priority(pTask_msg, compare_priority_of_task_message_append_way, NULL);
+
+ g_private_set(cancel_tsk, NULL);
+ }
+ FW_LOGD("ended\n");
+}
+
+/* TODO : change void to GDestroyNotify */
+GPrivate *thread_pool_create_cancel_TSK(void)
+{
+ return g_private_new(NULL);
+}
+
+GPrivate *thread_pool_get_cancel_TSK(thread_pool_t *pThread_pool)
+{
+ if (pThread_pool == NULL) {
+ return NULL;
+ }
+
+ return pThread_pool->cancel_tsk;
+}
+
+ec_uint thread_pool_get_max_thread_count(thread_pool_t *pThread_pool)
+{
+ if (pThread_pool == NULL) {
+ return 0;
+ }
+
+ return pThread_pool->max_thread_count;
+}
+
+thread_pool_t *thread_pool_alloc_and_init(ec_uint max_thread_count)
+{
+ if (!g_thread_supported()) {
+ g_thread_init(NULL);
+ }
+
+ thread_pool_t *pPool = (thread_pool_t *)calloc(1, sizeof(thread_pool_t));
+ if (pPool == NULL) {
+ goto error_part;
+ }
+
+ pPool->cancel_tsk = thread_pool_create_cancel_TSK();
+ if (pPool->cancel_tsk == NULL) {
+ goto error_part;
+ }
+
+ pPool->max_thread_count = max_thread_count;
+
+ pPool->pPool = g_thread_pool_new((GFunc) thread_pool_run_operation, pPool->cancel_tsk, max_thread_count, TRUE, NULL);
+ if (pPool->pPool == NULL) {
+ goto error_part;
+ }
+
+ return pPool;
+
+error_part:
+ thread_pool_destroy(pPool);
+ return NULL;
+}
+
+void thread_pool_destroy(thread_pool_t *pPool)
+{
+ if (pPool != NULL) {
+ if (pPool->pPool != NULL) {
+ g_thread_pool_free(pPool->pPool, TRUE, TRUE);
+ }
+ if (pPool->cancel_tsk != NULL) {
+ /* TODO : i don't know what to do. May be free need to do */
+ }
+
+ free(pPool);
+ }
+}
+
+void thread_pool_push_task(thread_pool_t *pPool, task_t *pTask)
+{
+ if (pPool != NULL && pPool->pPool != NULL && pTask != NULL) {
+ g_thread_pool_push(pPool->pPool, pTask, NULL);
+ } else {
+ if (pPool == NULL || pPool->pPool == NULL) {
+ FW_LOGW("invalid thread pool structure. we do nothing in this case\n");
+ } else {
+ FW_LOGW("valid thread pool structure, but invalid task. we do nothing in this case\n");
+ }
+ }
+}
diff --git a/framework/src/Event/Event_Config.c b/framework/src/Event/Event_Config.c
new file mode 100755
index 0000000..e99e76a
--- /dev/null
+++ b/framework/src/Event/Event_Config.c
@@ -0,0 +1,351 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "Utility/fw_log.h"
+#include "Event/Event_Config.h"
+
+#define LOG_TAG "AF_EVENT"
+
+static int current_event_count = 0;
+static Event_Spec *event_Spec_list[MAX_EVENT_COUNT] = { 0 };
+
+static int current_noti_bag_count = 0;
+Noti_Spec_Bag *noti_Spec_Bag_list[MAX_NOTI_COUNT] = { 0 };
+
+static char *__communication_path_event = 0;
+static char *__communication_path_reply_event = 0;
+
+static int __find_NotiSpecBag(const char *noti_key);
+
+static int __find_EventSpec(int eventNum);
+static int __find_NotiSpec(int noti_Spec_Bag_num, int notiNum);
+
+const char *get_Noti_Path(const char *noti_key)
+{
+ if (noti_key == 0) {
+ if (noti_Spec_Bag_list[0] != 0) {
+ return noti_Spec_Bag_list[0]->communication_path_noti;
+ } else {
+ return 0;
+ }
+ }
+
+ int index = __find_NotiSpecBag(noti_key);
+
+ return noti_Spec_Bag_list[index]->communication_path_noti;
+}
+
+const char *get_Noti_Reply_Path(const char *noti_key)
+{
+ if (noti_key == 0) {
+ if (noti_Spec_Bag_list[0] != 0) {
+ return noti_Spec_Bag_list[0]->communication_path_reply_noti;
+ } else {
+ return 0;
+ }
+ }
+
+ int index = __find_NotiSpecBag(noti_key);
+
+ return noti_Spec_Bag_list[index]->communication_path_reply_noti;
+}
+
+const char *get_Event_Path()
+{
+ return __communication_path_event;
+}
+
+const char *get_Event_Reply_Path()
+{
+ return __communication_path_reply_event;
+}
+
+EVENT_ERROR set_EventSpec_from_ConfigFile(const char *event_key, const char *configfile)
+{
+ FILE *fp = fopen(configfile, "r");
+ if (fp == 0) {
+ FW_LOGE("file open failed [%s]\n", configfile);
+ return EVENT_FAIL;
+ }
+
+ while (!feof(fp)) {
+ Event_Spec *event_spec = (Event_Spec *) malloc(sizeof(Event_Spec));
+
+ char description[1000];
+ fscanf(fp, "%d, %d, %d, %d, %999s\n", &(event_spec->eventNum), (int *)(&(event_spec->event_type)), &(event_spec->relational_notiNum), &(event_spec->pendingtime), (char *)(&description));
+
+ event_Spec_list[current_event_count] = event_spec;
+ current_event_count++;
+ }
+
+ fclose(fp);
+
+ if (__communication_path_event == 0) {
+ __communication_path_event = (char *)calloc(strlen(EVENT_COMMUNICATION_PATH) + strlen(event_key) + 1, sizeof(char));
+ strcat(__communication_path_event, EVENT_COMMUNICATION_PATH);
+ strcat(__communication_path_event, event_key);
+ FW_LOGV("EVENT_COMMUNICATION_PATH : %s", __communication_path_event);
+ }
+
+ if (__communication_path_reply_event == 0) {
+ __communication_path_reply_event = (char *)calloc(strlen(EVENT_REPLY_COMMUNICATION_PATH) + strlen(event_key) + 1, sizeof(char));
+ strcat(__communication_path_reply_event, EVENT_REPLY_COMMUNICATION_PATH);
+ strcat(__communication_path_reply_event, event_key);
+ FW_LOGV("EVENT_REPLY_COMMUNICATION_PATH : %s", __communication_path_reply_event);
+ }
+
+ return EVENT_SUCCESS;
+}
+
+EVENT_ERROR clean_EventSpec()
+{
+ int i = 0;
+ for (; i < current_event_count; i++) {
+ Event_Spec *event_spec = event_Spec_list[i];
+ if (event_spec != 0) {
+ free(event_spec);
+ }
+ }
+
+ return EVENT_SUCCESS;
+}
+
+EVENT_ERROR set_NotiSpec_from_ConfigFile(const char *noti_key, const char *configfile)
+{
+ if (noti_key == 0 || configfile == 0) {
+ return EVENT_FAIL;
+ }
+
+ FILE *fp = fopen(configfile, "r");
+ if (fp == 0) {
+ FW_LOGE("file open failed [%s]\n", configfile);
+ return EVENT_FAIL;
+ }
+
+ /*
+ * Create Noti Spec Bag
+ */
+ Noti_Spec_Bag *noti_spec_bag = (Noti_Spec_Bag *) calloc(1, sizeof(Noti_Spec_Bag));
+ noti_spec_bag->noti_count = 0;
+
+ /*
+ * Setting noti_Spec_list
+ */
+ while (!feof(fp)) {
+ Noti_Spec *noti_spec = (Noti_Spec *)calloc(1, sizeof(Noti_Spec));
+
+ char description[1000];
+ fscanf(fp, "%d, %d, %d, %d, %999s\n", &(noti_spec->notiNum), (int *)(&(noti_spec->noti_type)), &(noti_spec->relational_eventNum), &(noti_spec->pendingtime), (char *)(&description));
+
+ noti_spec_bag->noti_Spec_list[noti_spec_bag->noti_count] = noti_spec;
+ noti_spec_bag->noti_count++;
+ }
+ fclose(fp);
+
+ /*
+ * Setting noti_key
+ */
+ noti_spec_bag->noti_key = strdup(noti_key);
+
+ /*
+ * Setting communication_path_noti
+ */
+ if (noti_spec_bag->communication_path_noti == 0) {
+ noti_spec_bag->communication_path_noti = (char *)calloc(strlen(NOTI_COMMUNICATION_PATH) + strlen(noti_key) + 1, sizeof(char));
+ strcat(noti_spec_bag->communication_path_noti, NOTI_COMMUNICATION_PATH);
+ strcat(noti_spec_bag->communication_path_noti, noti_key);
+ FW_LOGV("NOTI_COMMUNICATION_PATH : %s", noti_spec_bag->communication_path_noti);
+ }
+
+ /*
+ * Setting communication_path_reply_noti
+ */
+ if (noti_spec_bag->communication_path_reply_noti == 0) {
+ noti_spec_bag->communication_path_reply_noti = (char *)calloc(strlen(NOTI_REPLY_COMMUNICATION_PATH) + strlen(noti_key) + 1, sizeof(char));
+ strcat(noti_spec_bag->communication_path_reply_noti, NOTI_REPLY_COMMUNICATION_PATH);
+ strcat(noti_spec_bag->communication_path_reply_noti, noti_key);
+ FW_LOGV("NOTI_REPLY_COMMUNICATION_PATH : %s", noti_spec_bag->communication_path_reply_noti);
+ }
+
+ noti_Spec_Bag_list[current_noti_bag_count] = noti_spec_bag;
+ current_noti_bag_count++;
+
+ return EVENT_SUCCESS;
+}
+
+EVENT_ERROR clean_NotiSpec()
+{
+ int i = 0;
+ for (; i < current_noti_bag_count; i++) {
+ Noti_Spec_Bag *noti_Spec_Bag = noti_Spec_Bag_list[i];
+ if (noti_Spec_Bag != 0) {
+ free(noti_Spec_Bag->noti_key);
+ free(noti_Spec_Bag->communication_path_noti);
+ free(noti_Spec_Bag->communication_path_reply_noti);
+
+ int k = 0;
+ for (; k < noti_Spec_Bag->noti_count; k++) {
+ Noti_Spec *noti_spec = noti_Spec_Bag->noti_Spec_list[k];
+ if (noti_spec != 0) {
+ free(noti_spec);
+ }
+ }
+ }
+ }
+
+ return EVENT_SUCCESS;
+}
+
+EVENT_ERROR register_EventCallback(int eventNum, EVENT_CALLBACK callback)
+{
+ int index = __find_EventSpec(eventNum);
+ if (index == -1) {
+ return EVENT_FAIL;
+ }
+
+ event_Spec_list[index]->callback = callback;
+
+ return EVENT_SUCCESS;
+}
+
+EVENT_ERROR register_NotiCallback(int notiNum, NOTI_CALLBACK callback, void *data)
+{
+ int index = __find_NotiSpec(0, notiNum);
+ if (index == -1) {
+ return EVENT_FAIL;
+ }
+
+ noti_Spec_Bag_list[0]->noti_Spec_list[index]->callback = callback;
+ noti_Spec_Bag_list[0]->noti_Spec_list[index]->additional_param = data;
+
+ return EVENT_SUCCESS;
+}
+
+EVENT_CALLBACK get_EventCallback(int eventNum)
+{
+ int index = __find_EventSpec(eventNum);
+ if (index == -1) {
+ return 0;
+ }
+
+ return event_Spec_list[index]->callback;
+}
+
+NOTI_CALLBACK get_NotiCallback(int notiNum)
+{
+ int index = __find_NotiSpec(0, notiNum);
+ if (index == -1) {
+ return 0;
+ }
+
+ return noti_Spec_Bag_list[0]->noti_Spec_list[index]->callback;
+}
+
+void *get_NotiCallback_AdditinalParam(int notiNum)
+{
+ int index = __find_NotiSpec(0, notiNum);
+ if (index == -1) {
+ return 0;
+ }
+
+ return noti_Spec_Bag_list[0]->noti_Spec_list[index]->additional_param;
+}
+
+EVENT_TYPE get_EventType(int eventNum)
+{
+ int index = __find_EventSpec(eventNum);
+ if (index == -1) {
+ return 0;
+ }
+
+ return event_Spec_list[index]->event_type;
+}
+
+NOTI_TYPE get_NotiType(const char *noti_key, int notiNum)
+{
+ int noti_Spec_Bag_num = __find_NotiSpecBag(noti_key);
+
+ int noti_index = __find_NotiSpec(noti_Spec_Bag_num, notiNum);
+ if (noti_index == -1) {
+ return 0;
+ }
+
+ return noti_Spec_Bag_list[noti_Spec_Bag_num]->noti_Spec_list[noti_index]->noti_type;
+}
+
+static int __find_NotiSpecBag(const char *noti_key)
+{
+ int i = 0;
+ for (; i < current_noti_bag_count; i++) {
+ Noti_Spec_Bag *noti_Spec_Bag = noti_Spec_Bag_list[i];
+ if (noti_Spec_Bag != 0) {
+ if (!strcmp(noti_Spec_Bag->noti_key, noti_key)) {
+ return i;
+ }
+ }
+ }
+
+ return 0;
+}
+
+static int __find_EventSpec(int eventNum)
+{
+ int i = 0;
+ for (; i < current_event_count; i++) {
+ if (event_Spec_list[i]->eventNum == eventNum) {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+static int __find_NotiSpec(int noti_Spec_Bag_num, int notiNum)
+{
+ Noti_Spec_Bag *noti_Spec_Bag = noti_Spec_Bag_list[noti_Spec_Bag_num];
+
+ int i = 0;
+ for (; i < noti_Spec_Bag->noti_count; i++) {
+ if ((noti_Spec_Bag->noti_Spec_list[i])->notiNum == notiNum) {
+ return i;
+ }
+ }
+
+ return -1;
+}
diff --git a/framework/src/Event/Event_Data_Accessor.c b/framework/src/Event/Event_Data_Accessor.c
new file mode 100755
index 0000000..9b8ec62
--- /dev/null
+++ b/framework/src/Event/Event_Data_Accessor.c
@@ -0,0 +1,181 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ */
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "Utility/fw_log.h"
+
+#include "Event/Event_Util.h"
+#include "Event/Event_Data_Accessor.h"
+
+#define LOG_TAG "AF_EVENT"
+
+static char *__ipc_print_message_size(char *msg_stream);
+static char *__ipc_print_message_type_and_body(char *msg_sub_stream);
+
+void append_eventdata_param(Event_Data *iter, param_type type, void *data)
+{
+ /* increase argument cnt */
+ (iter->size[0])++;
+
+ /* append type */
+ if (type == INTEGER) {
+ strcat(iter->data, "I");
+ } else if (type == STRING) {
+ strcat(iter->data, "S");
+ }
+ iter->data += 1;
+
+ /* append size and data */
+ if (type == INTEGER) {
+ /* append data */
+ memcpy(iter->data, data, sizeof(int));
+ iter->data += sizeof(int);
+ } else if (type == STRING) {
+ if (data == 0) {
+ /* append size */
+ int size = 0;
+ memcpy(iter->data, &size, sizeof(int));
+ iter->data += sizeof(int);
+ } else {
+ /* append size */
+ int size = strlen(data) + 1;
+ memcpy(iter->data, &size, sizeof(int));
+ iter->data += sizeof(int);
+
+ /* append data */
+ strcat(iter->data, data);
+ iter->data += size;
+ }
+ }
+}
+
+void get_eventdata_param(Event_Data *iter, void *data)
+{
+ /* get type */
+ param_type type = *(iter->data++);
+
+ if (type == INTEGER) {
+ /* get data */
+ memcpy(data, iter->data, sizeof(int));
+ iter->data += sizeof(int);
+ } else if (type == STRING) {
+ int size;
+ /* get size */
+ memcpy(&size, iter->data, sizeof(int));
+ iter->data += sizeof(int);
+
+ if (size > 0) {
+ /* get data */
+ char *return_char = (char *)malloc(size * sizeof(char));
+ if (!return_char) {
+ FW_LOGE("Memory malloc FAILED. [return_char]");
+ } else {
+ memcpy(return_char, iter->data, size * sizeof(char));
+ }
+ iter->data += (sizeof(char) * size);
+
+ *(char **)data = return_char;
+ } else {
+ *(char **)data = 0;
+ }
+ }
+
+ /* setting for next */
+ *(iter->size) -= 1;
+}
+
+void print_eventdata(char *msg_stream)
+{
+ char *ptr = msg_stream;
+ /* print size */
+ ptr = __ipc_print_message_size(ptr);
+
+ /* print type and body */
+ while (*ptr != '\0') {
+ ptr = __ipc_print_message_type_and_body(ptr);
+ }
+}
+
+void free_eventdata(Event_Data *event)
+{
+ if (event != 0) {
+ if (event->size != 0) {
+ free(event->size);
+ }
+
+ free(event);
+ }
+}
+
+/* return pointer after message size */
+char *__ipc_print_message_size(char *msg_stream)
+{
+ char *ptr = msg_stream;
+
+ /* print size */
+ int size = (int)*((char *)ptr);
+ FW_LOGV("message size : %d", size);
+ ptr += sizeof(char);
+
+ return ptr;
+}
+
+char *__ipc_print_message_type_and_body(char
+ *msg_sub_stream)
+{
+ /* check type */
+ char *ptr = msg_sub_stream;
+
+ if ((*ptr) == INTEGER) {
+ FW_LOGV("type : INTEGER");
+ ptr++;
+ FW_LOGV("value : %d", *(int *)ptr);
+ ptr += sizeof(int);
+ } else if ((*ptr) == STRING) {
+ FW_LOGV("type : STRING");
+ ptr++;
+ int size = *(int *)ptr;
+ FW_LOGV("size : %d", size);
+ ptr += sizeof(int);
+ FW_LOGV("content : %s", ptr);
+ ptr += size;
+ } else {
+ FW_LOGE("assertion failed in ipc_print_type_and_body");
+ }
+
+ return ptr;
+}
diff --git a/framework/src/Event/Event_Handler.c b/framework/src/Event/Event_Handler.c
new file mode 100755
index 0000000..bcb50ed
--- /dev/null
+++ b/framework/src/Event/Event_Handler.c
@@ -0,0 +1,403 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ */
+
+#include <pthread.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include "Utility/fw_log.h"
+#include "DataAdapter/DACI_Agent_Handler_Manager.h"
+
+#include "Event/Event_Util.h"
+#include "Event/Event_Data_Accessor.h"
+#include "Event/Event_Config.h"
+#include "Event/Event_Handler.h"
+
+#define LOG_TAG "AF_EVENT"
+
+static int _event_server_socket_id = 0;
+
+static pthread_t Event_Handler_thread_id;
+
+static void *__event_listener(void *arg);
+
+static Event_Data *__response_listener(int send_sockfd, Event_Data *noti, CONFIRM_IPC_CANCEL confirm_cancel, void *user_data, EVENT_ERROR *error);
+
+static void __dispatch_event(int eventNum, Event_Data *request, Event_Data *response);
+
+static int __getSocketConnector(const char *sock_file);
+
+EVENT_ERROR run_Event_Handler(unsigned long int *thread_id)
+{
+ FW_LOGI("run_Event_Handler() start\n");
+
+ pthread_create(&Event_Handler_thread_id, 0, __event_listener, 0);
+
+ *thread_id = Event_Handler_thread_id;
+
+ return EVENT_SUCCESS;
+}
+
+EVENT_ERROR clean_Event_Handler()
+{
+ EVENT_ERROR event_err = clean_EventSpec();
+ if (event_err != EVENT_SUCCESS) {
+ FW_LOGE("Fail clean_EventSpec : %d", event_err);
+ }
+ event_err = clean_NotiSpec();
+ if (event_err != EVENT_SUCCESS) {
+ FW_LOGE("Fail clean_NotiSpec : %d", event_err);
+ }
+
+ if (_event_server_socket_id != 0) {
+ close(_event_server_socket_id);
+ _event_server_socket_id = 0;
+ }
+
+ pthread_cancel(Event_Handler_thread_id);
+
+ return EVENT_SUCCESS;
+}
+
+EVENT_ERROR set_EventCallback(int eventNum, EVENT_CALLBACK callback)
+{
+ return register_EventCallback(eventNum, callback);
+}
+
+Event_Data *create_Noti(int notiNum)
+{
+ Event_Data *noti = (Event_Data *)malloc(sizeof(Event_Data));
+ if (!noti) {
+ FW_LOGE("Memory malloc FAILED. [noti]");
+ return noti;
+ } else {
+ noti->eventNum = notiNum;
+ }
+
+ char *serialized_data = (char *)calloc(MAX_STREAM_SIZE, sizeof(char));
+ noti->size = serialized_data;
+ noti->data = serialized_data + 1;
+
+ append_eventdata_param(noti, INTEGER, &notiNum);
+
+ return noti;
+}
+
+Event_Data *send_Noti(const char *noti_key, Event_Data *noti, CONFIRM_IPC_CANCEL confirm_cancel, void *user_data, EVENT_ERROR *error)
+{
+ *error = EVENT_SUCCESS;
+ const char *communication_path = 0;
+
+ NOTI_TYPE noti_type = get_NotiType(noti_key, noti->eventNum);
+
+ switch (noti_type) {
+ case NOTI_TYPE_SIMPLE:
+ case NOTI_TYPE_NEED_REPLY:
+ communication_path = get_Noti_Path(noti_key);
+ break;
+ case NOTI_TYPE_IS_REPLY:
+ communication_path = get_Noti_Reply_Path(noti_key);
+ break;
+ default:
+ *error = EVENT_IPC_ERR;
+ return 0;
+ break;
+ }
+
+ FW_LOGV("noti_type : %d", noti_type);
+ FW_LOGV("communication_path : %s", communication_path);
+
+ int client_sockfd = __getSocketConnector(communication_path);
+
+ /*
+ * if noti type is NOTI_TYPE_NEED_REPLY, Start Socket Server to recieve event as response
+ * Pending until recieve reply
+ */
+ if (noti_type == NOTI_TYPE_NEED_REPLY) {
+ Event_Data *reply = __response_listener(client_sockfd, noti, confirm_cancel, user_data, error);
+ return reply;
+ } else {
+ int send_data_size = (noti->data - noti->size) + 1;
+ write(client_sockfd, (void *)(noti->size), send_data_size);
+
+ if (client_sockfd != -1) {
+ close(client_sockfd);
+ }
+
+ free_Noti(noti);
+ }
+
+ return 0;
+}
+
+void free_Noti(Event_Data *noti)
+{
+ if (noti != NULL) {
+ free_eventdata(noti);
+ }
+}
+
+static void *__event_listener(void *arg)
+{
+ signal(SIGPIPE, SIG_IGN);
+
+ int client_sockfd;
+ int state;
+ socklen_t client_len;
+ struct sockaddr_un clientaddr, serveraddr;
+
+ const char *communication_path = get_Event_Path();
+ FW_LOGV("event_path : %s", communication_path);
+
+ if (access(communication_path, F_OK) == 0) {
+ unlink(communication_path); /* when file exist, remove previous file */
+ }
+
+ client_len = sizeof(clientaddr);
+ if ((_event_server_socket_id = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
+ return 0;
+ }
+
+ bzero(&serveraddr, sizeof(serveraddr));
+ serveraddr.sun_family = AF_UNIX;
+ strcpy(serveraddr.sun_path, communication_path);
+
+ state = bind(_event_server_socket_id, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
+ if (state == -1) {
+ return 0;
+ }
+
+ mode_t sock_mode = (S_IRWXU | S_IRWXG | S_IRWXO);
+ if (-1 == chmod(communication_path, sock_mode)) {
+ ;
+ }
+
+ state = listen(_event_server_socket_id, 5);
+ if (state == -1) {
+ return 0;
+ }
+
+ while (1) {
+ FW_LOGI("In EventHandler loop=\n");
+
+ char inbuf[MAX_STREAM_SIZE];
+ char outbuf[MAX_STREAM_SIZE];
+ memset(inbuf, 0x00, MAX_STREAM_SIZE);
+ memset(outbuf, 0x00, MAX_STREAM_SIZE);
+ Event_Data request;
+ Event_Data response;
+ request.data = inbuf;
+ response.data = outbuf;
+ init_eventdata_iter(&request);
+ init_eventdata_iter(&response);
+
+ client_sockfd = accept(_event_server_socket_id, (struct sockaddr *)&clientaddr, &client_len);
+
+ if (read(client_sockfd, (void *)inbuf, MAX_STREAM_SIZE) <= 0) {
+ close(client_sockfd);
+ return 0;
+ }
+ FW_LOGI("accept() was called\n");
+
+ int eventNum;
+ get_eventdata_param(&request, &eventNum);
+ FW_LOGI("Recieved Event Number : %d\n", eventNum);
+
+ __dispatch_event(eventNum, &request, &response);
+ /*
+ * need synchronous response case
+ */
+ EVENT_TYPE event_type = get_EventType(eventNum);
+ if (event_type == EVENT_TYPE_NEED_RESPONSE) {
+ if (get_eventdata_element_size(&response) > 0) {
+ int byte_size = get_eventdata_byte_size(&response);
+ write(client_sockfd, outbuf, byte_size);
+ }
+ }
+
+ close(client_sockfd);
+ }
+
+ return 0;
+}
+
+static Event_Data *__response_listener(int send_sockfd, Event_Data *noti, CONFIRM_IPC_CANCEL confirm_cancel, void *user_data, EVENT_ERROR *error)
+{
+ int reply_server_socketfd;
+ int state;
+ socklen_t client_len;
+ struct sockaddr_un clientaddr, serveraddr;
+
+ const char *communication_path = get_Event_Reply_Path();
+ FW_LOGV("event_reply_path : %s", communication_path);
+
+ if (access(communication_path, F_OK) == 0) {
+ unlink(communication_path); /* when file exist, remove previous file */
+ }
+
+ client_len = sizeof(clientaddr);
+ if ((reply_server_socketfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
+ *error = EVENT_IPC_ERR;
+ return 0;
+ }
+
+ int flag = fcntl(reply_server_socketfd, F_GETFL, 0);
+ fcntl(reply_server_socketfd, F_SETFL, flag | O_NONBLOCK);
+
+ bzero(&serveraddr, sizeof(serveraddr));
+ serveraddr.sun_family = AF_UNIX;
+ strcpy(serveraddr.sun_path, communication_path);
+
+ state = bind(reply_server_socketfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
+ if (state == -1) {
+ *error = EVENT_IPC_ERR;
+ close(reply_server_socketfd);
+ return 0;
+ }
+
+ mode_t sock_mode = (S_IRWXU | S_IRWXG | S_IRWXO);
+ if (-1 == chmod(communication_path, sock_mode)) {
+ ;
+ }
+
+ state = listen(reply_server_socketfd, 5);
+ if (state == -1) {
+ *error = EVENT_IPC_ERR;
+ close(reply_server_socketfd);
+ return 0;
+ }
+
+ int not_yet_sended = 1;
+ while (1) {
+ FW_LOGI("In Reply Event Handler loop");
+
+ if (confirm_cancel != 0) {
+ IPC_CANCEL need_cancel = confirm_cancel(user_data);
+ if (need_cancel == NEED_CANCEL) {
+ FW_LOGV("Cancel to listen response event");
+ *error = EVENT_CANCLED;
+ close(reply_server_socketfd);
+ return 0;
+ }
+ }
+
+ int client_sockfd = accept(reply_server_socketfd, (struct sockaddr *)&clientaddr, &client_len);
+
+ if (not_yet_sended) {
+ int send_data_size = (noti->data - noti->size) + 1;
+ write(send_sockfd, (void *)(noti->size), send_data_size);
+
+ if (send_sockfd != -1) {
+ close(send_sockfd);
+ }
+
+ free_Noti(noti);
+ not_yet_sended = 0;
+ FW_LOGV("Sended to Notification [%d]");
+ }
+
+ if (client_sockfd < 0) {
+ if (errno == EWOULDBLOCK) {
+ FW_LOGV("No client accepted, not yet");
+ usleep(100000);
+ continue;
+ } else {
+ FW_LOGE("Failed to accept()");
+ close(reply_server_socketfd);
+ break;
+ }
+ }
+
+ char *inbuf = (char *)calloc(MAX_STREAM_SIZE, sizeof(char));
+ Event_Data *reply = (Event_Data *)calloc(1, sizeof(Event_Data));
+ reply->data = inbuf;
+ init_eventdata_iter(reply);
+
+ if (read(client_sockfd, (void *)inbuf, MAX_STREAM_SIZE) <= 0) {
+ FW_LOGE("Socket Error - failed to read()");
+ close(client_sockfd);
+ close(reply_server_socketfd);
+ free_eventdata(reply);
+ *error = EVENT_IPC_ERR;
+
+ return 0;
+ }
+
+ close(client_sockfd);
+ close(reply_server_socketfd);
+
+ int eventNum;
+ get_eventdata_param(reply, &eventNum);
+ FW_LOGI("Recieved Response Event Num : %d", eventNum);
+
+ return reply;
+ }
+
+ return 0;
+}
+
+static void __dispatch_event(int eventNum, Event_Data *request, Event_Data *response)
+{
+ EVENT_CALLBACK event_callback = get_EventCallback(eventNum);
+
+ event_callback(request, response);
+}
+
+static int __getSocketConnector(const char *sock_file)
+{
+ int client_len;
+ int client_sockfd;
+ struct sockaddr_un clientaddr;
+
+ client_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (client_sockfd == -1)
+ FW_LOGE("socket create error!!");
+
+ bzero(&clientaddr, sizeof(clientaddr));
+ clientaddr.sun_family = AF_UNIX;
+ strcpy(clientaddr.sun_path, sock_file);
+ client_len = sizeof(clientaddr);
+
+ if (connect(client_sockfd, (struct sockaddr *)&clientaddr, client_len) < 0) {
+ FW_LOGE("Socket Connect error!!");
+ }
+
+ return client_sockfd;
+}
diff --git a/framework/src/Event/Event_UI_API.c b/framework/src/Event/Event_UI_API.c
new file mode 100755
index 0000000..af29fe9
--- /dev/null
+++ b/framework/src/Event/Event_UI_API.c
@@ -0,0 +1,348 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ */
+
+#include <pthread.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <unistd.h>
+
+#include "Utility/fw_log.h"
+
+#include "Event_Config.h"
+#include "Event_Util.h"
+#include "Event_Data_Accessor.h"
+#include "Event_UI_API.h"
+
+#define LOG_TAG "AF_EVENT_UI"
+
+static int noti_server_socket_id = 0;
+static pthread_t Noti_Listener_thread_id = 0;
+
+static void *__noti_listener(void *arg);
+
+static Event_Data *__response_listener(EVENT_ERROR *error);
+
+static void __dispatch_noti(int notiNum, Event_Data *noti);
+
+Event_Data *create_Event(int eventNum)
+{
+ Event_Data *event = (Event_Data *)malloc(sizeof(Event_Data));
+ if (!event) {
+ FW_LOGE("Memory malloc FAILED. [event]");
+ return event;
+ }
+ event->eventNum = eventNum;
+
+ char *serialized_data = (char *)calloc(MAX_STREAM_SIZE, sizeof(char));
+ event->size = serialized_data;
+ event->data = serialized_data + 1;
+
+ append_eventdata_param(event, INTEGER, &eventNum);
+
+ return event;
+}
+
+Event_Data *send_Event(Event_Data *event, EVENT_ERROR *error)
+{
+ *error = EVENT_SUCCESS;
+ int client_len;
+ int client_sockfd;
+ struct sockaddr_un clientaddr;
+
+ client_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (client_sockfd == -1) {
+ FW_LOGE("socket create Error!!");
+ *error = EVENT_IPC_ERR;
+ return 0;
+ }
+
+ bzero(&clientaddr, sizeof(clientaddr));
+ clientaddr.sun_family = AF_UNIX;
+ /*
+ * select socket path, whether event type is response for notification
+ */
+ const char *communication_path = 0;
+ EVENT_TYPE event_type = get_EventType(event->eventNum);
+ switch (event_type) {
+ case EVENT_TYPE_NO_RESPONSE:
+ case EVENT_TYPE_NEED_RESPONSE:
+ case EVENT_TYPE_NEED_NOTI_RESPONSE:
+ communication_path = get_Event_Path();
+ break;
+ case EVENT_TYPE_IS_RESPONSE:
+ communication_path = get_Event_Reply_Path();
+ break;
+ }
+
+ if (communication_path == 0) {
+ return 0;
+ }
+
+ FW_LOGV("communication_path : %s", communication_path);
+
+ strcpy(clientaddr.sun_path, communication_path);
+ client_len = sizeof(clientaddr);
+
+ if (connect(client_sockfd, (struct sockaddr *)&clientaddr, client_len) < 0) {
+ FW_LOGE("socket connect error");
+ close(client_sockfd);
+ *error = EVENT_IPC_ERR;
+
+ return 0;
+ }
+
+ int send_data_size = (event->data - event->size) + 1;
+ write(client_sockfd, (void *)(event->size), send_data_size);
+
+ if (event_type != EVENT_TYPE_NEED_RESPONSE) {
+ FW_LOGI("Do not need synchronous response");
+ close(client_sockfd);
+ return 0;
+ }
+
+ if (event_type == EVENT_TYPE_NEED_NOTI_RESPONSE) {
+ Event_Data *reply = __response_listener(error);
+ close(client_sockfd);
+ return reply;
+ }
+
+ /*
+ * recieve Logic
+ */
+ char *connection_result = (char *)calloc(MAX_STREAM_SIZE, sizeof(char));
+ read(client_sockfd, connection_result, MAX_STREAM_SIZE);
+ close(client_sockfd);
+
+ print_eventdata(connection_result);
+
+ Event_Data *reply_msg = (Event_Data *)malloc(sizeof(Event_Data));
+ if (!reply_msg) {
+ FW_LOGE("Memory malloc FAILED. [reply_msg]");
+ *error = EVENT_FAIL;
+ return reply_msg;
+ }
+ reply_msg->data = connection_result;
+
+ init_eventdata_iter(reply_msg);
+
+ return reply_msg;
+}
+
+EVENT_ERROR run_NotiListener()
+{
+ FW_LOGI("============ start");
+
+ if (Noti_Listener_thread_id == 0) {
+ FW_LOGI("Run NotiListener!!");
+ pthread_create(&Noti_Listener_thread_id, 0, __noti_listener, 0);
+ return EVENT_SUCCESS;
+ }
+
+ FW_LOGI("============ end");
+ return EVENT_FAIL;
+}
+
+EVENT_ERROR stop_NotiListener()
+{
+ if (Noti_Listener_thread_id == 0) {
+ return EVENT_FAIL;
+ }
+
+ if (noti_server_socket_id != 0) {
+ close(noti_server_socket_id);
+ noti_server_socket_id = 0;
+ }
+
+ pthread_cancel(Noti_Listener_thread_id);
+ Noti_Listener_thread_id = 0;
+
+ return EVENT_SUCCESS;
+}
+
+EVENT_ERROR set_NotiCallBack(int notiType, NOTI_CALLBACK callback, void *data)
+{
+ return register_NotiCallback(notiType, callback, data);
+}
+
+static void *__noti_listener(void *arg)
+{
+ int client_sockfd;
+ int state;
+ socklen_t client_len;
+ struct sockaddr_un clientaddr, serveraddr;
+
+ const char *communication_path = get_Noti_Path(0);
+ FW_LOGV("Noti communication path : %s", communication_path);
+
+ if (access(communication_path, F_OK) == 0) {
+ unlink(communication_path); /* when file exist, remove previous file */
+ }
+
+ client_len = sizeof(clientaddr);
+ if ((noti_server_socket_id = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
+ return 0;
+ }
+
+ bzero(&serveraddr, sizeof(serveraddr));
+ serveraddr.sun_family = AF_UNIX;
+ strcpy(serveraddr.sun_path, communication_path);
+
+ state = bind(noti_server_socket_id, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
+ if (state == -1) {
+ return 0;
+ }
+
+ mode_t sock_mode = (S_IRWXU | S_IRWXG | S_IRWXO);
+ if (-1 == chmod(communication_path, sock_mode)) {
+ ;
+ }
+
+ state = listen(noti_server_socket_id, 5);
+ if (state == -1) {
+ return 0;
+ }
+
+ while (1) {
+ FW_LOGI("In Listen Notification loop=");
+
+ char *inbuf = (char *)calloc(MAX_STREAM_SIZE, sizeof(char));
+ Event_Data *noti = (Event_Data *)calloc(1, sizeof(Event_Data));
+ noti->data = inbuf;
+ init_eventdata_iter(noti);
+
+ client_sockfd = accept(noti_server_socket_id, (struct sockaddr *)&clientaddr, &client_len);
+
+ if (read(client_sockfd, (void *)inbuf, MAX_STREAM_SIZE) <= 0) {
+ close(client_sockfd);
+ return 0;
+ }
+ FW_LOGI("accept() was called");
+
+ int notiNum;
+ get_eventdata_param(noti, &notiNum);
+ FW_LOGI("Recieved Noti Number : %d", notiNum);
+
+ __dispatch_noti(notiNum, noti);
+
+ close(client_sockfd);
+ }
+
+ return 0;
+}
+
+static Event_Data *__response_listener(EVENT_ERROR *error)
+{
+ int reply_server_socketfd, client_sockfd;
+ int state;
+ socklen_t client_len;
+ struct sockaddr_un clientaddr, serveraddr;
+
+ const char *communication_path = get_Noti_Reply_Path(0);
+ FW_LOGV("Noti reply communication path : %s", communication_path);
+
+ if (access(communication_path, F_OK) == 0) {
+ unlink(communication_path); /* when file exist, remove previous file */
+ }
+
+ client_len = sizeof(clientaddr);
+ if ((reply_server_socketfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
+ *error = EVENT_IPC_ERR;
+ return 0;
+ }
+
+ bzero(&serveraddr, sizeof(serveraddr));
+ serveraddr.sun_family = AF_UNIX;
+ strcpy(serveraddr.sun_path, communication_path);
+
+ state = bind(reply_server_socketfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
+ if (state == -1) {
+ *error = EVENT_IPC_ERR;
+ close(reply_server_socketfd);
+ return 0;
+ }
+
+ mode_t sock_mode = (S_IRWXU | S_IRWXG | S_IRWXO);
+ if (-1 == chmod(communication_path, sock_mode)) {
+ ;
+ }
+
+ state = listen(reply_server_socketfd, 5);
+ if (state == -1) {
+ *error = EVENT_IPC_ERR;
+ close(reply_server_socketfd);
+ return 0;
+ }
+
+ while (1) {
+ FW_LOGI("In Reply Noti Handler loop");
+
+ char *inbuf = (char *)calloc(MAX_STREAM_SIZE, sizeof(char));
+ Event_Data *reply = (Event_Data *)calloc(1, sizeof(Event_Data));
+ reply->data = inbuf;
+ init_eventdata_iter(reply);
+
+ client_sockfd = accept(reply_server_socketfd, (struct sockaddr *)&clientaddr, &client_len);
+ FW_LOGI("accept() was called");
+
+ if (read(client_sockfd, (void *)inbuf, MAX_STREAM_SIZE) <= 0) {
+ FW_LOGE("Socket Error - failed to read()");
+ close(client_sockfd);
+ close(reply_server_socketfd);
+ free_eventdata(reply);
+ *error = EVENT_IPC_ERR;
+
+ return 0;
+ }
+
+ close(client_sockfd);
+ close(reply_server_socketfd);
+
+ int notiNum;
+ get_eventdata_param(reply, &notiNum);
+ FW_LOGI("Recieved Noti Num : %d", notiNum);
+
+ return reply;
+ }
+}
+
+static void __dispatch_noti(int notiNum, Event_Data *noti)
+{
+ NOTI_CALLBACK noti_callback = get_NotiCallback(notiNum);
+ void *additional_param = get_NotiCallback_AdditinalParam(notiNum);
+
+ noti_callback(noti, additional_param);
+}
diff --git a/framework/src/Event/Event_Util.c b/framework/src/Event/Event_Util.c
new file mode 100644
index 0000000..0ca7ae8
--- /dev/null
+++ b/framework/src/Event/Event_Util.c
@@ -0,0 +1,63 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ */
+
+#include <stdlib.h>
+
+#include "Event/Event_Util.h"
+
+void init_eventdata_iter(Event_Data *event)
+{
+ event->size = event->data;
+ event->data = event->data + 1;
+}
+
+int get_eventdata_byte_size(Event_Data *iter)
+{
+ return (iter->data - iter->size + 1);
+}
+
+int get_eventdata_element_size(Event_Data *iter)
+{
+ return (int)(iter->size[0]);
+}
+
+void remove_buffer(Event_Data *event)
+{
+ if (event != 0) {
+ if (event->size != 0) {
+ free(event->size);
+ }
+ }
+}
diff --git a/framework/src/FSAPI/FSAPI_operation.c b/framework/src/FSAPI/FSAPI_operation.c
new file mode 100644
index 0000000..ea33b2b
--- /dev/null
+++ b/framework/src/FSAPI/FSAPI_operation.c
@@ -0,0 +1,692 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <time.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/vfs.h> /* for statfs */
+#include "FSAPI/FSAPI_operation.h"
+#include "FSAPI/FSAPI_util.h"
+
+#include "Utility/fw_log.h"
+#define LOG_TAG "AF_FS"
+
+#define BUFFER_SIZE 2048
+
+static bool file_append_started = FALSE;
+static bool file_read_started = FALSE;
+static char *temp_filename_kept = NULL;
+static char *requested_filename_kept = NULL;
+static FILE *fd_source_kept = NULL;
+
+int FSAPI_isExisting(const char *filename)
+{
+ return isExisting(filename);
+}
+
+int FSAPI_memSize(const char *root, long double *sizeFree, long double *sizeTotal)
+{
+ if (!isExisting(root)) {
+ FW_LOGE("[%s] Requested instance '%s' not exist.\n", __func__, root);
+ return 0;
+ }
+
+ struct statfs fs_info;
+
+ if (statfs(root, &fs_info) != 0) {
+ FW_LOGE("[FSAPI_memSize] statfs error.");
+ return 0;
+ }
+
+ *sizeFree = ((long double)fs_info.f_bavail * (long double)fs_info.f_bsize); /* / 1024; */
+ *sizeTotal = ((long double)fs_info.f_blocks * (long double)fs_info.f_bsize); /* / 1024; */
+
+ FW_LOGI("[FSAPI_memSize] FS info root : %s.", root);
+ FW_LOGI("[FSAPI_memSize] FS info free size : %.0f", *sizeFree);
+ FW_LOGI("[FSAPI_memSize] FS info total size : %.0f", *sizeTotal);
+
+ return 1;
+}
+
+/*
+ * File operation
+ */
+
+int FSAPI_fileSize(const char *filename, unsigned long *size)
+{
+ if (!isExisting(filename) || isDirectory(filename)) {
+ FW_LOGE("[%s] Requested instance '%s' not exist, or not a file.\n", __func__, filename);
+ return 0;
+ }
+
+ struct stat buf;
+
+ int ret = stat(filename, &buf);
+ if (ret == -1) {
+ FW_LOGE("[%s] stat error : %s", __func__, strerror(errno));
+ return 0;
+ }
+
+ *size = (unsigned long)buf.st_size;
+
+ return 1;
+}
+
+int FSAPI_fileDate(const char *filename, char **time_string)
+{
+ if (!isExisting(filename) || isDirectory(filename)) {
+ FW_LOGE("[%s] Requested instance '%s' not exist, or not a file.\n", __func__, filename);
+ return 0;
+ }
+
+ struct stat buf;
+ char time[20] = { 0 };
+
+ int ret = stat(filename, &buf);
+ if (ret == -1) {
+ FW_LOGE("[%s] stat error : %s", __func__, strerror(errno));
+ return 0;
+ }
+
+ getTimeString(&buf.st_mtime, time);
+ *time_string = g_strdup(time);
+
+ return 1;
+}
+
+int FSAPI_fileCopy(const char *source, const char *dest)
+{
+ if (!isExisting(source) || isDirectory(source) || isExisting(dest)) {
+ FW_LOGE("[%s] Requested source instance '%s' not exist or not a file, or\n", __func__, source);
+ FW_LOGE("[%s] requested dest instance '%s' already exist.\n", __func__, dest);
+ return 0;
+ }
+
+ FILE *f1 = NULL, *f2 = NULL;
+ int ret = 1;
+ char buf[1024 * 100] = { 0 };
+ unsigned long bytes_read = 0;
+ unsigned long bytes_written = 0;
+
+ f1 = (FILE *)g_fopen(source, "rb");
+ if (!f1) {
+ FW_LOGE("[FSAPI_fileCopy] file f1 open error.");
+ ret = 0;
+ goto return_part;
+ }
+
+ f2 = (FILE *)g_fopen(dest, "wb");
+ if (!f2) {
+ FW_LOGE("[FSAPI_fileCopy] file f2 open error.");
+ ret = 0;
+ goto return_part;
+ }
+
+ while ((bytes_read = fread(buf, 1, sizeof(buf), f1)) > 0) {
+ if (bytes_read > sizeof(buf)) {
+ FW_LOGE("[FSAPI_fileCopy] read error.");
+ ret = 0;
+ goto return_part;
+ }
+
+ bytes_written = fwrite(buf, 1, bytes_read, f2);
+ if (!feof(f1) && bytes_written != bytes_read) {
+ FW_LOGE("[FSAPI_fileCopy] write error.");
+ ret = 0;
+ goto return_part;
+ }
+ }
+
+return_part:
+ if (f1)
+ fclose(f1);
+ if (f2)
+ fclose(f2);
+ return ret;
+
+/*
+ char *body = NULL;
+ unsigned long size;
+
+ if( !File_Read(source, &body, &size) ) {
+ fprintf(stderr, "[%s] File_Read() returned error.\n", __func__);
+ return 0;
+ }
+
+ if( !File_Write(dest, body, size) ) {
+ fprintf(stderr, "[%s] File_Read() returned error.\n", __func__);
+ return 0;
+ }
+
+ free(body);
+
+ return 1;
+*/
+}
+
+int FSAPI_fileDelete(const char *filename)
+{
+ if (!isExisting(filename) || isDirectory(filename)) {
+ FW_LOGE("[%s] Requested instance '%s' not exist, or not a file.\n", __func__, filename);
+ return 0;
+ }
+
+ int ret = g_unlink(filename);
+ if (ret == -1) {
+ FW_LOGE("[%s] g_unlink error : %s\n", __func__, strerror(errno));
+ return 0;
+ }
+
+ return 1;
+}
+
+int FSAPI_fileMove(const char *source, const char *dest)
+{
+ if (!isExisting(source) || isDirectory(source) || isExisting(dest)) {
+ FW_LOGE("[%s] Requested source instance '%s' not exist or not a file, or\n", __func__, source);
+ FW_LOGE("[%s] requested dest instance '%s' already exist.\n", __func__, dest);
+ return 0;
+ }
+
+ int ret = g_rename(source, dest);
+ if (ret == -1) {
+ FW_LOGE("[FSAPI_fileMove] g_rename error : %s", strerror(errno));
+ FW_LOGE("[FSAPI_fileMove] source : %s target : %s", source, dest);
+ return 0;
+ }
+
+ return 1;
+}
+
+int FSAPI_fileRename(const char *source, const char *dest)
+{
+ return FSAPI_fileMove(source, dest);
+}
+
+int FSAPI_fileRead(const char *filename, char **required_contents, unsigned long required_length, unsigned long *size_return, bool *isFinal)
+{
+ if (!isExisting(filename) || isDirectory(filename)) {
+ FW_LOGE("[%s] Requested instance '%s' not exist, or not a file.\n", __func__, filename);
+ return 0;
+ }
+
+ int ret = 1;
+
+ if (!fd_source_kept && !file_read_started) {
+ if (!(fd_source_kept = (FILE *)g_fopen(filename, "rb"))) {
+ FW_LOGE("[FSAPI_fileRead] temp_filename_kept open error.");
+ ret = 0;
+ goto return_part;
+ }
+ file_read_started = TRUE;
+ } else if (fd_source_kept && file_read_started) {
+ } else {
+ FW_LOGE("[%s] internal condition not matching.\n", __func__);
+ ret = 0;
+ goto return_part;
+ }
+
+ *required_contents = (char *)calloc(required_length, sizeof(char));
+ if (*required_contents == NULL) {
+ FW_LOGE("[FSAPI_fileRead] calloc error. [*required_contents]");
+ ret = 0;
+ goto return_part;
+ }
+
+ int bytes_read = 0;
+ bytes_read = fread(*required_contents, 1, required_length, fd_source_kept);
+
+ if ((bytes_read > required_length) || ((!feof(fd_source_kept)) && (bytes_read < required_length))) {
+ FW_LOGE("[FSAPI_fileRead] read error.");
+ ret = 0;
+ goto return_part;
+ }
+
+ *size_return = bytes_read;
+
+ if (feof(fd_source_kept)) {
+ *isFinal = TRUE;
+ goto return_part;
+ }
+
+ return ret;
+
+return_part:
+
+ if (fd_source_kept) {
+ fclose(fd_source_kept);
+ fd_source_kept = NULL;
+ }
+ file_read_started = FALSE;
+
+ return ret;
+
+/*
+ if( !isExisting(filename) || isDirectory(filename) ) {
+ fprintf(stderr, "[%s] Requested instance '%s' not exist, or not a file.\n", __func__, filename);
+ return 0;
+ }
+
+ GError *gerror = NULL;
+
+ if( !g_file_get_contents(filename, contents, (gsize*)length, &gerror) ) {
+ fprintf(stderr, "[%s] g_file_get_contents error : %s\n", __func__, gerror->message);
+
+ g_error_free(gerror);
+ return 0;
+ }
+
+ return 1;
+*/
+}
+
+int FSAPI_fileReadWhole(const char *filename, char **required_contents, unsigned long *size_return)
+{
+ if (!isExisting(filename) || isDirectory(filename)) {
+ FW_LOGE("[%s] Requested instance '%s' not exist, or not a file.\n", __func__, filename);
+ return 0;
+ }
+
+ GError *gerror = NULL;
+
+ if (!g_file_get_contents(filename, required_contents, (gsize *) size_return, &gerror)) {
+ FW_LOGE("[%s] g_file_get_contents error : %s\n", __func__, gerror->message);
+
+ g_error_free(gerror);
+ return 0;
+ }
+
+ return 1;
+}
+
+int FSAPI_fileRead_Free(char **requested_contents)
+{
+ if (*requested_contents)
+ free(*requested_contents);
+ return 1;
+}
+
+int FSAPI_fileWrite(const char *filename, const char *contents, unsigned long length, bool isFinal, bool overwrite)
+{
+ if (!overwrite) {
+ if (isExisting(filename)) {
+ FW_LOGE("[%s] Requested instance '%s' already exist.\n", __func__, filename);
+ return 0;
+ }
+ }
+
+ FILE *fd_temp = NULL;
+ GError *gerror = NULL;
+ int ret = 1;
+ unsigned long temp_size = 0;
+
+ if (!temp_filename_kept && !file_append_started) {
+ if (!g_file_open_tmp(NULL, &temp_filename_kept, &gerror)) {
+ FW_LOGE("[%s] g_file_open_tmp error : %s\n", __func__, gerror->message);
+
+ g_error_free(gerror);
+ ret = 0;
+ goto return_part;
+ }
+ FW_LOGI("[FSAPI_fileWrite] Temp file name kept new : %s", temp_filename_kept);
+
+ file_append_started = TRUE;
+ requested_filename_kept = g_strdup(filename);
+
+ } else if (temp_filename_kept && file_append_started) {
+ if (!isExisting(temp_filename_kept)) {
+ FW_LOGE("[%s] Temp file '%s' not existing.\n", __func__, temp_filename_kept);
+ ret = 0;
+ goto return_part;
+ }
+ FW_LOGI("[FSAPI_fileWrite] Temp file %s kept previously, existing", temp_filename_kept);
+
+ } else {
+ FW_LOGE("[%s] internal condition not matching.\n", __func__);
+ ret = 0;
+ goto return_part;
+ }
+
+ if (temp_filename_kept) {
+ fd_temp = (FILE *)g_fopen(temp_filename_kept, "ab");
+ } else {
+ goto return_part;
+ }
+
+ if (!fd_temp) {
+ FW_LOGE("[FSAPI_fileWrite] temp file open error.");
+ ret = 0;
+ goto return_part;
+ }
+
+ if (fwrite(contents, 1, length, fd_temp) != length) {
+ FW_LOGE("[FSAPI_fileWrite] fwrite error.");
+ ret = 0;
+ goto return_part;
+ }
+
+ if (fd_temp) {
+ fclose(fd_temp);
+ fd_temp = NULL;
+ }
+
+ FSAPI_fileSize(temp_filename_kept, &temp_size);
+ FW_LOGI("[FSAPI_fileWrite] temp file size %ld", temp_size);
+
+ if (isFinal) {
+ if (overwrite) {
+ if (isExisting(filename)) {
+ if (!FSAPI_fileDelete(filename)) {
+ FW_LOGE("[FSAPI_fileWrite] deleting destination file for overwriting fail.");
+ ret = 0;
+ } else {
+ if (!FSAPI_fileCopy(temp_filename_kept, filename)) {
+ FW_LOGE("[FSAPI_fileWrite] copying temp file to destination fail.");
+ ret = 0;
+ } else {
+ if (!FSAPI_fileDelete(temp_filename_kept)) {
+ FW_LOGE("[FSAPI_fileWrite] deleting temp file fail.");
+ ret = 0;
+ }
+ }
+ }
+ } else {
+ if (!FSAPI_fileCopy(temp_filename_kept, filename)) {
+ FW_LOGE("[FSAPI_fileWrite] copying temp file to destination fail.");
+ ret = 0;
+ } else {
+ if (!FSAPI_fileDelete(temp_filename_kept)) {
+ FW_LOGE("[FSAPI_fileWrite] deleting temp file fail.");
+ ret = 0;
+ }
+ }
+ }
+ } else {
+ if (!FSAPI_fileCopy(temp_filename_kept, filename)) {
+ FW_LOGE("[FSAPI_fileWrite] copying temp file to destination fail.");
+ ret = 0;
+ } else {
+ if (!FSAPI_fileDelete(temp_filename_kept)) {
+ FW_LOGE("[FSAPI_fileWrite] deleting temp file fail.");
+ ret = 0;
+ }
+ }
+ }
+ goto return_part;
+ }
+
+ return ret;
+
+return_part:
+
+ if (fd_temp)
+ fclose(fd_temp);
+ g_free(temp_filename_kept);
+ g_free(requested_filename_kept);
+ temp_filename_kept = NULL;
+ requested_filename_kept = NULL;
+ file_append_started = FALSE;
+
+ return ret;
+
+/*
+ if( isExisting(filename) ) {
+ fprintf(stderr, "[%s] Requested instance '%s' already exist.", __func__, filename);
+ return 0;
+ }
+
+ GError *gerror = NULL;
+
+ if( !g_file_set_contents(filename, contents, length, &gerror) ) {
+ fprintf(stderr, "[%s] g_file_set_contents error : %s\n", __func__, gerror->message);
+
+ g_error_free(gerror);
+ return 0;
+ }
+
+ return 1;
+*/
+}
+
+int FSAPI_fileWriteWhole(const char *filename, const char *contents, unsigned long length, bool overwrite)
+{
+ if (isExisting(filename)) {
+ if (overwrite && !isDirectory(filename)) {
+ FSAPI_fileDelete(filename);
+ } else {
+ FW_LOGE("[%s] Requested instance '%s' already exist.", __func__, filename);
+ return 0;
+ }
+ }
+
+ GError *gerror = NULL;
+
+ if (!g_file_set_contents(filename, contents, length, &gerror)) {
+ FW_LOGE("[%s] g_file_set_contents error : %s\n", __func__, gerror->message);
+
+ g_error_free(gerror);
+ return 0;
+ }
+
+ return 1;
+}
+
+int FSAPI_fileAppend(const char *filename, const char *contents, unsigned long length, bool overwrite)
+{
+ if (overwrite) {
+ if (!FSAPI_fileDelete(filename)) {
+ if (!isExisting(filename)) {
+ FW_LOGE("[%s] The file %s requested to delete for overwriting is not existing, so just continue.", __func__, filename);
+ } else {
+ if (isDirectory(filename)) {
+ FW_LOGE("[%s] Can't overwrite because requested instance '%s' not a file.", __func__, filename);
+ return 0;
+ } else {
+ FW_LOGE("[%s] FAILED to delete requested file '%s'.", __func__, filename);
+ return 0;
+ }
+ }
+ }
+ }
+
+ FILE *fd;
+ int ret = 1;
+
+ fd = (FILE *)g_fopen(filename, "ab");
+ if (!fd) {
+ FW_LOGE("[FSAPI_fileAppend] file open error.");
+ ret = 0;
+ goto return_part;
+ }
+
+ if (fwrite(contents, 1, length, fd) != length) {
+ FW_LOGE("[%s] fwrite error '%s'.", __func__, filename);
+ ret = 0;
+ goto return_part;
+ }
+
+ if (fsync(fileno(fd)) != 0)
+ ret = 0;
+
+return_part:
+
+ if (fd)
+ fclose(fd);
+
+ FW_LOGI("[%s] Returning..", __func__);
+ return ret;
+}
+
+/*
+ * Folder operation
+ */
+
+int FSAPI_folderCreate(const char *foldername)
+{
+ if (isExisting(foldername)) {
+ FW_LOGE("[%s] Requested instance '%s' already exist.\n", __func__, foldername);
+ return 0;
+ }
+
+ int ret = g_mkdir_with_parents(foldername, 0755);
+ if (ret == -1) {
+ FW_LOGE("[%s] g_mkdir error : %s\n", __func__, strerror(errno));
+ return 0;
+ }
+
+ return 1;
+}
+
+int FSAPI_folderDelete(const char *foldername, bool recursive)
+{
+ if (!isExisting(foldername) || !isDirectory(foldername)) {
+ FW_LOGE("[%s] Requested instance '%s' not exist, or not a directory.\n", __func__, foldername);
+ return 0;
+ }
+
+ GError *gerror = NULL;
+ GDir *dir = NULL;;
+ int ret = 0;
+ char *path = NULL;
+ char *name = NULL;
+
+ if (recursive) {
+ dir = g_dir_open(foldername, 0, &gerror);
+ if (!dir) {
+ FW_LOGE("[%s] g_dir_open error : %s\n", __func__, gerror->message);
+ g_error_free(gerror);
+ return 0;
+ }
+
+ name = (char *)g_dir_read_name(dir);
+
+ for (; name; name = (char *)g_dir_read_name(dir)) {
+
+ path = g_strdup_printf("%s/%s", foldername, name);
+
+ if (isDirectory(path)) {
+ if (!FSAPI_folderDelete(path, true))
+ return 0;
+ } else {
+ if (!FSAPI_fileDelete(path))
+ return 0;
+ }
+ }
+
+ if (name)
+ free(name);
+ if (path)
+ free(path);
+ g_dir_close(dir);
+ dir = NULL;
+ }
+
+ ret = g_rmdir(foldername);
+ if (ret == -1) {
+ FW_LOGE("[%s] g_rmdir error : %s\n", __func__, strerror(errno));
+ return 0;
+ }
+
+ return 1;
+}
+
+int FSAPI_folderEmptyContents(const char *foldername)
+{
+ if (!isExisting(foldername) || !isDirectory(foldername)) {
+ FW_LOGE("[%s] Requested instance '%s' not exist, or not a directory.\n", __func__, foldername);
+ return 0;
+ }
+
+ GError *gerror = NULL;
+ GDir *dir = NULL;;
+ char *path = NULL;
+ char *name = NULL;
+
+ dir = g_dir_open(foldername, 0, &gerror);
+ if (!dir) {
+ FW_LOGE("[%s] g_dir_open error : %s\n", __func__, gerror->message);
+ g_error_free(gerror);
+ return 0;
+ }
+
+ name = (char *)g_dir_read_name(dir);
+
+ for (; name; name = (char *)g_dir_read_name(dir)) {
+
+ path = g_strdup_printf("%s/%s", foldername, name);
+
+ if (isDirectory(path)) {
+ if (!FSAPI_folderDelete(path, true)) {
+ FW_LOGE("[%s] FSAPI_folderDelete error : %s\n", __func__, strerror(errno));
+ return 0;
+ }
+ } else {
+ if (!FSAPI_fileDelete(path)) {
+ FW_LOGE("[%s] FSAPI_fileDelete error : %s\n", __func__, strerror(errno));
+ return 0;
+ }
+ }
+ }
+
+ if (name)
+ free(name);
+ if (path)
+ free(path);
+ g_dir_close(dir);
+ dir = NULL;
+
+ return 1;
+}
+
+int FSAPI_folderRename(const char *source, const char *dest)
+{
+ if (!isExisting(source) || !isDirectory(source) || isExisting(dest)) {
+ FW_LOGE("[%s] Requested source instance '%s' not exist or not a directory, or\n", __func__, source);
+ FW_LOGE("[%s] requested dest instance '%s' already exist.\n", __func__, dest);
+ return 0;
+ }
+
+ int ret = g_rename(source, dest);
+ if (ret == -1) {
+ FW_LOGE("[%s] g_rename error : %s\n", __func__, strerror(errno));
+ return 0;
+ }
+
+ return 1;
+}
diff --git a/framework/src/FSAPI/FSAPI_util.c b/framework/src/FSAPI/FSAPI_util.c
new file mode 100644
index 0000000..0cb067a
--- /dev/null
+++ b/framework/src/FSAPI/FSAPI_util.c
@@ -0,0 +1,61 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#include <string.h>
+#include <glib.h>
+#include <glib/gstdio.h>
+#include "FSAPI/FSAPI_util.h"
+
+int isExisting(const char *filename)
+{
+ return g_file_test(filename, G_FILE_TEST_EXISTS);
+}
+
+int isDirectory(const char *filename)
+{
+ return g_file_test(filename, G_FILE_TEST_IS_DIR);
+}
+
+int getTimeString(time_t *time_stamp, char *time_string)
+{
+ struct tm *time;
+ char buf[20] = { 0 };
+
+ time = localtime(time_stamp);
+ strftime(buf, 20, "%Y:%m:%d %H:%M:%S", time);
+ strcpy(time_string, buf);
+
+ return 1;
+}
diff --git a/framework/src/Initialization/initialize.c b/framework/src/Initialization/initialize.c
new file mode 100755
index 0000000..9de206d
--- /dev/null
+++ b/framework/src/Initialization/initialize.c
@@ -0,0 +1,162 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ */
+
+#include "Utility/fw_log.h"
+#include "Utility/fw_mainloop.h"
+
+#include "Account/Account_Util.h"
+
+#include "PlugIn/PlugIn_DataConnector.h"
+#include "PlugIn/PlugIn_Account.h"
+#include "PlugIn/PlugIn_PlatformMonitor.h"
+#include "PlugIn/PlugIn_NetworkAccess.h"
+#include "PlugIn/PlugIn_DeviceInfo.h"
+
+#include "DataAdapter/DACI_Service.h"
+#include "DataAdapter/DACI_ChangeLog.h"
+
+#include "NetworkAccess/NACI.h"
+
+#include "Device/EXT_DCI_Errors.h"
+#include "Device/EXT_DCI_DevInfo.h"
+
+#include "PlatformMonitor/EXT_PMCI_Errors.h"
+
+#include "Initialization/initialize_parser.h"
+#include "Initialization/initialize.h"
+
+#define LOG_TAG "AF_INIT"
+
+INIT_ERROR Init_Framework(const char *init_config_path)
+{
+ INIT_ERROR init_error = parse_Init_config(init_config_path);
+
+ if (init_error != INIT_SUCCESS) {
+ return init_error;
+ }
+
+ const char *agent_key = get_AgentKey();
+ FW_LOGV("Agent KEY : %s", agent_key);
+
+ int plugIn_dc_count = 0;
+ const PlugIn_DataConnector *plugIn_dc_repository = getDataConnector_PlugInRepository(&plugIn_dc_count);
+
+ /*
+ * Account
+ */
+ if (plugIn_dc_count != 0) {
+ int plugIn_acc_id = getAccount_PlugIn_ID();
+ Set_AccountReposioryName pFunc_Set_AccountReposioryName = getFunction_Set_AccountReposioryName(plugIn_acc_id);
+ if (pFunc_Set_AccountReposioryName != 0) {
+ pFunc_Set_AccountReposioryName(agent_key);
+ }
+ }
+
+ /*
+ * DataConnector Process ChangeNoti
+ */
+ int i = 0;
+ for (; i < plugIn_dc_count; i++) {
+ if (plugIn_dc_repository[i].handle_changenoti) {
+ int plugIn_id = plugIn_dc_repository[i].plugIn_info.plugIn_id;
+
+ SetCallBack_AddItem setCallBack_AddItem = getFunction_DataConnector_SetCallBack_AddItem(plugIn_id);
+ SetCallBack_DeleteItem setCallBack_DeleteItem = getFunction_DataConnector_SetCallBack_DeleteItem(plugIn_id);
+ SetCallBack_UpdateItem setCallBack_UpdateItem = getFunction_DataConnector_SetCallBack_UpdateItem(plugIn_id);
+ SetCallBack_GetAccountIDList setCallBack_GetAccountIDList = getFunction_DataConnector_SetCallBack_GetAccountIDList(plugIn_id);
+ StartListening_ChangeNoti startListening_ChangeNoti = getFunction_DataConnector_StartListening_ChangeNoti(plugIn_id);
+
+ DACI_RETURN da_error = DACI_Service_Open(plugIn_id);
+ if (da_error != DACI_SUCCESS) {
+ FW_LOGE("DACI_Service_Open(%d) Failed!!", plugIn_id);
+ return INIT_SERVICE_DB_FAIL;
+ } else {
+ FW_LOGV("DACI_Service_Open(%d) Success!!", plugIn_id);
+ }
+ setCallBack_AddItem(handle_ADD_ITEM);
+ setCallBack_DeleteItem(handle_DEL_ITEM);
+ setCallBack_UpdateItem(handle_UPDATE_ITEM);
+ setCallBack_GetAccountIDList(getAccountIDList_Service);
+
+ if (plugIn_dc_repository[i].use_mainloop) {
+ register_Callback2MainLoop(startListening_ChangeNoti, 0);
+ }
+ }
+ }
+
+ /*
+ * NetworkAccess
+ */
+ int *na_plugIn_id_list = 0;
+ int na_plugIn_cnt = get_NetworkAccess_PlugIn_ID_List(&na_plugIn_id_list);
+
+ if (na_plugIn_id_list != 0) {
+ i = 0;
+ for (; i < na_plugIn_cnt; i++) {
+ NACI_RESULT res = NACI_Init(na_plugIn_id_list[i]);
+ if (res == NACI_SUCCESS) {
+ FW_LOGI("Success NACI_init() : %d", na_plugIn_id_list[i]);
+ } else {
+ FW_LOGE("Failed NACI_init() : %d, %d", res, na_plugIn_id_list[i]);
+ if (na_plugIn_id_list != 0) {
+ free(na_plugIn_id_list);
+ }
+ return INIT_NETWORK_FAIL;
+ }
+ }
+ free(na_plugIn_id_list);
+ }
+
+ /*
+ * Device Initialization
+ */
+ int plugIn_device_id;
+ if (isExsist_DeviceInfo_PlugIn(&plugIn_device_id)) {
+ DCI_RETURN res = DCI_Init(plugIn_device_id);
+ if (res == DCI_SUCCESS) {
+ FW_LOGI("Success DCI_init() : %d", plugIn_device_id);
+ } else {
+ FW_LOGI("Failed DCI_init() : %d, %d", res, plugIn_device_id);
+ return INIT_DEVICE_FAIL;
+ }
+ }
+
+ if (use_MainLoop()) {
+ FW_LOGV("Run Main Loop!!");
+ run_MainLoop();
+ }
+
+ return INIT_SUCCESS;
+}
diff --git a/framework/src/Initialization/initialize_parser.c b/framework/src/Initialization/initialize_parser.c
new file mode 100755
index 0000000..4a94ffa
--- /dev/null
+++ b/framework/src/Initialization/initialize_parser.c
@@ -0,0 +1,511 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ */
+
+#include <dlfcn.h>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+
+#include "Utility/fw_log.h"
+#include "Utility/fw_mainloop.h"
+
+#include "EngineController/engine_controller_internal.h"
+
+#include "DataAdapter/DACI_Agent.h"
+#include "DataAdapter/DACI_Agent_Handler_Manager.h"
+
+#include "Utility/fw_sequential_id_provider.h"
+
+#include "Event/Event_Handler.h"
+#include "Event/Event_Config.h"
+
+#include "PlugIn/PlugIn_Struct.h"
+#include "PlugIn/PlugIn_DataConnector.h"
+#include "PlugIn/PlugIn_DataConverter.h"
+#include "PlugIn/PlugIn_Account.h"
+#include "PlugIn/PlugIn_NetworkAccess.h"
+#include "PlugIn/PlugIn_DeviceInfo.h"
+#include "PlugIn/PlugIn_PlatformMonitor.h"
+#include "PlugIn/PlugIn_Mgr.h"
+
+#include "Device/EXT_DCI_DevInfo.h"
+
+#include "NetworkAccess/IN_NA_FW_Callbacks.h"
+
+#include "Initialization/initialize_parser.h"
+
+
+#define LOG_TAG "AF_INIT"
+
+static char *agent_key = 0;
+
+static int use_main_loop = 0;
+
+static INIT_ERROR __processNode(xmlNode *root_element);
+
+static INIT_ERROR __process_EngineController(xmlNode *engineController_node);
+
+static INIT_ERROR __process_FrameworkDB(xmlNode *frameworkDB_node);
+
+static INIT_ERROR __process_ID_Provider(xmlNode *idProvider_node);
+
+static INIT_ERROR __process_Event(xmlNode *event_node);
+
+static INIT_ERROR __process_Noti(xmlNode *event_node);
+
+static INIT_ERROR __process_PlugIn(xmlNode *plugInMgr_node);
+
+static INIT_ERROR __process_PlatformMonitor(xmlNode *platformMonitor_node);
+
+static char *__getChildNodeContent(xmlNode *parent_node, const char *node_name);
+
+static int __compareUCharwithChar(const xmlChar *str, const char *str2);
+
+
+INIT_ERROR parse_Init_config(const char *init_config_file_path)
+{
+ FW_LOGV("[Start]");
+
+ xmlDoc *doc = 0;
+ xmlNode *root_element = 0;
+
+ doc = xmlReadFile(init_config_file_path, 0, 0);
+ if (doc == 0) {
+ FW_LOGE("Failed to parse %s", init_config_file_path);
+ return INIT_FAIL;
+ }
+
+ root_element = xmlDocGetRootElement(doc);
+
+ INIT_ERROR init_err = __processNode(root_element);
+
+ xmlFreeDoc(doc);
+
+ xmlCleanupParser();
+
+ FW_LOGV("[End]");
+
+ return init_err;
+}
+
+char *get_AgentKey()
+{
+ return agent_key;
+}
+
+int use_MainLoop()
+{
+ return use_main_loop;
+}
+
+static INIT_ERROR __processNode(xmlNode *root_element)
+{
+ FW_LOGV("[Start]");
+
+ INIT_ERROR init_error = INIT_SUCCESS;
+
+ if (root_element == 0) {
+ return INIT_FAIL;
+ }
+
+ xmlNode *cursor_node = root_element->children;
+ while (cursor_node != 0) {
+ if (cursor_node->type == XML_ELEMENT_NODE) {
+ FW_LOGV("%s", cursor_node->name);
+ if (__compareUCharwithChar(cursor_node->name, "Agent-Key")) {
+ agent_key = (char *)xmlNodeGetContent(cursor_node);
+ FW_LOGV("Agent-Key : %s", agent_key);
+ } else if (__compareUCharwithChar(cursor_node->name, "MainLoop")) {
+ xmlChar *main_loop = xmlNodeGetContent(cursor_node);
+ if (__compareUCharwithChar(main_loop, "1")) {
+ use_main_loop = 1;
+ }
+ } else if (__compareUCharwithChar(cursor_node->name, "EngineController")) {
+ init_error = __process_EngineController(cursor_node);
+ } else if (__compareUCharwithChar(cursor_node->name, "FrameworkDB")) {
+ init_error = __process_FrameworkDB(cursor_node);
+ } else if (__compareUCharwithChar(cursor_node->name, "ID-Provider")) {
+ init_error = __process_ID_Provider(cursor_node);
+ } else if (__compareUCharwithChar(cursor_node->name, "Event")) {
+ init_error = __process_Event(cursor_node);
+ } else if (__compareUCharwithChar(cursor_node->name, "Noti")) {
+ init_error = __process_Noti(cursor_node);
+ } else if (__compareUCharwithChar(cursor_node->name, "PlugIn-Mgr")) {
+ init_error = __process_PlugIn(cursor_node);
+ } else if (__compareUCharwithChar(cursor_node->name, "PlatformMonitor")) {
+ init_error = __process_PlatformMonitor(cursor_node);
+ }
+ }
+
+ cursor_node = cursor_node->next;
+ }
+
+ FW_LOGV("[End]");
+
+ return init_error;
+}
+
+/********************** Implement static function *************************/
+
+static INIT_ERROR __process_EngineController(xmlNode *engineController_node)
+{
+ xmlNode *max_thread = engineController_node->children;
+ if (max_thread == 0) {
+ return INIT_PARSER_FAIL;
+ }
+
+ char *max_thread_count_str = __getChildNodeContent(engineController_node, "Max-Thread");
+ int max_thread_count = atoi(max_thread_count_str);
+
+ if (max_thread_count <= 0) {
+ return INIT_ENGINE_CONTROLLER_FAIL;
+ }
+
+ bool init_success = init_engine_controller(max_thread_count);
+ if (init_success) {
+ FW_LOGI("Engine controller initialize success");
+ } else {
+ FW_LOGI("Engine controller initialize fail");
+ return INIT_ENGINE_CONTROLLER_FAIL;
+ }
+
+ return INIT_SUCCESS;
+}
+
+static INIT_ERROR __process_FrameworkDB(xmlNode *frameworkDB_node)
+{
+ const char *use_DB_str = (char *)xmlGetProp(frameworkDB_node, (xmlChar *)"use");
+ int use_DB = atoi(use_DB_str);
+ if (!use_DB) {
+ FW_LOGV("Not Use Framework Common DB");
+ return INIT_SUCCESS;
+ }
+
+ char *db_path = __getChildNodeContent(frameworkDB_node, "Path");
+ FW_LOGV("Common DB Path : %s", db_path);
+
+ set_agentdb_file_path(db_path);
+
+ DACI_RETURN da_err = DACI_Alloc_AgentDB_Handler_Mgr();
+ if (da_err != DACI_SUCCESS) {
+ return INIT_COMMON_DB_FAIL;
+ }
+
+ da_err = DACI_Open_Agent();
+ if (da_err != DACI_SUCCESS) {
+ return INIT_COMMON_DB_FAIL;
+ }
+
+ da_err = DACI_Create_Agent_Default_Table();
+ if (da_err != DACI_SUCCESS) {
+ return INIT_COMMON_DB_FAIL;
+ }
+
+ return INIT_SUCCESS;
+}
+
+static INIT_ERROR __process_ID_Provider(xmlNode *idProvider_node)
+{
+ char *code_str = __getChildNodeContent(idProvider_node, "Code");
+ char *max_id_str = __getChildNodeContent(idProvider_node, "MaxID");
+ char *page_size_str = __getChildNodeContent(idProvider_node, "PageSize");
+
+ unsigned int code = atoi(code_str);
+ unsigned int id_max = atoi(max_id_str);
+ unsigned int log2_page_size = atoi(page_size_str);
+
+ id_provider_error_t error = id_persistent_provider_create(code, id_max, log2_page_size);
+ if (error == ID_PROVIDER_OK) {
+ FW_LOGV("Done id_persistent_provider_create : %d", error);
+ }
+
+ return INIT_SUCCESS;
+}
+
+static INIT_ERROR __process_Event(xmlNode *event_node)
+{
+ char *event_key = __getChildNodeContent(event_node, "Event-Key");
+ char *event_configfile = __getChildNodeContent(event_node, "Event-Config");
+ xmlChar *run_eventHandler = (xmlChar *)__getChildNodeContent(event_node, "RunEventHandler");
+
+ EVENT_ERROR event_err = set_EventSpec_from_ConfigFile(event_key, event_configfile);
+ if (event_err != EVENT_SUCCESS) {
+ FW_LOGE("Fail Load event config");
+ return INIT_EVENT_FAIL;
+ } else {
+ FW_LOGI("Success Load event config");
+ }
+
+ if (__compareUCharwithChar(run_eventHandler, "1")) {
+ unsigned long int thread_id;
+ event_err = run_Event_Handler(&thread_id);
+ if (event_err != EVENT_SUCCESS) {
+ FW_LOGE("Failed to run_Event_Handler()");
+ return INIT_EVENT_FAIL;
+ }
+ }
+
+ return INIT_SUCCESS;
+}
+
+static INIT_ERROR __process_Noti(xmlNode *event_node)
+{
+ char *noti_key = __getChildNodeContent(event_node, "Noti-Key");
+ char *noti_configfile = __getChildNodeContent(event_node, "Noti-Config");
+
+ EVENT_ERROR event_err = set_NotiSpec_from_ConfigFile(noti_key, noti_configfile);
+ if (event_err != EVENT_SUCCESS) {
+ FW_LOGE("Fail Load noti config : %s", noti_configfile);
+ return INIT_EVENT_FAIL;
+ } else {
+ FW_LOGI("Success Load noti config");
+ }
+
+ return INIT_SUCCESS;
+}
+
+static INIT_ERROR __process_PlugIn(xmlNode *plugInMgr_node)
+{
+ xmlNode *domain_node = plugInMgr_node->children;
+ while (domain_node != 0) {
+ if (domain_node->type == XML_ELEMENT_NODE) {
+ const xmlChar *domain_name = xmlGetProp(domain_node, (xmlChar *)"name");
+ FW_LOGV("Domain : %s =====================", domain_name);
+
+ xmlNode *plugIn_node = domain_node->children;
+ while (plugIn_node != 0) {
+ if (plugIn_node->type == XML_ELEMENT_NODE) {
+ PlugIn_Info_t plugIn_Info;
+
+ char *plugIn_ID = __getChildNodeContent(plugIn_node, "ID");
+ char *plugIn_path = __getChildNodeContent(plugIn_node, "Path");
+
+ plugIn_Info.plugIn_id = atoi(plugIn_ID);
+
+ PLUGIN_ERROR plugIn_error;
+ plugIn_Info.plugIn_handle = load_PlugIn(plugIn_path, &plugIn_error);
+ if (plugIn_error != PLUGIN_SUCCESS) {
+ FW_LOGE("load_PlugIn Failed [%s]", plugIn_path);
+ return INIT_PLUGIN_FAIL;
+ }
+
+ FW_LOGV("plugIn_ID : %d", plugIn_Info.plugIn_id);
+ FW_LOGV("plugIn_Path : %s", plugIn_path);
+
+ if (__compareUCharwithChar(domain_name, "DataConnector")) {
+ PlugIn_DataConnector plugIn_dc;
+ char *dataConverter = __getChildNodeContent(plugIn_node, "DataConverter-PlugIn");
+ char *handleChangeNoti = __getChildNodeContent(plugIn_node, "Handle-ChangeNoti");
+ char *useMainLoop = __getChildNodeContent(plugIn_node, "Use-MainLoop");
+
+ plugIn_dc.plugIn_info = plugIn_Info;
+ plugIn_dc.data_converter_id = atoi(dataConverter);
+ plugIn_dc.handle_changenoti = atoi(handleChangeNoti);
+ plugIn_dc.use_mainloop = atoi(useMainLoop);
+ plugIn_dc.func_set = getDataConnector_Func_Set(plugIn_Info.plugIn_handle, &plugIn_error);
+
+ registerPlugIn_DataConnector(plugIn_dc);
+ } else if (__compareUCharwithChar(domain_name, "DataConverter")) {
+ PlugIn_DataConverter plugIn_dataconverter;
+
+ plugIn_dataconverter.plugIn_info = plugIn_Info;
+ plugIn_dataconverter.func_Set = getDataConverter_Func_Set(plugIn_Info.plugIn_handle, &plugIn_error);
+
+ registerPlugIn_DataConverter(plugIn_dataconverter);
+ } else if (__compareUCharwithChar(domain_name, "Account")) {
+ PlugIn_Account plugIn_acc;
+
+ plugIn_acc.plugIn_info = plugIn_Info;
+ plugIn_acc.func_Set = getAccount_Func_Set(plugIn_Info.plugIn_handle, &plugIn_error);
+
+ registerPlugIn_Account(plugIn_acc);
+ } else if (__compareUCharwithChar(domain_name, "NetworkAccess")) {
+ PlugIn_NetworkAccess plugIn_na;
+
+ plugIn_na.plugIn_info = plugIn_Info;
+ plugIn_na.func_Set = getNetworkAccess_Func_Set(plugIn_Info.plugIn_handle, &plugIn_error);
+
+ char *use_network = __getChildNodeContent(plugIn_node, "UseNetwork");
+ plugIn_na.use_network = atoi(use_network);
+
+ registerPlugIn_NetworkAccess(plugIn_na);
+ } else if (__compareUCharwithChar(domain_name, "DeviceInfo")) {
+ PlugIn_DeviceInfo plugIn_device;
+
+ plugIn_device.plugIn_info = plugIn_Info;
+ plugIn_device.func_Set = getDeviceInfo_Func_Set(plugIn_Info.plugIn_handle, &plugIn_error);
+
+ registerPlugIn_DeviceInfo(plugIn_device);
+ } else if (__compareUCharwithChar(domain_name, "PlatformMonitor")) {
+ PlugIn_PlatformMonitor plugIn_pm;
+
+ plugIn_pm.plugIn_info = plugIn_Info;
+ plugIn_pm.func_Set = getPlatformMonitor_Func_Set(plugIn_Info.plugIn_handle, &plugIn_error);
+
+ registerPlugIn_PlatformMonitor(plugIn_pm);
+ }
+ }
+
+ plugIn_node = plugIn_node->next;
+ }
+ }
+ domain_node = domain_node->next;
+ }
+
+ return INIT_SUCCESS;
+}
+
+static INIT_ERROR __process_PlatformMonitor(xmlNode *platformMonitor_node)
+{
+ xmlNode *cursor_node = platformMonitor_node->children;
+ while (cursor_node != 0) {
+ if (cursor_node->type == XML_ELEMENT_NODE) {
+ pm_register_data_t *reg_data = NULL;
+
+ const xmlChar *child_name = cursor_node->name;
+ FW_LOGV("PlatformMonitor function : %s", child_name);
+
+ char *use_str = (char *)xmlGetProp(cursor_node, (xmlChar *)"use");
+ char *mainloop_str = (char *)xmlGetProp(cursor_node, (xmlChar *)"mainloop");
+ int use_function = atoi(use_str);
+ int use_main_loop = atoi(mainloop_str);
+ int pm_plugin_id = get_PlatformMonitor_PlugIn_Id();
+
+ if (pm_plugin_id == 0) {
+ return INIT_PM_FAIL;
+ }
+
+ if (__compareUCharwithChar(child_name, "NetworkStat")) {
+ if (use_function) {
+ SetCallBack_NetworkStatus setCallBack_NetStatus = getFunction_PlatformMonitor_SetCallBack_NetworkStatus(pm_plugin_id);
+ SetCallBack_NetworkAllCancel setCallBack_NetAllCancel = getFunction_PlatformMonitor_SetCallBack_NetworkAllCancel(pm_plugin_id);
+ setCallBack_NetStatus(handle_Network_Status);
+ setCallBack_NetAllCancel(handle_Network_All_Cancel);
+
+ Init_Network_Status_Noti_Handler pFunc_Init_Network_Stat = getFunction_PlatformMonitor_Init_Network_Status_Noti_Handler(pm_plugin_id);
+ if (pFunc_Init_Network_Stat == 0) {
+ FW_LOGE("cannot get pFunc_Init_Network_Stat !!");
+ return INIT_PM_FAIL;
+ }
+
+ if (use_main_loop) {
+ FW_LOGV("register_Callback2MainLoop( Init_Network_Stat ) !!");
+ register_Callback2MainLoop(pFunc_Init_Network_Stat, 0);
+ } else {
+ pFunc_Init_Network_Stat(0);
+ }
+ }
+ } else if (__compareUCharwithChar(child_name, "SAN")) {
+ if (use_function) {
+ Init_Syncml_SAN_Noti_Handler pFunc_Init_SAN = getFunction_PlatformMonitor_Init_Syncml_SAN_Noti_Handler(pm_plugin_id);
+ if (pFunc_Init_SAN == 0) {
+ FW_LOGE("cannot get pFunc_Init_SAN !!");
+ return INIT_PM_FAIL;
+ }
+
+ if (use_main_loop) {
+ FW_LOGV("register_Callback2MainLoop( pFunc_Init_SAN ) !!");
+ register_Callback2MainLoop(pFunc_Init_SAN, 0);
+ } else {
+ pFunc_Init_SAN(0);
+ }
+ }
+ } else if (__compareUCharwithChar(child_name, "ALARM")) {
+ if (use_function) {
+ const char *pkg_name = __getChildNodeContent(cursor_node, "Pkg-Name");
+
+ Init_Alarm_Noti_Handler pFunc_Init_Alarm = getFunction_PlatformMonitor_Init_Alarm_Noti_Handler(pm_plugin_id);
+ if (pFunc_Init_Alarm == 0) {
+ FW_LOGE("cannot get pFunc_Init_Alarm !!");
+ return INIT_PM_FAIL;
+ }
+
+ reg_data = (pm_register_data_t *) calloc(1, sizeof(pm_register_data_t));
+ if (reg_data == NULL) {
+ FW_LOGE("calloc pm_register_data_t fail !!");
+ return INIT_PM_FAIL;
+ }
+
+ if (pkg_name != NULL) {
+ FW_LOGV("pkg_name : %s", pkg_name);
+ reg_data->pkg_name = strdup(pkg_name);
+ }
+
+ if (use_main_loop) {
+ FW_LOGV("register_Callback2MainLoop( pFunc_Init_Alarm ) !!");
+ register_Callback2MainLoop(pFunc_Init_Alarm, (void *)reg_data);
+ } else {
+ pFunc_Init_Alarm((void *)reg_data);
+ }
+ }
+ } else {
+ FW_LOGE("Not Supported Platform Function : %s", child_name);
+ }
+ }
+
+ cursor_node = cursor_node->next;
+ }
+
+ return INIT_SUCCESS;
+}
+
+static char *__getChildNodeContent(xmlNode *parent_node, const char *node_name)
+{
+ if (parent_node == 0 || node_name == 0) {
+ return 0;
+ }
+
+ xmlNode *cursor_node = parent_node->children;
+
+ while (cursor_node != 0) {
+ if (cursor_node->type == XML_ELEMENT_NODE) {
+ const xmlChar *compare_name = cursor_node->name;
+ if (__compareUCharwithChar(compare_name, node_name)) {
+ return (char *)xmlNodeGetContent(cursor_node);
+ }
+ }
+ cursor_node = cursor_node->next;
+ }
+
+ return 0;
+}
+
+static int __compareUCharwithChar(const xmlChar *str, const char *str2)
+{
+ if (str == 0 || str2 == 0) {
+ return 0;
+ }
+
+ return xmlStrEqual(str, (const xmlChar *)str2);
+}
diff --git a/framework/src/NetworkAccess/IN_NA_FW_Callbacks.c b/framework/src/NetworkAccess/IN_NA_FW_Callbacks.c
new file mode 100644
index 0000000..903b915
--- /dev/null
+++ b/framework/src/NetworkAccess/IN_NA_FW_Callbacks.c
@@ -0,0 +1,119 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#include "Utility/fw_log.h"
+#include "NetworkAccess/IN_NA_FW_Callbacks.h"
+#include "NetworkAccess/IN_NA_Session_Manager.h"
+#include "PlugIn/PlugIn_NetworkAccess.h"
+
+#define LOG_TAG "AF_NACI"
+
+int handle_Network_Status(int na_plugIn_id, int fw_network_status, int fw_network_type, char *proxy, char *ip)
+{
+ FW_LOGV("Start !!");
+
+ int err = set_network_info(na_plugIn_id, fw_network_status, fw_network_type, proxy, ip);
+ if (err != 1) {
+ FW_LOGE("set_network_info() is fail !!");
+ return err;
+ } else {
+ FW_LOGV("set_network_info() is success !!");
+ }
+
+ FW_LOGV("End !!");
+
+ return err;
+}
+
+int handle_Network_All_Cancel(int na_plugIn_id)
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+ GList *session_list = NULL;
+
+ int err = get_all_session(&session_list);
+ if (err != 1) {
+ FW_LOGE("get_all_session() is fail !!");
+ return -1;
+ } else {
+ FW_LOGV("get_all_session() is success !!");
+ }
+
+ Cancel_Message pFunc_Cancel_Message = getFunction_NetworkAccess_Cancel_Message(na_plugIn_id);
+
+ if (pFunc_Cancel_Message == 0) {
+ FW_LOGV("[%s] cannot get pFunc !!\n", __func__);
+ }
+
+ if (session_list != NULL) {
+ GList *iter = NULL;
+ void *session = NULL;
+
+ for (iter = session_list; iter != NULL; iter = g_list_next(iter)) {
+ session = (void *)(iter->data);
+
+ if (session != NULL) {
+ FW_LOGV("session : %d", session);
+ err = pFunc_Cancel_Message(session);
+
+ if (err != 1) {
+ FW_LOGE("cancel message() is fail !!");
+ return -1;
+ } else {
+ FW_LOGV("cancel message() is success !!");
+ }
+ } else {
+ FW_LOGE("session is NULL !!");
+ return -1;
+ }
+ }
+ } else {
+ FW_LOGE("session_list is NULL !!");
+ }
+
+ err = remove_all_session_info(1);
+
+ if (err != 1) {
+ FW_LOGE("remove_all_session_info() is fail !!");
+ return -1;
+ } else {
+ FW_LOGV("remove_all_session_info() success !!");
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
diff --git a/framework/src/NetworkAccess/IN_NA_Session_Manager.c b/framework/src/NetworkAccess/IN_NA_Session_Manager.c
new file mode 100755
index 0000000..63459f5
--- /dev/null
+++ b/framework/src/NetworkAccess/IN_NA_Session_Manager.c
@@ -0,0 +1,948 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#include <string.h>
+#include "NetworkAccess/IN_NA_Session_Manager.h"
+
+#include "Utility/fw_sequential_id_provider.h"
+#include "Utility/fw_log.h"
+
+#include "PlugIn/PlugIn_NetworkAccess.h"
+
+#define MAX_ID_CNT 1000
+
+#define LOG_TAG "AF_NA_SM"
+
+static NA_Session_Manager session_manager;
+static id_provider_t *pid_provider;
+
+static int remove_all_session(int na_plugIn_id);
+static int create_all_session(int na_plugIn_id);
+static void set_ip_n_proxy(char *ip, char *proxy);
+static int change_all_session_info(int na_plugIn_id);
+
+void init_session_manager()
+{
+ FW_LOGV("Start !!");
+
+ session_manager.session_info_list = NULL;
+ session_manager.ip = NULL;
+ session_manager.proxy = NULL;
+ session_manager.fw_network_status = NETWORK_UNKNOWN;
+ session_manager.fw_network_type = NETWORK_NONE;
+
+ pid_provider = id_provider_create(MAX_ID_CNT, 12, true);
+
+ FW_LOGV("End !!");
+}
+
+void destroy_session_manager()
+{
+ FW_LOGV("Start !!");
+
+ int err = remove_all_session_info(0);
+ if (err != 1) {
+ FW_LOGE("remove_all_session_info() fail !!");
+ /* todo : exception handling */
+ } else {
+ FW_LOGV("remove_all_session_info() success !!");
+ }
+
+ if (session_manager.ip != NULL) {
+ free(session_manager.ip);
+ }
+ FW_LOGV("free ip address !!");
+
+ if (session_manager.proxy != NULL) {
+ free(session_manager.proxy);
+ }
+ FW_LOGV("free proxy !!");
+
+ session_manager.fw_network_status = NETWORK_UNKNOWN;
+ session_manager.fw_network_type = NETWORK_NONE;
+ FW_LOGV("clear network info !!");
+
+ id_provider_destroy(pid_provider);
+ FW_LOGV("id_provider_destroy() success !!");
+
+ FW_LOGV("End !!");
+}
+
+int create_session_info(void **session)
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+ NA_Session_Info *session_info;
+
+ /* memory alloc - session_info */
+ session_info = (NA_Session_Info *) calloc(1, sizeof(NA_Session_Info));
+ if (session_info == NULL) {
+ FW_LOGE("session_info calloc fail !!");
+ return -1;
+ }
+ FW_LOGV("session_info calloc success !!");
+
+ session_info->msg = (void *)calloc(1, sizeof(session_info->msg));
+ session_info->id = (char *)calloc(1, sizeof(session_info->id));
+ session_info->password = (char *)calloc(1, sizeof(session_info->password));
+
+ session_info->session = (void *)calloc(1, sizeof(session_info->session));
+ *session = session_info->session;
+
+ /* append session_info to session_info_list */
+ session_manager.session_info_list = g_list_append(session_manager.session_info_list, session_info);
+ FW_LOGV("append session_info");
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+int provide_session_id(unsigned int *session_id)
+{
+ FW_LOGV("Start !!");
+
+ id_provider_error_t id_error = ID_PROVIDER_OK;
+ int res = 1;
+
+ /* check session validation */
+
+ /* generate session id */
+ id_error = id_provider_provide_id(pid_provider, session_id);
+ if (id_error == ID_PROVIDER_NOT_ENOUGH_ID) {
+ FW_LOGE("provided session id is full !!");
+ /* todo : reset MAX_ID_CNT & re-generate */
+ return -1;
+ }
+ FW_LOGV("session id : %d", *session_id);
+
+ /* add session & session_id to session_info */
+ ((NA_Session_Info *) ((g_list_last(session_manager.session_info_list))->data))->session_id = *session_id;
+ FW_LOGV("add session_id success !!");
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+int get_session(unsigned int session_id, void **session)
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+
+ GList *iter = NULL;
+ NA_Session_Info *iter_data;
+
+ /* find same session_id in session_info_list */
+ for (iter = session_manager.session_info_list; iter != NULL; iter = g_list_next(iter)) {
+ iter_data = NULL;
+ if (((NA_Session_Info *) (iter->data))->session_id != -1) {
+ if (((NA_Session_Info *) (iter->data))->session_id == session_id) {
+ iter_data = (NA_Session_Info *) (iter->data);
+ FW_LOGV("find session_id : %d", session_id);
+ break;
+ }
+ } else {
+ FW_LOGE("invalid session_id : -1 !!");
+ res = -1;
+ /* todo : exception handling */
+ }
+ }
+
+ if (iter_data != NULL) {
+ *session = ((NA_Session_Info *) iter_data)->session;
+
+ FW_LOGV("get_session() is success !!");
+ } else {
+ FW_LOGE("iter_data is NULL !!");
+ FW_LOGE("not exist session_id ( %d ) in session_info_list !!", session_id);
+ res = -1;
+ /* todo : exception handling */
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+int set_session(unsigned int session_id, void *session)
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+
+ GList *iter = NULL;
+ NA_Session_Info *iter_data;
+
+ /* find same session_id in session_info_list */
+ for (iter = session_manager.session_info_list; iter != NULL; iter = g_list_next(iter)) {
+ iter_data = NULL;
+ if (((NA_Session_Info *) (iter->data))->session_id != -1) {
+ if (((NA_Session_Info *) (iter->data))->session_id == session_id) {
+ iter_data = (NA_Session_Info *) (iter->data);
+ FW_LOGV("find session_id : %d", session_id);
+ break;
+ }
+ } else {
+ FW_LOGE("invalid session_id : -1 !!");
+ res = -1;
+ /* todo : exception handling */
+ }
+ }
+
+ if (iter_data != NULL) {
+ iter_data->session = session;
+ FW_LOGV("iter_data->session : %d", iter_data->session);
+
+ FW_LOGV("set_session() is success !!");
+ } else {
+ FW_LOGE("iter_data is NULL !!");
+ FW_LOGE("not exist session_id ( %d ) in session_info_list !!", session_id);
+ res = -1;
+ /* todo : exception handling */
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+FW_NETWORK_STATUS get_network_status()
+{
+ return session_manager.fw_network_status;
+}
+
+int set_network_status(FW_NETWORK_STATUS network_status)
+{
+ int res = 1;
+ session_manager.fw_network_status = network_status;
+ return res;
+}
+
+FW_NETWORK_TYPE get_network_type()
+{
+ return session_manager.fw_network_type;
+}
+
+char *get_proxy()
+{
+ return session_manager.proxy;
+}
+
+int get_msg(unsigned int session_id, void **msg)
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+
+ GList *iter = NULL;
+ NA_Session_Info *iter_data;
+
+ /* find same session_id in session_info_list */
+ for (iter = session_manager.session_info_list; iter != NULL; iter = g_list_next(iter)) {
+ iter_data = NULL;
+ if (((NA_Session_Info *) (iter->data))->session_id != -1) {
+ if (((NA_Session_Info *) (iter->data))->session_id == session_id) {
+ iter_data = (NA_Session_Info *) (iter->data);
+ FW_LOGV("find session_id : %d", session_id);
+ break;
+ }
+ } else {
+ FW_LOGE("invalid session_id : -1 !!");
+ res = -1;
+ /* todo : exception handling */
+ }
+ }
+
+ if (iter_data != NULL) {
+ *msg = ((NA_Session_Info *) iter_data)->msg;
+
+ FW_LOGV("get_msg() is success !!");
+ } else {
+ FW_LOGE("iter_data is NULL !!");
+ FW_LOGE("not exist session_id ( %d ) in session_info_list !!", session_id);
+ res = -1;
+ /* todo : exception handling */
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+int get_timeout(unsigned int session_id, int *timeout)
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+
+ GList *iter = NULL;
+ NA_Session_Info *iter_data;
+
+ /* find same session_id in session_info_list */
+ for (iter = session_manager.session_info_list; iter != NULL; iter = g_list_next(iter)) {
+ iter_data = NULL;
+ if (((NA_Session_Info *) (iter->data))->session_id != -1) {
+ if (((NA_Session_Info *) (iter->data))->session_id == session_id) {
+ iter_data = (NA_Session_Info *) (iter->data);
+ FW_LOGV("find session_id : %d", session_id);
+ break;
+ }
+ } else {
+ FW_LOGE("invalid session_id : -1 !!");
+ res = -1;
+ /* todo : exception handling */
+ }
+ }
+
+ if (iter_data != NULL) {
+ *timeout = ((NA_Session_Info *) iter_data)->timeout;
+ FW_LOGV("timeout : %d", *timeout);
+
+ FW_LOGV("get_timeout() is success !!");
+ } else {
+ FW_LOGE("iter_data is NULL !!");
+ FW_LOGE("not exist session_id ( %d ) in session_info_list !!", session_id);
+ res = -1;
+ /* todo : exception handling */
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+int set_timeout(unsigned int session_id, int timeout)
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+
+ GList *iter = NULL;
+ NA_Session_Info *iter_data;
+
+ /* find same session_id in session_info_list */
+ for (iter = session_manager.session_info_list; iter != NULL; iter = g_list_next(iter)) {
+ iter_data = NULL;
+ if (((NA_Session_Info *) (iter->data))->session_id != -1) {
+ if (((NA_Session_Info *) (iter->data))->session_id == session_id) {
+ iter_data = (NA_Session_Info *) (iter->data);
+ FW_LOGV("find session_id : %d", session_id);
+ break;
+ }
+ } else {
+ FW_LOGE("invalid session_id : -1 !!");
+ res = -1;
+ /* todo : exception handling */
+ }
+ }
+
+ if (iter_data != NULL) {
+ ((NA_Session_Info *) iter_data)->timeout = timeout;
+ FW_LOGV("timeout : %d", ((NA_Session_Info *) iter_data)->timeout);
+
+ FW_LOGV("set_timeout() is success !!");
+ } else {
+ FW_LOGE("iter_data is NULL !!");
+ FW_LOGE("not exist session_id ( %d ) in session_info_list !!", session_id);
+ res = -1;
+ /* todo : exception handling */
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+int get_id_n_password(unsigned int session_id, char **id, char **password)
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+
+ GList *iter = NULL;
+ NA_Session_Info *iter_data;
+
+ /* find same session_id in session_info_list */
+ for (iter = session_manager.session_info_list; iter != NULL; iter = g_list_next(iter)) {
+ iter_data = NULL;
+ if (((NA_Session_Info *) (iter->data))->session_id != -1) {
+ if (((NA_Session_Info *) (iter->data))->session_id == session_id) {
+ iter_data = (NA_Session_Info *) (iter->data);
+ FW_LOGV("find session_id : %d", session_id);
+ break;
+ }
+ } else {
+ FW_LOGE("invalid session_id : -1 !!");
+ res = -1;
+ /* todo : exception handling */
+ }
+ }
+
+ if (iter_data != NULL) {
+ *id = ((NA_Session_Info *) iter_data)->id;
+ FW_LOGV("id : %s", *id);
+
+ *password = ((NA_Session_Info *) iter_data)->password;
+ FW_LOGV("password : %s", *password);
+
+ FW_LOGV("get_id_n_password() is success !!");
+ } else {
+ FW_LOGE("iter_data is NULL !!");
+ FW_LOGE("not exist session_id ( %d ) in session_info_list !!", session_id);
+ res = -1;
+ /* todo : exception handling */
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+int set_id_n_password(unsigned int session_id, char *id, char *password)
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+
+ GList *iter = NULL;
+ /* NA_Session_Info *iter_data; */
+
+ /* find same session_id in session_info_list */
+ for (iter = session_manager.session_info_list; iter != NULL; iter = g_list_next(iter)) {
+ /* iter_data = NULL; */
+ if (iter->data != NULL) {
+ if (((NA_Session_Info *) (iter->data))->session_id != -1) {
+ if (((NA_Session_Info *) (iter->data))->session_id == session_id) {
+ FW_LOGV("find session_id : %d", session_id);
+
+ if ((iter->data) != NULL) {
+ ((NA_Session_Info *) (iter->data))->id = strdup(id);
+ FW_LOGV("id : %s", ((NA_Session_Info *) (iter->data))->id);
+ ((NA_Session_Info *) (iter->data))->password = strdup(password);
+ FW_LOGV("password : %s", ((NA_Session_Info *) (iter->data))->password);
+
+ FW_LOGV("set_id_n_password() is success !!");
+ } else {
+ FW_LOGE("iter_data is NULL !!");
+ FW_LOGE("not exist session_id ( %d ) in session_info_list !!", session_id);
+ res = -1;
+ }
+ break;
+ }
+ } else {
+ FW_LOGE("invalid session_id : -1 !!");
+ /*res = -1;*/
+ return -1;
+ /* todo : exception handling */
+ }
+ } else {
+ FW_LOGE("iter->data is NULL !!");
+ /*res = -1;*/
+ return -1;
+ /* todo : exception handling */
+ }
+ }
+
+/* if (iter_data != NULL) {
+ ((NA_Session_Info *) iter_data)->id = strdup(id);
+ FW_LOGV("id : %s", ((NA_Session_Info *) iter_data)->id);
+
+ ((NA_Session_Info *) iter_data)->password = strdup(password);
+ FW_LOGV("password : %s", ((NA_Session_Info *) iter_data)->password);
+
+ FW_LOGV("set_id_n_password() is success !!");
+ } else {
+ FW_LOGE("iter_data is NULL !!");
+ FW_LOGE("not exist session_id ( %d ) in session_info_list !!", session_id);
+ res = -1;
+ todo : exception handling
+ } */
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+int get_all_session(GList **session_list)
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+
+ if (session_manager.session_info_list != NULL) {
+ GList *iter = NULL;
+ NA_Session_Info *iter_data;
+
+ for (iter = session_manager.session_info_list; iter != NULL; iter = g_list_next(iter)) {
+ iter_data = NULL;
+ iter_data = ((NA_Session_Info *) (iter->data));
+
+ if (iter_data != NULL) {
+ FW_LOGV("session : %d", iter_data->session);
+ *session_list = g_list_append(*session_list, (void *)(iter_data->session));
+ } else {
+ FW_LOGE("iter_data is NULL !!");
+ return -1;
+ /* todo : exception handling */
+ }
+ }
+ } else {
+ FW_LOGE("session_info_list is NULL !!");
+ return -1;
+ /* todo : exception handling */
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+int remove_session_info(unsigned int session_id, int flag)
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+
+ GList *iter = NULL;
+ NA_Session_Info *iter_data;
+
+ /* find same session_id in session_info_list */
+ for (iter = session_manager.session_info_list; iter != NULL; iter = g_list_next(iter)) {
+ iter_data = NULL;
+ if (((NA_Session_Info *) (iter->data))->session_id != -1) {
+ if (((NA_Session_Info *) (iter->data))->session_id == session_id) {
+ iter_data = (NA_Session_Info *) (iter->data);
+ FW_LOGV("find session_id : %d", session_id);
+ break;
+ }
+ } else {
+ FW_LOGE("invalid session_id : -1 !!");
+ res = -1;
+ /* todo : exception handling */
+ }
+ }
+
+ /* remove session_info */
+ if (iter_data != NULL) {
+ session_manager.session_info_list = g_list_remove(session_manager.session_info_list, iter_data);
+
+ if (flag == 0) {
+ if (((NA_Session_Info *) (iter_data))->session != NULL)
+ free(((NA_Session_Info *) iter_data)->session);
+ }
+ if (((NA_Session_Info *) iter_data)->msg != NULL)
+ free(((NA_Session_Info *) iter_data)->msg);
+
+ if (((NA_Session_Info *) iter_data)->id != NULL)
+ free(((NA_Session_Info *) iter_data)->id);
+
+ if (((NA_Session_Info *) iter_data)->password != NULL)
+ free(((NA_Session_Info *) iter_data)->password);
+
+ int err = id_provider_delete_id(pid_provider, session_id);
+ if (err != ID_PROVIDER_OK) {
+ FW_LOGE("id_provider_delete_id() is fail !!");
+ res = -1;
+ /* todo : exception handling */
+ }
+
+ free((NA_Session_Info *) iter_data);
+
+ FW_LOGV("remove_session_info() is success !!");
+ } else {
+ FW_LOGE("iter_data is NULL !!");
+ FW_LOGE("not exist session_id ( %d ) in session_info_list !!", session_id);
+ res = -1;
+ /* todo : exception handling */
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+int remove_all_session_info(int flag)
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+
+ if (session_manager.session_info_list != NULL) {
+ GList *iter = NULL;
+ NA_Session_Info *iter_data;
+
+ for (iter = session_manager.session_info_list; iter != NULL;) {
+ iter_data = NULL;
+ iter_data = ((NA_Session_Info *) (iter->data));
+ iter = g_list_next(iter);
+ session_manager.session_info_list = g_list_remove(session_manager.session_info_list, iter_data);
+
+ if (iter_data != NULL) {
+ if (flag == 0) {
+ if (((NA_Session_Info *) iter_data)->session != NULL)
+ free(((NA_Session_Info *) iter_data)->session);
+ }
+ if (((NA_Session_Info *) iter_data)->msg != NULL)
+ free(((NA_Session_Info *) iter_data)->msg);
+
+ if (((NA_Session_Info *) iter_data)->id != NULL)
+ free(((NA_Session_Info *) iter_data)->id);
+
+ if (((NA_Session_Info *) iter_data)->password != NULL)
+ free(((NA_Session_Info *) iter_data)->password);
+
+ int err = id_provider_delete_id(pid_provider, ((NA_Session_Info *) iter_data)->session_id);
+ if (err != ID_PROVIDER_OK) {
+ FW_LOGE("id_provider_delete_id() is fail !!");
+ res = -1;
+ /* todo : exception handling */
+ }
+
+ ((NA_Session_Info *) iter_data)->timeout = 0;
+
+ free((NA_Session_Info *) iter_data);
+ }
+ }
+
+ g_list_free(session_manager.session_info_list);
+ session_manager.session_info_list = NULL;
+ } else {
+ FW_LOGE("session_info_list is NULL !!");
+ res = -1;
+ /* todo : exception handling */
+ }
+ FW_LOGV("clear session_info_list !!");
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+int set_network_info(int na_plugIn_id, int net_status, int net_type, char *proxy, char *ip)
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+
+ FW_LOGV("network status : %d", net_status);
+ FW_LOGV("network type : %d", net_type);
+ FW_LOGV("ip : %s", ip);
+ FW_LOGV("proxy : %s", proxy);
+
+ /* set network status */
+ session_manager.fw_network_status = net_status;
+
+ /* set network type */
+ session_manager.fw_network_type = net_type;
+
+ /*
+ * proxy 와 ip settingì´ ì²˜ìŒì¸ì§€ íŒë‹¨í•˜ì—¬ 비êµí•˜ëŠ” 부분 수행할 것ì¸ì§€ ê²°ì •
+ * => session_info_listê°€ NULLì´ë©´ 처ìŒìœ¼ë¡œ íŒë‹¨
+ */
+ if (session_manager.session_info_list == NULL) { /* or g_list_length(session_manager.session_info_list) == 0 */
+ /* set ip & proxy */
+ set_ip_n_proxy(ip, proxy);
+ } else {
+ /*
+ * session_infoê°€ 하나ë¼ë„ 존재할 경우,
+ * 기존 data와 비êµ(ip, proxy)하여 처리
+ * - 기존 data와 다를 경우, 모든 sessionì˜ ìž¬ì„¤ì • í•„ìš”
+ * - NULL check !!
+ */
+ if ((net_status == NETWORK_ON) && ((net_type == NETWORK_3G_ON) || (net_type == NETWORK_WIFI_ON) || (net_type == NETWORK_WIFI_3G_ON))) {
+ /* ip */
+ if ((session_manager.ip != NULL) && (ip != NULL)) {
+ if (!strcmp(session_manager.ip, ip)) {
+ FW_LOGV("same ip : do nothing !!");
+ } else {
+ FW_LOGV("different ip : change all session !!");
+
+ /* set ip & proxy */
+ set_ip_n_proxy(ip, proxy);
+
+ /* change all session info */
+ int err = change_all_session_info(na_plugIn_id);
+ if (err != 1) {
+ FW_LOGE("change_all_session_info() is fail !!");
+ return -1;
+ /* todo : exception handling */
+ } else {
+ FW_LOGV("change_all_session_info() is success !!");
+ }
+ }
+ } else if (((session_manager.ip == NULL) && (ip != NULL)) || ((session_manager.ip != NULL) && (ip == NULL))) {
+ FW_LOGV("different ip : change all session !!");
+
+ /* set ip & proxy */
+ set_ip_n_proxy(ip, proxy);
+
+ /* change all session info */
+ int err = change_all_session_info(na_plugIn_id);
+ if (err != 1) {
+ FW_LOGE("change_all_session_info() is fail !!");
+ return -1;
+ /* todo : exception handling */
+ } else {
+ FW_LOGV("change_all_session_info() is success !!");
+ }
+ } else { /* if ((session_manager.ip == NULL) && (ip == NULL)) { */
+ FW_LOGV("same ip : do nothing !!");
+ }
+
+ /* proxy */
+ if ((session_manager.proxy != NULL) && (proxy != NULL)) {
+ if (!strcmp(session_manager.proxy, proxy)) {
+ FW_LOGV("same proxy : do nothing !!");
+ } else {
+ FW_LOGV("different proxy : change all session !!");
+
+ /* set ip & proxy */
+ set_ip_n_proxy(ip, proxy);
+
+ /* change all session info */
+ int err = change_all_session_info(na_plugIn_id);
+ if (err != 1) {
+ FW_LOGE("change_all_session_info() is fail !!");
+ return -1;
+ /* todo : exception handling */
+ } else {
+ FW_LOGV("change_all_session_info() is success !!");
+ }
+ }
+ } else if (((session_manager.proxy == NULL) && (proxy != NULL)) || ((session_manager.proxy != NULL) && (proxy == NULL))) {
+ FW_LOGV("different ip : change all session !!");
+
+ /* set ip & proxy */
+ set_ip_n_proxy(ip, proxy);
+
+ /* change all session info */
+ int err = change_all_session_info(na_plugIn_id);
+ if (err != 1) {
+ FW_LOGE("change_all_session_info() is fail !!");
+ return -1;
+ /* todo : exception handling */
+ } else {
+ FW_LOGV("change_all_session_info() is success !!");
+ }
+ } else { /* if ((session_manager.proxy == NULL) && (proxy == NULL)) { */
+ FW_LOGV("same proxy : do nothing !!");
+ }
+ } else {
+ /* set ip & proxy */
+ set_ip_n_proxy(ip, proxy);
+ }
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+static int remove_all_session(int na_plugIn_id)
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+
+ Cancel_Message pFunc_Cancel_Message = getFunction_NetworkAccess_Cancel_Message(na_plugIn_id);
+
+ if (pFunc_Cancel_Message == 0) {
+ FW_LOGV("cannot get pFunc !!");
+ }
+
+ if (session_manager.session_info_list != NULL) {
+ GList *iter = NULL;
+ NA_Session_Info *iter_data;
+ int err = 0;
+
+ for (iter = session_manager.session_info_list; iter != NULL; iter = g_list_next(iter)) {
+ iter_data = NULL;
+ iter_data = ((NA_Session_Info *) (iter->data));
+
+ if (iter_data != NULL) {
+ err = pFunc_Cancel_Message(((NA_Session_Info *) iter_data)->session);
+ if (err != 1) {
+ FW_LOGE("cancel message fail !!");
+ return -1;
+ /* todo : exception handling */
+ } else {
+ FW_LOGV("cancel message success !!");
+ }
+ iter_data->session = NULL;
+
+ if (((NA_Session_Info *) iter_data)->msg != NULL) {
+ free(((NA_Session_Info *) iter_data)->msg);
+ iter_data->msg = NULL;
+ }
+ } else {
+ FW_LOGE("iter_data is NULL !!");
+ return -1;
+ /* todo : exception handling */
+ }
+ }
+ } else {
+ FW_LOGE("session_info_list is NULL !!");
+ return -1;
+ /* todo : exception handling */
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+static int create_all_session(int na_plugIn_id)
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+ FW_LOGV("protocol_type : %d", na_plugIn_id);
+
+ Open_Connection pFunc_Open_Connection = getFunction_NetworkAccess_Open_Connection(na_plugIn_id);
+
+ if (pFunc_Open_Connection == 0) {
+ FW_LOGV("[%s] cannot get pFunc !!\n", __func__);
+ }
+
+ if (session_manager.session_info_list != NULL) {
+ GList *iter = NULL;
+ NA_Session_Info *iter_data;
+ int err = 0;
+
+ for (iter = session_manager.session_info_list; iter != NULL; iter = g_list_next(iter)) {
+ iter_data = NULL;
+ iter_data = ((NA_Session_Info *) (iter->data));
+
+ if (iter_data != NULL) {
+ err = pFunc_Open_Connection(&iter_data->session, session_manager.proxy, iter_data->timeout);
+ if (err != 1) {
+ FW_LOGE("open connection fail !!");
+ return -1;
+ /* todo : exception handling */
+ } else {
+ FW_LOGV("open connection success !!");
+ }
+ } else {
+ FW_LOGE("iter_data is NULL !!");
+ return -1;
+ /* todo : exception handling */
+ }
+ }
+ } else {
+ FW_LOGE("session_info_list is NULL !!");
+ return -1;
+ /* todo : exception handling */
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+static void set_ip_n_proxy(char *ip, char *proxy)
+{
+ FW_LOGV("Start !!");
+
+ /*
+ * check & set proxy info
+ */
+ if ((proxy != NULL) && (strcmp(proxy, "") != 0) && (strstr(proxy, "0.0.0.0") == NULL)) {
+ FW_LOGV("The proxy host is ( %s )", proxy);
+
+ if ((strstr(proxy, "http://") != NULL) || (strstr(proxy, "https://") != NULL)) {
+ FW_LOGV("proxy value is complete format !!");
+ session_manager.proxy = strdup(proxy);
+ FW_LOGV("session_manager.proxy : %s", session_manager.proxy);
+ } else {
+ FW_LOGV("proxy value is incomplete format !!");
+ char FullProxyAddr[100] = { 0, };
+ snprintf(FullProxyAddr, sizeof(FullProxyAddr), "http://%s", proxy);
+ FW_LOGV("fullproxyaddr : %s ( %d )", FullProxyAddr, strlen(FullProxyAddr));
+
+ session_manager.proxy = strdup(FullProxyAddr);
+ FW_LOGV("session_manager.proxy : %s", session_manager.proxy);
+ }
+ } else {
+ FW_LOGV("proxy is NULL !!");
+ session_manager.proxy = NULL;
+ FW_LOGV("session_manager.proxy : %s", session_manager.proxy);
+ }
+
+ /*
+ * set ip info
+ */
+ if (ip != NULL) {
+ session_manager.ip = strdup(ip);
+ FW_LOGV("session_manager.ip : %s", session_manager.ip);
+ free(ip);
+ } else {
+ session_manager.ip = NULL;
+ FW_LOGV("ip is NULL !!");
+ }
+
+ FW_LOGV("End !!");
+}
+
+static int change_all_session_info(int na_plugIn_id)
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+
+ /* 1. remove all session */
+ int err = remove_all_session(na_plugIn_id);
+ if (err != 1) {
+ FW_LOGE("remove_all_session_info() is fail !!");
+ return -1;
+ } else {
+ FW_LOGV("remove_all_session_info() is success !!");
+ }
+
+ /* 2. create all session */
+ err = create_all_session(na_plugIn_id);
+ if (err != 1) {
+ FW_LOGE("create_all_session() is fail !!");
+ return -1;
+ } else {
+ FW_LOGV("create_all_session() is success !!");
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
diff --git a/framework/src/NetworkAccess/NACI.c b/framework/src/NetworkAccess/NACI.c
new file mode 100644
index 0000000..90dd817
--- /dev/null
+++ b/framework/src/NetworkAccess/NACI.c
@@ -0,0 +1,740 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#include <glib-object.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "Utility/fw_log.h"
+#include "NetworkAccess/NACI.h"
+#include "NetworkAccess/NA_External.h"
+#include "PlugIn/PlugIn_NetworkAccess.h"
+#include "FSAPI/FSAPI_operation.h"
+
+#include "Utility/fw_mainloop.h"
+
+#include "NetworkAccess/EXT_NA_NetworkStatus.h"
+
+#include "NetworkAccess/IN_NA_Session_Manager.h"
+
+#define RETRY_CNT 3
+
+#define LOG_TAG "AF_NACI"
+
+NACI_RESULT NACI_Init(int na_plugIn_id)
+{
+ FW_LOGV("Start !!");
+
+ NACI_RESULT res = NACI_SUCCESS;
+
+ init_session_manager();
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+NACI_RESULT NACI_Open_Connection(int na_plugIn_id, int timeout, unsigned int *session_id)
+{
+ FW_LOGV("Start !!");
+ NACI_RESULT res = NACI_SUCCESS;
+ void *session = NULL;
+
+ int err = create_session_info(&session);
+ if (err != 1) {
+ FW_LOGE("create_session_info() fail !!");
+ return NACI_OPEN_CONNECTION_FAIL;
+ } else {
+ FW_LOGV("create_session_info() success !!");
+ }
+
+ err = provide_session_id(session_id);
+ if (err != 1) {
+ FW_LOGE("provide_session_id() fail !!");
+ return NACI_OPEN_CONNECTION_FAIL;
+ } else {
+ FW_LOGV("provide_session_id() success !!");
+ FW_LOGV("session id : %d", *session_id);
+ }
+
+ err = set_timeout(*session_id, timeout);
+ if (err != 1) {
+ FW_LOGE("set_timeout() fail !!");
+ return NACI_OPEN_CONNECTION_FAIL;
+ } else {
+ FW_LOGV("set_timeout() success !!");
+ }
+
+ switch (get_network_status()) {
+ case NETWORK_UNKNOWN:
+ case NETWORK_OFF:
+ {
+ FW_LOGE("network OFF !!");
+
+ err = remove_session_info(*session_id, 0);
+ if (err != 1) {
+ FW_LOGE("remove_session_info() fail !!");
+ } else {
+ FW_LOGV("remove_session_info() success !!");
+ }
+ return NACI_NETWORK_UNAVAILABLE;
+ }
+ break;
+ case NETWORK_ON:
+ {
+ FW_LOGV("network ON !!");
+ FW_NETWORK_TYPE fw_net_type = get_network_type();
+ if ((fw_net_type == NETWORK_NONE) || (fw_net_type == NETWORK_3G_OFF) || (fw_net_type == NETWORK_WIFI_OFF) || (fw_net_type == NETWORK_WIFI_ON_NOT_CONNECTED)) {
+ FW_LOGE("network ON but not connected !!");
+
+ err = remove_session_info(*session_id, 0);
+ if (err != 1) {
+ FW_LOGE("remove_session_info() fail !!");
+ } else {
+ FW_LOGV("remove_session_info() success !!");
+ }
+ return NACI_NETWORK_UNAVAILABLE;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ Open_Connection pFunc_Open_Connection = getFunction_NetworkAccess_Open_Connection(na_plugIn_id);
+
+ if (pFunc_Open_Connection == 0) {
+ FW_LOGE("cannot get pFunc_Open_Connection !!");
+ return NACI_OPEN_CONNECTION_FAIL;
+ }
+
+ err = pFunc_Open_Connection(&session, get_proxy(), timeout);
+ if (err != 1) {
+ FW_LOGE("Open_Connection() fail !!");
+ return NACI_OPEN_CONNECTION_FAIL;
+ } else {
+ FW_LOGV("Open_Connection() success !!");
+ }
+
+ err = set_session(*session_id, session);
+ if (err != 1) {
+ FW_LOGE("set_session() fail !!");
+ return NACI_OPEN_CONNECTION_FAIL;
+ } else {
+ FW_LOGV("set_session() success !!");
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+NACI_RESULT NACI_Close_Connection(int na_plugIn_id, unsigned int session_id)
+{
+ FW_LOGV("Start !!");
+ NACI_RESULT res = NACI_SUCCESS;
+ void *session = NULL;
+
+ if (get_network_status() == NETWORK_ON) {
+ FW_LOGV("session id : %d", session_id);
+ int err = get_session(session_id, &session);
+ if (err != 1) {
+ FW_LOGV("get session() fail !!");
+ return NACI_CLOSE_CONNECTION_FAIL;
+ } else {
+ FW_LOGV("get session() success !!");
+ }
+
+ Close_Connection pFunc_Close_Connection = getFunction_NetworkAccess_Close_Connection(na_plugIn_id);
+
+ if (pFunc_Close_Connection == 0) {
+ FW_LOGE("cannot get pFunc_Close_Connection !!");
+ return NACI_CLOSE_CONNECTION_FAIL;
+ }
+
+ err = pFunc_Close_Connection(session);
+ if (err != 1) {
+ FW_LOGE("Close_Connection() fail !!");
+ return NACI_CLOSE_CONNECTION_FAIL;
+ } else {
+ FW_LOGV("Close_Connection() success !!");
+ }
+
+ err = remove_session_info(session_id, 1);
+ if (err != 1) {
+ FW_LOGE("remove_session_info() fail !!");
+ return NACI_CLOSE_CONNECTION_FAIL;
+ } else {
+ FW_LOGV("remove_session_info() success !!");
+ }
+ } else {
+ FW_LOGV("session is already closed !!");
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+NACI_RESULT NACI_Send_Msg(GList *header_info, int na_plugIn_id, char *send_msg, unsigned int send_msg_length, GList **recv_header, unsigned char **recv_msg, unsigned int *recv_msg_length, NACI_SEND_TYPE send_type, unsigned int session_id)
+{
+ FW_LOGV("Start !!");
+ NACI_RESULT res = NACI_SUCCESS;
+ void *session = NULL;
+ void *msg = NULL;
+ int try_again_cnt = 0;
+
+ /* check current network status */
+ if (use_Network(na_plugIn_id) == 1) {
+ res = NACI_Check_Network_Status(0, 1);
+ if (res == NACI_NETWORK_UNAVAILABLE) {
+ int err = remove_session_info(session_id, 0);
+ if (err != 1) {
+ FW_LOGE("remove_session_info() fail !!");
+ } else {
+ FW_LOGV("remove_session_info() success !!");
+ }
+ return res;
+ }
+ }
+
+ /*
+ * Header Binding
+ */
+ Header_Binding pFunc_Header_Binding = getFunction_NetworkAccess_Header_Binding(na_plugIn_id);
+
+ if (pFunc_Header_Binding == 0) {
+ FW_LOGE("cannot get pFunc_Header_Binding !!");
+ return NACI_HEADER_BINDING_FAIL;
+ }
+
+ int err = get_msg(session_id, &msg);
+ if (err != 1) {
+ FW_LOGE("get_msg() fail !!");
+ return NACI_HEADER_BINDING_FAIL;
+ } else {
+ FW_LOGV("get_msg() success !!");
+ }
+
+ unsigned int recv_msg_size = 0;
+
+ err = pFunc_Header_Binding(header_info, &msg);
+ if (err != 1) {
+ FW_LOGE("Header_Binding() fail !!");
+ return NACI_HEADER_BINDING_FAIL;
+ } else {
+ FW_LOGV("Header_Binding() success !!");
+ }
+
+ /*
+ * Send Message
+ */
+ err = get_session(session_id, &session);
+ if (err != 1) {
+ FW_LOGE("get_session() fail !!");
+ return NACI_SEND_MSG_FAIL;
+ } else {
+ FW_LOGV("get_session() success !!");
+ }
+
+ if (send_type == SEND_N_RECEIVE) {
+ Send_Message pFunc_Send_Message = getFunction_NetworkAccess_Send_Message(na_plugIn_id);
+
+ if (pFunc_Send_Message == 0) {
+ FW_LOGE("cannot get pFunc_Send_Message !!");
+ return NACI_SEND_MSG_FAIL;
+ }
+
+send_message:
+ err = pFunc_Send_Message(session, &msg, send_msg, send_msg_length, &recv_msg_size);
+ if (err != 1) {
+ if (err == -408) { /* FIXME : request time-out (temporary) */
+ FW_LOGE("request time-out !!");
+ return NACI_TIME_OUT_SEND_MSG;
+ } else if (err == -1) { /* FIXME : cancel message (temporary) */
+ FW_LOGV("send message canceled !!");
+ FW_LOGV("End !!");
+ return NACI_SEND_MSG_CANCEL;
+ } else if (err == -8) { /* try again - retry 3 times */
+ FW_LOGE("send message try again ( %d ) !!", try_again_cnt);
+
+ if (try_again_cnt < RETRY_CNT) {
+ FW_LOGV("re-make session !!");
+
+ try_again_cnt++;
+
+ session = NULL;
+
+ Open_Connection pFunc_Open_Connection = getFunction_NetworkAccess_Open_Connection(na_plugIn_id);
+ if (pFunc_Open_Connection == 0) {
+ FW_LOGE("cannot get pFunc_Open_Connection !!");
+ return NACI_SEND_MSG_TRY_AGAIN;
+ }
+
+ int timeout = 0;
+ int er = get_timeout(session_id, &timeout);
+ if (er != 1) {
+ FW_LOGE("get_timeout() fail !!");
+ return NACI_SEND_MSG_TRY_AGAIN;
+ }
+
+ err = pFunc_Open_Connection(&session, get_proxy(), timeout);
+ if (err != 1) {
+ FW_LOGE("Open_Connection() fail !!");
+ return NACI_SEND_MSG_TRY_AGAIN;
+ } else {
+ FW_LOGV("Open_Connection() success !!");
+ }
+
+ err = set_session(session_id, session);
+ if (err != 1) {
+ FW_LOGE("set_session() fail !!");
+ return NACI_SEND_MSG_TRY_AGAIN;
+ } else {
+ FW_LOGV("set_session() success !!");
+ }
+
+ goto send_message;
+ } else {
+ FW_LOGE("try again count over 3 times !!");
+ FW_LOGE("Send_Messasge() fail !!");
+
+ return NACI_SEND_MSG_TRY_AGAIN;
+ }
+ } else {
+ FW_LOGE("Send_Message() fail !!");
+ return NACI_SEND_MSG_FAIL;
+ }
+ } else {
+ FW_LOGV("Send_Message success !!");
+ }
+ } else if (send_type == JUST_SEND) {
+ Just_Send_Message pFunc_Just_Send_Message = getFunction_NetworkAccess_Just_Send_Message(na_plugIn_id);
+
+ if (pFunc_Just_Send_Message == 0) {
+ FW_LOGE("cannot get pFunc_Just_Send_Message !!");
+ return NACI_JUST_SEND_MSG_FAIL;
+ }
+
+ err = pFunc_Just_Send_Message(session, &msg, send_msg, send_msg_length);
+ if (err != 1) {
+ FW_LOGE("Just_Send_Message() fail !!");
+ return NACI_JUST_SEND_MSG_FAIL;
+ } else {
+ FW_LOGV("Just_Send_Message() success !!");
+ FW_LOGV("End !!");
+ return res;
+ }
+ }
+
+ /*
+ * Header Unbinding
+ */
+ Header_Unbinding pFunc_Header_Unbinding = getFunction_NetworkAccess_Header_Unbinding(na_plugIn_id);
+
+ if (pFunc_Header_Unbinding == 0) {
+ FW_LOGE("cannot get pFunc_Header_Unbinding !!");
+ return NACI_HEADER_UNBINDING_FAIL;
+ }
+
+ /*
+ * extract header/body information using message from server
+ */
+ err = pFunc_Header_Unbinding(msg, recv_msg_size, recv_header, recv_msg, recv_msg_length);
+ if (err != 1) {
+ FW_LOGE("Header_Unbinding() fail !!");
+ return NACI_HEADER_UNBINDING_FAIL;
+ } else {
+ FW_LOGV("Header_Unbinding() success !!");
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+NACI_RESULT NACI_Cancel_Msg(int na_plugIn_id, unsigned int session_id)
+{
+ FW_LOGV("Start !!");
+ NACI_RESULT res = NACI_SUCCESS;
+ void *session = NULL;
+
+ Cancel_Message pFunc_Cancel_Message = getFunction_NetworkAccess_Cancel_Message(na_plugIn_id);
+
+ if (pFunc_Cancel_Message == 0) {
+ FW_LOGE("cannot get pFunc_Cancel_Message !!");
+ }
+
+ int err = get_session(session_id, &session);
+ if (err != 1) {
+ FW_LOGE("get_session() fail !!");
+ return NACI_CANCEL_MSG_FAIL;
+ } else {
+ FW_LOGV("get_session() success !!");
+ }
+
+ FW_LOGV("session id : %d", session_id);
+ err = pFunc_Cancel_Message(session);
+ if (err != 1) {
+ FW_LOGE("Cancel_Message() fail !!");
+ return NACI_CANCEL_MSG_FAIL;
+ } else {
+ FW_LOGV("Cancel_Message() success !!");
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+NACI_RESULT NACI_Destroy()
+{
+ FW_LOGV("Start !!");
+
+ NACI_RESULT res = NACI_SUCCESS;
+
+ destroy_session_manager();
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+NACI_RESULT NACI_Get_Header_Info(int na_plugIn_id, GList *header_info, char *key, char **value)
+{
+ FW_LOGV("Start !!");
+ NACI_RESULT res = NACI_SUCCESS;
+
+ Get_Header_Info pFunc_Get_Header_Info = getFunction_NetworkAccess_Get_Header_Info(na_plugIn_id);
+
+ if (pFunc_Get_Header_Info == 0) {
+ FW_LOGE("cannot get pFunc_Get_Header_Info !!");
+ }
+
+ int err = pFunc_Get_Header_Info(header_info, key, value);
+ if (err != 1) {
+ FW_LOGE("Get_Header_Info() fail !!");
+ return NACI_GET_HEADER_INFO_FAIL;
+ } else {
+ FW_LOGV("Get_Header_Info() success !!");
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+NACI_RESULT NACI_Free_Recv_Header_Info(GList *header_info)
+{
+ FW_LOGV("Start !!");
+
+ NACI_RESULT res = NACI_SUCCESS;
+
+ if (header_info != NULL) {
+ GList *iter = NULL;
+ common_header_info *iter_data;
+
+ for (iter = header_info; iter != NULL;) {
+ iter_data = NULL;
+ iter_data = ((common_header_info *) (iter->data));
+
+ iter = g_list_next(iter);
+ header_info = g_list_remove(header_info, iter_data);
+
+ if (iter_data->key != NULL)
+ free(iter_data->key);
+ if (iter_data->value != NULL)
+ free(iter_data->value);
+ free(iter_data);
+ }
+
+ g_list_free(header_info);
+
+ FW_LOGV("header_info is free !!");
+ } else {
+ FW_LOGV("header_info is NULL !!");
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+NACI_RESULT NACI_Check_Network_Status(int interval, int retry_cnt)
+{
+ FW_LOGV("Start !!");
+
+ NACI_RESULT res = NACI_SUCCESS;
+ int i = 0;
+
+ for (; i < retry_cnt; i++) {
+ switch (get_network_status()) {
+ case NETWORK_UNKNOWN:
+ case NETWORK_OFF:
+ {
+ FW_LOGE("network OFF !!");
+ res = NACI_NETWORK_UNAVAILABLE;
+ }
+ break;
+ case NETWORK_ON:
+ {
+ FW_LOGV("[%s] network ON \n", __func__);
+ FW_NETWORK_TYPE fw_net_type = get_network_type();
+ if ((fw_net_type == NETWORK_NONE) || (fw_net_type == NETWORK_3G_OFF) || (fw_net_type == NETWORK_WIFI_OFF) || (fw_net_type == NETWORK_WIFI_ON_NOT_CONNECTED)) {
+ FW_LOGE("network ON but not connected !!");
+ res = NACI_NETWORK_UNAVAILABLE;
+ } else {
+ res = NACI_SUCCESS;
+ return res;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ sleep(interval);
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+NACI_RESULT NACI_Get_Network_Type(int *net_type)
+{
+ FW_LOGV("Start !!");
+
+ NACI_RESULT res = NACI_SUCCESS;
+
+ *net_type = get_network_type();
+ FW_LOGV("current network type : %d", *net_type);
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+NACI_RESULT NACI_Download_Data(GList *header_info, int na_plugIn_id, unsigned char *download_folder, unsigned int download_start_size, unsigned int download_body_size, unsigned char **out_download_path, NACI_SEND_TYPE send_type, unsigned int session_id)
+{
+ GList *recv_header_info = 0;
+ /* char *recvMsg = 0; */
+ unsigned char *recvMsg = 0;
+ unsigned int recvMsg_size = 0;
+
+ unsigned int download_current_size = download_start_size;
+ /* unsigned int download_total_size = 0; */
+ int download_total_size = 0;
+ char *current_download_range = 0;
+ char *download_file_name = 0;
+
+ int count = 0; /* for test log */
+ NACI_RESULT ret = NACI_SUCCESS;
+ while (download_total_size == 0 || download_current_size < download_total_size - 1) {
+
+ FW_LOGV("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
+ FW_LOGV("############# %d th download", ++count);
+ FW_LOGV("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
+
+ /* back up the header list TODO */
+ /* GSList *backup_send_head_info_list = 0; */
+ GList *backup_send_head_info_list = 0;
+ GList *iter = NULL;
+ for (iter = header_info; iter != NULL; iter = g_list_next(iter)) {
+ common_header_info *header_item_info = (common_header_info *) calloc(1, sizeof(common_header_info));
+ if (((common_header_info *) (iter->data))->key != NULL) {
+ header_item_info->key = strdup(((common_header_info *) (iter->data))->key);
+
+ if (((common_header_info *) (iter->data))->value != NULL) {
+ header_item_info->value = strdup(((common_header_info *) (iter->data))->value);
+ } else {
+ FW_LOGE("key : %s, value is NULL !!", header_item_info->key);
+ header_item_info->value = 0;
+ }
+
+ backup_send_head_info_list = g_list_append(backup_send_head_info_list, header_item_info);
+ } else {
+ FW_LOGE("key is NULL !!");
+ header_item_info->key = 0;
+ header_item_info->value = 0;
+ }
+
+ /*backup_send_head_info_list = g_list_append(backup_send_head_info_list, header_item_info);*/
+ if (header_item_info->key != NULL) {
+ if (strcmp(header_item_info->key, "Range") == 0)
+ FW_LOGV("[Before] key : %s, value : %s", header_item_info->key, header_item_info->value);
+ }
+ }
+
+ /* send_msg */
+ ret = NACI_Send_Msg(backup_send_head_info_list, na_plugIn_id, 0, 0, &recv_header_info, &recvMsg, &recvMsg_size, send_type, session_id);
+ if (ret != NACI_SUCCESS) {
+ FW_LOGE("NACI_Send_Msg() fail");
+ ret = NACI_DOWNLOAD_DATA_FAIL;
+ goto return_part;
+ }
+
+ FW_LOGV("RecvMSg_Size = %d", recvMsg_size);
+ FW_LOGV("############# NACI_Send_Msg() success !!");
+
+ /* get download total size, download current range */
+ Get_Data_Download_Info pFunc_Get_Data_Down_Info = getFunction_NetworkAccess_Get_Data_Download_Info(na_plugIn_id);
+ if (pFunc_Get_Data_Down_Info == 0) {
+ FW_LOGE("cannot get pFunc_Get_Data_Down_Info !!");
+ ret = NACI_DOWNLOAD_DATA_FAIL;
+ goto return_part;
+ }
+
+ ret = pFunc_Get_Data_Down_Info(recv_header_info, &download_total_size, &current_download_range, &download_file_name);
+ if (ret != NACI_SUCCESS) {
+ FW_LOGE("Get_Data_Down_Info() fail !!");
+ ret = NACI_DOWNLOAD_DATA_FAIL;
+ goto return_part;
+ }
+
+ FW_LOGV("############# Get_Data_Down_Info() success !!");
+ if (current_download_range == 0 || download_total_size == 0 || download_file_name == 0) {
+ FW_LOGE("current_download_range == 0 || download_total_size == 0 || download_file_name == 0");
+ ret = NACI_DOWNLOAD_DATA_FAIL;
+ goto return_part;
+ }
+
+ FW_LOGV("download_total_size = %d", download_total_size);
+ FW_LOGV("current_download_range = %s", current_download_range);
+ FW_LOGV("download_file_name = %s", download_file_name);
+
+ /* download path setting */
+ if (*out_download_path == 0) {
+ *out_download_path = (unsigned char *)g_strdup_printf("%s/%s", download_folder, download_file_name);
+ FW_LOGV("*out_download_path = %s", *out_download_path);
+ }
+
+ /* imcrement download count */
+ char *del = "-";
+ /* int down_size = 0; */
+ char *ptr = strtok(current_download_range, del);
+ if (ptr != 0) {
+
+ int start_size = 0;
+ int end_size = 0;
+
+ FW_LOGV("start_size = %s", ptr);
+ start_size = atoi(ptr);
+
+ ptr = strtok(NULL, del);
+ FW_LOGV("end_size = %s", ptr);
+ end_size = atoi(ptr);
+
+ FW_LOGV("prev download_current_size = %d", download_current_size);
+ FW_LOGV("Gap = %d", end_size - start_size);
+
+ download_current_size += (end_size - start_size + 1);
+ FW_LOGV("after download_current_size = %d", download_current_size);
+ }
+
+ bool isFinal = false;
+ if (download_current_size >= download_total_size - 1)
+ isFinal = true;
+
+ /* set file */
+ FW_LOGV("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! RecvMSg_Size = %d", recvMsg_size);
+ ret = FSAPI_fileAppend((char *)(*out_download_path), (char *)recvMsg, recvMsg_size, false);
+ if (ret != NACI_SUCCESS) {
+ FW_LOGE("FSAPI_fileWrite() fail !!");
+ ret = NACI_DOWNLOAD_DATA_FAIL;
+ goto return_part;
+ } else {
+ FW_LOGV("############# FSAPI_fileWrite() success !!");
+ }
+
+ /* set download total size, download current range */
+ Set_Data_Download_Info pFunc_Set_Data_Down_Info = getFunction_NetworkAccess_Set_Data_Download_Info(na_plugIn_id);
+ if (pFunc_Set_Data_Down_Info == 0) {
+ FW_LOGE("cannot get pFunc_Set_Data_Down_Info !!");
+ ret = NACI_DOWNLOAD_DATA_FAIL;
+ goto return_part;
+ }
+
+ char *new_download_range = g_strdup_printf("%d-%d", download_current_size, download_current_size + (download_body_size - 1));
+ ret = pFunc_Set_Data_Down_Info(header_info, new_download_range);
+ if (ret != NACI_SUCCESS) {
+ FW_LOGE("Set_Data_Down_Info() fail !!");
+ ret = NACI_DOWNLOAD_DATA_FAIL;
+ goto return_part;
+ }
+
+ FW_LOGV("############# Set_Data_Down_Info() success !!");
+
+ }
+
+return_part:
+
+ /* todo : free logic */
+ return ret;
+}
+
+NACI_RESULT NACI_Add_Authentication_Info(int na_plugIn_id, char *id, char *password, unsigned int session_id)
+{
+ FW_LOGV("Start !!");
+ NACI_RESULT res = NACI_SUCCESS;
+ void *session = NULL;
+
+ Add_Authentication_Info pFunc_Add_Authentication_Info = getFunction_NetworkAccess_Add_Authentication_Info(na_plugIn_id);
+
+ if (pFunc_Add_Authentication_Info == 0) {
+ FW_LOGV("cannot get pFunc_Add_Authentication_Info !!");
+ }
+
+ int err = get_session(session_id, &session);
+ if (err != 1) {
+ FW_LOGE("get_session() fail !!");
+ return NACI_ADD_AUTH_INFO_FAIL;
+ } else {
+ FW_LOGV("get_session() success !!");
+ }
+
+ FW_LOGV("session id : %d", session_id);
+
+ err = pFunc_Add_Authentication_Info(session, id, password);
+ if (err != 1) {
+ FW_LOGE("Add_Authentication_Info() fail !!");
+ return NACI_ADD_AUTH_INFO_FAIL;
+ } else {
+ FW_LOGV("Add_Authentication_Info() success !!");
+ }
+
+ FW_LOGV("End !!");
+
+ return res;
+}
diff --git a/framework/src/NetworkAssistant/protocol_binder/protocol_binder.c b/framework/src/NetworkAssistant/protocol_binder/protocol_binder.c
new file mode 100755
index 0000000..e621a96
--- /dev/null
+++ b/framework/src/NetworkAssistant/protocol_binder/protocol_binder.c
@@ -0,0 +1,1116 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * SeongWon Shim <seongwon.shim@samsung.com>
+ */
+
+#include "protocol_binder/protocol_binder_internal.h"
+#include "protocol_binder/protocol_binder_util_internal.h"
+#include "Utility/fw_log.h"
+#include "Utility/fw_assert.h"
+#include <assert.h>
+
+#define LOG_TAG "AF_PB"
+
+/* internal functions */
+
+static PROTOCOL_BINDER_ERROR init_encoder(WBXMLLanguage lang, WBXMLCharsetMIBEnum orig_charset, Encoding enc, WBXMLEncoder **pEncoder)
+{
+ FW_LOGD("start");
+ WBXMLError err = WBXML_OK;
+ WBXMLEncoder *pOut_encoder = NULL;
+
+ if ((pOut_encoder = wbxml_encoder_create()) == NULL) {
+ err = PROTOCOL_BINDER_OUT_OF_MEMORY;
+ goto error_part;
+ }
+
+ /* set language and orig charset */
+ wbxml_encoder_set_lang(pOut_encoder, lang);
+ wbxml_encoder_set_output_charset(pOut_encoder, orig_charset);
+
+ wbxml_encoder_set_flow_mode(pOut_encoder, true);
+ wbxml_encoder_set_produce_anonymous(pOut_encoder, true);
+
+ /* ignore whitespaces */
+ wbxml_encoder_set_ignore_empty_text(pOut_encoder, true);
+ wbxml_encoder_set_remove_text_blanks(pOut_encoder, true);
+
+ if (enc == ENCODING_XML) {
+ wbxml_encoder_set_output_type(pOut_encoder, WBXML_ENCODER_OUTPUT_XML);
+ } else {
+ wbxml_encoder_set_output_type(pOut_encoder, WBXML_ENCODER_OUTPUT_WBXML);
+ WBXMLVersion wbxml_version = get_wbxml_version(enc);
+
+ assert(wbxml_version != WBXML_VERSION_UNKNOWN);
+ wbxml_encoder_set_wbxml_version(pOut_encoder, wbxml_version);
+ }
+
+ if (pOut_encoder != NULL) {
+ *pEncoder = pOut_encoder;
+ }
+
+ FW_LOGD("ended with pEncoder = %p", pOut_encoder);
+
+ return err;
+
+error_part:
+ FW_LOGD("error occurred");
+ return err;
+}
+
+static PROTOCOL_BINDER_ERROR build_lookup_tbl_of_binder_function_set(Binder_function_set *pSet)
+{
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+ int i;
+ int cnt = pSet->set_size;
+
+ Binder_function_info *info_array = pSet->info_array;
+ GHashTable *pProtocol_element_lookup_tbl = NULL;
+ GHashTable *pProtocol_element_xml_name_lookup_tbl = NULL;
+
+ pProtocol_element_lookup_tbl = g_hash_table_new(g_int_hash, g_int_equal);
+ if (pProtocol_element_lookup_tbl == NULL) {
+ err = PROTOCOL_BINDER_OUT_OF_MEMORY;
+ goto return_part;
+ }
+
+ pProtocol_element_xml_name_lookup_tbl = g_hash_table_new(g_str_hash, g_str_equal);
+ if (pProtocol_element_xml_name_lookup_tbl == NULL) {
+ err = PROTOCOL_BINDER_OUT_OF_MEMORY;
+ goto return_part;
+ }
+
+ for (i = 0; i < cnt; i++) {
+ g_hash_table_insert(pProtocol_element_lookup_tbl, &(info_array[i].protocol_element), &(info_array[i]));
+
+ if (info_array[i].protocol_element_xml_name != NULL) {
+ g_hash_table_insert(pProtocol_element_xml_name_lookup_tbl, info_array[i].protocol_element_xml_name, &(info_array[i]));
+ }
+ }
+
+return_part:
+ if (err == PROTOCOL_BINDER_OK) {
+ pSet->protocol_element_lookup_tbl = pProtocol_element_lookup_tbl;
+ pSet->protocol_element_xml_name_lookup_tbl = pProtocol_element_xml_name_lookup_tbl;
+ } else {
+ if (pProtocol_element_lookup_tbl != NULL) {
+ g_hash_table_destroy(pProtocol_element_lookup_tbl);
+ }
+ }
+ return err;
+}
+
+static PROTOCOL_BINDER_ERROR lookup_binder_function(Binder_function_set *pBinder_function_set, Protocol_Element protocol_element, char *protocol_element_xml_name, Binder_function_info **pFunctionInfo)
+{
+ FW_LOGD("started : protocol_element = %d, protocol_element_xml_name = %s\n", protocol_element, protocol_element_xml_name);
+
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+ GHashTable *lookup_tbl = NULL;
+ void *key = NULL;
+ if (pBinder_function_set == NULL) {
+ err = PROTOCOL_BINDER_BINDER_FUNCTION_SET_NOT_DEFINED;
+ goto return_part;
+ }
+
+ if (protocol_element_xml_name != NULL) {
+ key = protocol_element_xml_name;
+ lookup_tbl = pBinder_function_set->protocol_element_xml_name_lookup_tbl;
+ } else {
+ key = &protocol_element;
+ lookup_tbl = pBinder_function_set->protocol_element_lookup_tbl;
+ }
+
+ if (lookup_tbl == NULL) {
+ err = PROTOCOL_BINDER_BINDER_FUNCTION_SET_LOOKUP_TBL_NOT_DEFINED;
+ goto return_part;
+ }
+
+ Binder_function_info *binder_function_info = g_hash_table_lookup(lookup_tbl, key);
+ if (binder_function_info == NULL) {
+ err = PROTOCOL_BINDER_INVALID_PROTOCOL_ELEMENT;
+ goto return_part;
+ }
+
+return_part:
+ if (err == PROTOCOL_BINDER_OK) {
+ *pFunctionInfo = binder_function_info;
+ }
+
+ FW_LOGD("ended\n");
+ return err;
+}
+
+static void remove_contents_binder_function_set(Binder_function_set *pBinder_function_set)
+{
+ if (pBinder_function_set != NULL) {
+ if (pBinder_function_set->info_array != NULL) {
+ free(pBinder_function_set->info_array);
+ pBinder_function_set->info_array = NULL;
+ }
+ if (pBinder_function_set->protocol_element_lookup_tbl != NULL) {
+ g_hash_table_destroy(pBinder_function_set->protocol_element_lookup_tbl);
+ pBinder_function_set->protocol_element_lookup_tbl = NULL;
+ }
+ if (pBinder_function_set->protocol_element_xml_name_lookup_tbl != NULL) {
+ g_hash_table_destroy(pBinder_function_set->protocol_element_xml_name_lookup_tbl);
+ pBinder_function_set->protocol_element_xml_name_lookup_tbl = NULL;
+ }
+ }
+}
+
+/*static char *duplicate_byte_stream(char *byte_stream, unsigned int byte_stream_len)
+{
+ char *ret_byte_stream = malloc(byte_stream_len + 1);
+ if (ret_byte_stream == NULL) {
+ goto return_part;
+ }
+
+ memcpy(ret_byte_stream, byte_stream, byte_stream_len * sizeof(char));
+ ret_byte_stream[byte_stream_len] = '\0';
+return_part:
+ return ret_byte_stream;
+}*/
+
+/* external functions */
+
+/* binder function set */
+
+void free_binder_function_set(Binder_function_set *pBinder_function_set)
+{
+ if (pBinder_function_set != NULL) {
+ remove_contents_binder_function_set(pBinder_function_set);
+
+ free(pBinder_function_set);
+ }
+}
+
+PROTOCOL_BINDER_ERROR init_binder_function_set(unsigned int binder_function_cnt, Binder_function_info *info_array, Binder_function_set **pBinder_function_set)
+{
+ FW_LOGD("start\n");
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+
+ Binder_function_set *pSet = (Binder_function_set *)calloc(1, sizeof(Binder_function_set));
+ if (pSet == NULL) {
+ err = PROTOCOL_BINDER_OUT_OF_MEMORY;
+ goto return_part;
+ }
+
+ pSet->set_size = binder_function_cnt;
+ pSet->info_array = (Binder_function_info *)malloc(binder_function_cnt * sizeof(Binder_function_info));
+ if (pSet->info_array == NULL) {
+ err = PROTOCOL_BINDER_OUT_OF_MEMORY;
+ goto return_part;
+ }
+ memcpy(pSet->info_array, info_array, binder_function_cnt * sizeof(Binder_function_info));
+
+ /* build lookup table */
+ err = build_lookup_tbl_of_binder_function_set(pSet);
+ if (err != PROTOCOL_BINDER_OK) {
+ goto return_part;
+ }
+
+return_part:
+ if (err != PROTOCOL_BINDER_OK) {
+ FW_LOGD("error occurred\n");
+ if (pSet != NULL) {
+ free_binder_function_set(pSet);
+ }
+ } else {
+ *pBinder_function_set = pSet;
+ FW_LOGD("end with return pBinder_function_set = %p\n", pSet);
+ }
+ return err;
+}
+
+/*
+ * @brief ignore previous binder function set built and rebuild binder function set with new function informations
+ * @param[in] pBinder_functino_set binder function set
+ * @param[in] binder_function_info_cnt number of new binder function informations
+ * @param[in] info_array_to_be_added array of new binder function informations
+ * @return protocol binder error
+ */
+PROTOCOL_BINDER_ERROR reset_binder_function_set(Binder_function_set *pBinder_function_set, unsigned int new_binder_function_info_cnt, Binder_function_info *new_info_array)
+{
+ FW_LOGV("start\n");
+ PROTOCOL_BINDER_ERROR pb_error = PROTOCOL_BINDER_OK;
+ Binder_function_set *pSet = pBinder_function_set;
+ Binder_function_set backup_set;
+
+ /* make backup set */
+ memcpy(&backup_set, pSet, sizeof(Binder_function_set));
+
+ /* reset contents */
+ pSet->set_size = new_binder_function_info_cnt;
+ pSet->info_array = (Binder_function_info *)malloc(new_binder_function_info_cnt * sizeof(Binder_function_info));
+ if (pSet->info_array == NULL) {
+ pb_error = PROTOCOL_BINDER_OUT_OF_MEMORY;
+ goto error_part;
+ }
+ memcpy(pSet->info_array, new_info_array, new_binder_function_info_cnt * sizeof(Binder_function_info));
+
+ /* build lookup table */
+ pb_error = build_lookup_tbl_of_binder_function_set(pSet);
+ if (pb_error != PROTOCOL_BINDER_OK) {
+ goto error_part;
+ }
+
+ /* remove previous binder set */
+ remove_contents_binder_function_set(&backup_set);
+
+ FW_LOGD("success\n");
+ return pb_error;
+
+error_part:
+ if (pSet->info_array != NULL) {
+ free(pSet->info_array);
+ }
+
+ /* restore pBinder_function_set */
+ memcpy(pSet, &backup_set, sizeof(Binder_function_set));
+
+ FW_LOGD("error occurred with pb_error = %d\n", pb_error);
+ return pb_error;
+}
+
+/*
+ * @brief add more function informations to binder function set
+ * @note you should notice that if same value of protocol_element or protocol_element_xml_name are
+ * already existed in binder function set, then previous information is removed from binder function set
+ * @param[in] pBinder_functino_set binder function set
+ * @param[in] binder_function_info_cnt number of new binder function informations to be added
+ * @param[in] info_array_to_be_added array of new binder function informations to be added
+ * @return protocol binder error
+ */
+PROTOCOL_BINDER_ERROR add_binder_function_set(Binder_function_set *pBinder_function_set, unsigned int binder_function_info_cnt, Binder_function_info *info_array_to_be_added)
+{
+ FW_LOGV("start");
+ PROTOCOL_BINDER_ERROR pb_error = PROTOCOL_BINDER_OK;
+ Binder_function_set *pSet = pBinder_function_set;
+ unsigned int prev_set_size = pSet->set_size;
+ Binder_function_info *prev_info_array = pSet->info_array;
+
+ /* reset set_size and info_array */
+ unsigned int new_set_size = prev_set_size + binder_function_info_cnt;
+ Binder_function_info *new_info_array = (Binder_function_info *)malloc(new_set_size * sizeof(Binder_function_info));
+ if (new_info_array == NULL) {
+ pb_error = PROTOCOL_BINDER_OUT_OF_MEMORY;
+ goto error_part;
+ }
+
+ memcpy(new_info_array, prev_info_array, prev_set_size * sizeof(Binder_function_info));
+
+ memcpy(new_info_array + prev_set_size, info_array_to_be_added, binder_function_info_cnt * sizeof(Binder_function_info));
+
+ /* update binder function set */
+ pb_error = reset_binder_function_set(pSet, new_set_size, new_info_array);
+ if (pb_error != PROTOCOL_BINDER_OK) {
+ goto error_part;
+ }
+
+ FW_LOGV("success");
+ return pb_error;
+
+error_part:
+ if (new_info_array != NULL) {
+ free(new_info_array);
+ }
+
+ FW_LOGV("error with pb_error = %d", pb_error);
+ return pb_error;
+}
+
+/* protocol binder */
+
+protocol_binder *protocol_binder_init(protocol_binder *pBinder, Protocol protocol, Protocol_Option_Ptr option, Encoding enc, bool encode_xml_header, bool use_strtbl, bool produce_anonymous, bool use_flow_mode, GList *restrict_params, Restrict_Condition_Checker_callback restrict_condition_checker, Binder_function_set *pBinder_function_set)
+{
+ FW_LOGD("started with input pBinder = %p\n", pBinder);
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+
+ /* TODO : validation input parameters */
+
+ if (pBinder == NULL) {
+ pBinder = (protocol_binder *)malloc(sizeof(protocol_binder));
+ }
+
+ if (pBinder != NULL) {
+ memset(pBinder, 0x00, sizeof(protocol_binder));
+ /* TODO : check validity of input parameters */
+ pBinder->protocol = protocol;
+ pBinder->option = option;
+ pBinder->enc = enc;
+ pBinder->encode_xml_header = encode_xml_header;
+ pBinder->use_strtbl = use_strtbl;
+ pBinder->produce_anonymous = produce_anonymous;
+ pBinder->use_flow_mode = use_flow_mode;
+ pBinder->restrict_params = restrict_params;
+ pBinder->restrict_condition_checker = restrict_condition_checker;
+ pBinder->binder_functions = pBinder_function_set;
+
+ WBXMLCharsetMIBEnum orig_charset = WBXML_PARSER_DEFAULT_CHARSET;
+
+ WBXMLLanguage lang = get_wbxml_language(protocol);
+ FW_LOGV("lang = %d\n", lang);
+
+ pBinder->lang_table = (WBXMLLangEntry *) wbxml_tables_get_table(lang);
+ /* SVACE : NULL check routine added. */
+ if (pBinder->lang_table == NULL) {
+ FW_LOGE("language table is not found\n");
+ goto error_part;
+ }
+ pBinder->prev_lang_table = NULL;
+
+ FW_LOGD("Binder has follwing information\n"
+ "protocol = %d, encoding = %d, string table option = %d, " "flow mode option = %d, lang = %d, lang table pointer = %p\n" "lang table detail info (langID = %d, Public ID = (xmlPublicID : %s, xmlRootElt : %s, xmlDTD : %s))", protocol, enc, use_strtbl, use_flow_mode, lang, pBinder->lang_table, pBinder->lang_table->langID, pBinder->lang_table->publicID->xmlPublicID, pBinder->lang_table->publicID->xmlRootElt, pBinder->lang_table->publicID->xmlDTD);
+
+ if (use_flow_mode) {
+ err = init_encoder(lang, orig_charset, enc, &(pBinder->wbxml_encoder));
+ if (err != PROTOCOL_BINDER_OK) {
+ goto error_part;
+ }
+ } else {
+ pBinder->tree = wbxml_tree_create(lang, orig_charset);
+ if (pBinder->tree == NULL) {
+ goto error_part;
+ }
+
+ pBinder->tree_node_stack = NULL;
+ }
+ }
+
+ FW_LOGD("ended with pBinder = %p\n", pBinder);
+
+ return pBinder;
+
+error_part:
+ FW_LOGE("error occurred\n");
+ /* TODO */
+ return NULL;
+}
+
+PROTOCOL_BINDER_ERROR protocol_binder_append(protocol_binder *pBinder, Protocol_Element protocol_element, Content_Ptr pContent)
+{
+ FW_LOGD("started");
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+ WBXMLError wbxml_err = WBXML_OK;
+
+ if (pBinder == NULL) {
+ err = PROTOCOL_BINDER_NOT_DEFINED;
+ goto return_part;
+ }
+ Binder_function_set *pBinder_function_set = pBinder->binder_functions;
+ Binder_Object_converter_function binder_object_converter_function = NULL;
+ Binder_function_info *pFunctionInfo = NULL;
+
+ WBXMLTreeNode *wbxml_tree_node = NULL;
+ WBXMLTreeNode *current_parent_tree_node = NULL;
+ bool is_terminal = false;
+ bool is_start_tag = false;
+
+ if (pBinder_function_set == NULL) {
+ err = PROTOCOL_BINDER_BINDER_FUNCTION_SET_NOT_DEFINED;
+ goto return_part;
+ }
+
+ /* get binder_function by content_id */
+ err = lookup_binder_function(pBinder_function_set, protocol_element, NULL, &pFunctionInfo);
+ if (err != PROTOCOL_BINDER_OK) {
+ err = PROTOCOL_BINDER_APPEND_INVALID_PROTOCOL_ELEMENT;
+ goto return_part;
+ }
+ binder_object_converter_function = pFunctionInfo->binder_object_converter_function;
+ is_start_tag = (pFunctionInfo->protocol_element_xml_name[0] != '/');
+ is_terminal = pFunctionInfo->isTerminal;
+ pBinder->is_current_node_terminal = is_terminal;
+
+ if (is_start_tag) {
+ /* execute binder_object_converter_function */
+ if (binder_object_converter_function != NULL) {
+ FW_LOGD("calling binder_object_converter_function");
+ err = binder_object_converter_function(pBinder, pContent, &wbxml_tree_node);
+ if (err != PROTOCOL_BINDER_OK) {
+ FW_LOGE("error occurred during calling binder_object_converter_function");
+ goto return_part;
+ }
+
+ if (wbxml_tree_node == NULL) {
+ FW_LOGE("after calling binder_object_converter_function, we get NULL wbxml_tree_node");
+ err = PROTOCOL_BINDER_UNKNOWN_ERROR; /* TODO : define new err code */
+ goto return_part;
+ }
+ FW_LOGD("after calling binder_object_converter_function, we get wbxml_tree_node = %p", wbxml_tree_node);
+
+ if (pBinder->use_flow_mode) {
+ /* since encoder has bug with has content flag, we do below meaningless work */
+ if (!is_terminal && wbxml_tree_node->children == NULL) {
+ /* TODO : error handling */
+ WBXMLTreeNode *text_node = wbxml_tree_node_create_text(NULL, 0);
+ wbxml_tree_node_add_child(wbxml_tree_node, text_node);
+ }
+
+ /* TODO : error handling */
+ wbxml_err = wbxml_encoder_encode_node_with_elt_end(pBinder->wbxml_encoder, wbxml_tree_node, is_terminal);
+ if (wbxml_err != WBXML_OK) {
+ err = PROTOCOL_BINDER_UNKNOWN_ERROR;
+ FW_LOGE("wbxml_encoder_encode_node_with_elt_end failed. err(%d) : %s", wbxml_err, wbxml_errors_string(wbxml_err));
+ goto return_part;
+ }
+
+ if (is_terminal) {
+ if (wbxml_tree_node != NULL) {
+ FW_LOGD("free wbxml tree node when non terminal case");
+ wbxml_tree_node_destroy_all(wbxml_tree_node);
+ wbxml_tree_node = NULL;
+ }
+ }
+ } else {
+ /* append node to wbxml dom tree */
+ if (pBinder->tree_node_stack != NULL) {
+ current_parent_tree_node = (WBXMLTreeNode *)(pBinder->tree_node_stack->data);
+ }
+
+ WB_BOOL add_node_success = wbxml_tree_add_node(pBinder->tree, current_parent_tree_node, wbxml_tree_node);
+ if (!add_node_success) {
+ /* TODO : error handling */
+ FW_LOGD("wbxml_tree_add_node failed\n");
+ err = PROTOCOL_BINDER_UNKNOWN_ERROR; /* TODO : define new err code */
+ goto return_part;
+ }
+ }
+
+ /* save wbxml_tree_node in stack */
+ if (!is_terminal) {
+ /* TODO : error handling */
+ pBinder->tree_node_stack = g_slist_prepend(pBinder->tree_node_stack, wbxml_tree_node);
+ }
+ }
+ } else {
+ if (pBinder->tree_node_stack == NULL) {
+ FW_LOGD("end tag not exist. failed\n");
+ err = PROTOCOL_BINDER_UNKNOWN_ERROR; /* TODO : define new err code */
+ goto return_part;
+ }
+
+ /* pop one tree node from stack */
+ GSList *tmp_node = pBinder->tree_node_stack;
+ if (pBinder->use_flow_mode) {
+ /* TODO : error handling */
+ WBXMLTreeNode *current_parent_node = (WBXMLTreeNode *)(tmp_node->data);
+ wbxml_encoder_encode_raw_elt_end(pBinder->wbxml_encoder, current_parent_node, true);
+ if (current_parent_node != NULL) {
+ FW_LOGD("free wbxml tree node when pop in tree node stack");
+ wbxml_tree_node_destroy_all(current_parent_node);
+ }
+ }
+
+ pBinder->tree_node_stack = g_slist_next(pBinder->tree_node_stack);
+ g_slist_free_1(tmp_node);
+ }
+
+return_part:
+ if (err != PROTOCOL_BINDER_OK) {
+ FW_LOGD("error occurred");
+ if (wbxml_tree_node != NULL) {
+ wbxml_tree_node_destroy_all(wbxml_tree_node);
+ }
+ } else {
+ FW_LOGD("end : protocol_element_xml_name = %s\n", pFunctionInfo->protocol_element_xml_name);
+ }
+ return err;
+}
+
+void protocol_binder_terminate(protocol_binder *pBinder)
+{
+ FW_LOGD("start");
+ if (pBinder != NULL) {
+ FW_LOGD("pBinder != NULL");
+ if (pBinder->binder_functions != NULL) {
+ FW_LOGD("free binder functions");
+ free_binder_function_set(pBinder->binder_functions);
+ }
+
+ if (pBinder->use_flow_mode) {
+ if (pBinder->wbxml_encoder != NULL) {
+ FW_LOGD("free wbxml_encoder");
+ wbxml_encoder_destroy(pBinder->wbxml_encoder);
+ }
+ } else {
+ if (pBinder->tree != NULL) {
+ FW_LOGD("free tree");
+ wbxml_tree_destroy(pBinder->tree);
+ }
+ }
+
+ if (pBinder->tree_node_stack != NULL) {
+ FW_LOGD("free tree node stack");
+ g_slist_free(pBinder->tree_node_stack);
+ }
+
+ free(pBinder);
+ }
+ FW_LOGD("end");
+}
+
+PROTOCOL_BINDER_ERROR protocol_binder_get_stream(protocol_binder *pBinder, char **byte_stream, unsigned int *byte_stream_size)
+{
+ FW_LOGD("start\n");
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+ unsigned char *temp_byte_stream = NULL;
+ unsigned int temp_byte_stream_size = 0;
+
+ WBXMLError wbxml_err = WBXML_OK;
+
+ if (pBinder == NULL) {
+ err = PROTOCOL_BINDER_NOT_DEFINED;
+ goto return_part;
+ }
+
+ if (byte_stream == NULL || byte_stream_size == NULL) {
+ err = PROTOCOL_BINDER_INVALID_INPUT_PARAMETER;
+ goto return_part;
+ }
+
+ FW_LOGD("flow mode = %d, encoding = %d\n", pBinder->use_flow_mode, pBinder->enc);
+
+ /* flow mode */
+ if (pBinder->use_flow_mode) {
+ wbxml_err = wbxml_encoder_get_output(pBinder->wbxml_encoder, &temp_byte_stream, &temp_byte_stream_size);
+ /* TODO : how to apply produce_anonymous */
+ /* not in flow mode */
+ } else {
+ WBXMLTree *tree = pBinder->tree;
+
+ if (pBinder->enc == ENCODING_XML) {
+ WBXMLGenXMLParams params = { WBXML_GEN_XML_INDENT, WBXML_LANG_UNKNOWN, WBXML_CHARSET_UNKNOWN, 4, FALSE };
+ wbxml_err = wbxml_tree_to_xml(tree, &temp_byte_stream, &temp_byte_stream_size, &params);
+ } else {
+ WBXMLGenWBXMLParams params;
+
+ /* set encoding language */
+ params.wbxml_version = get_wbxml_version(pBinder->enc);
+ params.keep_ignorable_ws = FALSE;
+ params.use_strtbl = pBinder->use_strtbl;
+ params.produce_anonymous = pBinder->produce_anonymous;
+
+ wbxml_err = wbxml_tree_to_wbxml(tree, &temp_byte_stream, &temp_byte_stream_size, &params);
+ }
+ }
+
+ if (wbxml_err != WBXML_OK) {
+ FW_LOGE("wbxml err = (%d) %s\n", wbxml_err, wbxml_errors_string(wbxml_err));
+ err = PROTOCOL_BINDER_UNKNOWN_ERROR;
+ goto return_part;
+ }
+
+ if (pBinder->enc == ENCODING_XML && !(pBinder->encode_xml_header)) {
+ /* remove xml header */
+ temp_byte_stream_size = remove_xml_header((char *)temp_byte_stream, temp_byte_stream_size);
+ }
+
+ /* for debugging printing result in xml */
+ if (pBinder->enc != ENCODING_XML) {
+ char *xml_result = NULL;
+ unsigned int xml_result_len = 0;
+ protocol_binder_get_xml_for_debugging(pBinder, &xml_result, &xml_result_len);
+
+ FW_LOGD("============= binder wbxml logging start ==============\n");
+ FW_LOGD("wbxml_conv_wbxml2xml_withlen err = (%d) %s\n", err, wbxml_errors_string(err));
+ if (wbxml_err == WBXML_OK) {
+ FW_LOGD("wbxml : %s\n", temp_byte_stream);
+ FW_LOGD("wbxml len : %u\n", temp_byte_stream_size);
+ FW_LOGD("converted xml : %s\n", xml_result);
+ FW_LOGD("converted xml len : %u\n", xml_result_len);
+ }
+ FW_LOGD("============= binder wbxml logging end ==============\n");
+
+ if (xml_result != NULL) {
+ free(xml_result);
+ }
+ } else {
+ FW_LOGD("============= binder xml logging start ==============\n");
+ FW_LOGD("xml : %s\n", temp_byte_stream);
+ FW_LOGD("xml len : %u\n", temp_byte_stream_size);
+ FW_LOGD("============= binder xml logging end ==============\n");
+ }
+
+return_part:
+ if (err != PROTOCOL_BINDER_OK) {
+ if (temp_byte_stream != NULL) {
+ free(temp_byte_stream);
+ }
+ } else {
+ *byte_stream = (char *)temp_byte_stream;
+ *byte_stream_size = temp_byte_stream_size;
+ }
+
+ FW_LOGD("end\n");
+ return err;
+}
+
+PROTOCOL_BINDER_ERROR protocol_binder_get_xml_for_debugging(protocol_binder *pBinder, char **xml, unsigned int *xml_size)
+{
+ FW_LOGD("start");
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+ unsigned char *wbxml = NULL;
+ unsigned int wbxml_len = 0;
+ WBXMLError wbxml_err = WBXML_OK;
+
+ unsigned char *out_xml = NULL;
+ unsigned int out_xml_len = 0;
+ WBXMLConvWBXML2XML *conv = NULL;
+ WBXMLGenXMLParams xml_params = { WBXML_GEN_XML_INDENT, WBXML_LANG_UNKNOWN, WBXML_CHARSET_UNKNOWN, 4, TRUE };
+
+ if (pBinder == NULL) {
+ err = PROTOCOL_BINDER_NOT_DEFINED;
+ goto return_part;
+ }
+
+ if (pBinder->enc == ENCODING_XML) {
+ err = PROTOCOL_BINDER_NOT_SUPPORT_FOR_XML_ENCODING;
+ goto return_part;
+ }
+
+ FW_LOGD("flow mode = %d\n", pBinder->use_flow_mode);
+
+ if (pBinder->use_flow_mode) {
+ wbxml_err = wbxml_encoder_get_output(pBinder->wbxml_encoder, &wbxml, &wbxml_len);
+ if (wbxml_err != WBXML_OK) {
+ FW_LOGE("wbxml_encoder_get_output error occurred.\n");
+ goto wbxml_error_part;
+ }
+
+ wbxml_err = wbxml_conv_wbxml2xml_create(&conv);
+ if (wbxml_err != WBXML_OK){
+ FW_LOGE("wbxml_conv_wbxml2xml_create error occurred.\n");
+ goto wbxml_error_part;
+ }
+
+ wbxml_conv_wbxml2xml_set_gen_type(conv, xml_params.gen_type);
+ wbxml_conv_wbxml2xml_set_language(conv,xml_params.lang);
+ wbxml_conv_wbxml2xml_set_charset(conv, xml_params.charset);
+ wbxml_conv_wbxml2xml_set_indent(conv, xml_params.indent);
+ if (xml_params.keep_ignorable_ws)
+ wbxml_conv_wbxml2xml_enable_preserve_whitespaces(conv);
+
+ wbxml_err = wbxml_conv_wbxml2xml_run(conv, wbxml, wbxml_len, &out_xml, &out_xml_len);
+ if (wbxml_err != WBXML_OK){
+ FW_LOGE("wbxml_conv_wbxml2xml_run error occurred.\n");
+ goto wbxml_error_part;
+ }
+ wbxml_conv_wbxml2xml_destroy(conv);
+
+ } else {
+ WBXMLTree *tree = pBinder->tree;
+ wbxml_err = wbxml_tree_to_xml(tree, &out_xml, &out_xml_len, &xml_params);
+ }
+
+wbxml_error_part:
+ if (wbxml_err != WBXML_OK) {
+ FW_LOGE("wbxml err = (%d) %s\n", err, wbxml_errors_string(err));
+ err = PROTOCOL_BINDER_UNKNOWN_ERROR;
+ goto return_part;
+ }
+
+return_part:
+ if (wbxml != NULL) {
+ free(wbxml);
+ }
+
+ if (err == PROTOCOL_BINDER_OK) {
+ *xml = (char *)out_xml;
+ *xml_size = out_xml_len;
+ } else {
+ if (out_xml != NULL) {
+ free(out_xml);
+ }
+ }
+
+ return err;
+}
+
+PROTOCOL_BINDER_ERROR protocol_binder_get_stream_size(protocol_binder *pBinder, unsigned int *byte_stream_size)
+{
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+ char *out_byte_stream = NULL;
+ unsigned int out_byte_stream_size = 0;
+
+ if (pBinder->use_flow_mode) {
+ out_byte_stream_size = wbxml_encoder_get_output_len(pBinder->wbxml_encoder);
+ } else {
+ err = protocol_binder_get_stream(pBinder, &out_byte_stream, &out_byte_stream_size);
+ if (out_byte_stream != NULL) {
+ free(out_byte_stream);
+ }
+ }
+
+ if (err == PROTOCOL_BINDER_OK) {
+ *byte_stream_size = out_byte_stream_size;
+ }
+
+ return err;
+}
+
+PROTOCOL_BINDER_ERROR protocol_binder_get_encoding(protocol_binder *pBinder, Encoding * enc)
+{
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+
+ if (pBinder == NULL) {
+ err = PROTOCOL_BINDER_NOT_DEFINED;
+ goto return_part;
+ }
+
+ *enc = pBinder->enc;
+
+return_part:
+ return err;
+}
+
+/* reverse protocol binder */
+
+PROTOCOL_BINDER_ERROR reverse_protocol_binder_init(char *byte_stream, unsigned int byte_stream_len, Decoding dec, Protocol * pProtocol, Binder_function_set *pBinder_function_set, void *user_data, Reverse_protocol_binder **ppBinder)
+{
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+ Reverse_protocol_binder *pBinder = NULL;
+ WBXMLTree *wbxml_tree = NULL;
+ Protocol input_protocol = PROTOCOL_UNKNOWN;
+ if (pProtocol != NULL) {
+ input_protocol = *pProtocol;
+ if (!validate_protocol(input_protocol)) {
+ err = PROTOCOL_BINDER_INVALID_INPUT_PARAMETER;
+ goto return_part;
+ }
+ }
+ Protocol output_protocol = PROTOCOL_UNKNOWN;
+ WBXMLLanguage input_wbxml_lang = get_wbxml_language(input_protocol);
+
+ switch (dec) {
+ case DECODING_WBXML:
+ {
+ err = get_wbxml_tree_from_wbxml(byte_stream, byte_stream_len, input_wbxml_lang, &wbxml_tree);
+ if (err != PROTOCOL_BINDER_OK) {
+ goto return_part;
+ }
+#ifndef NDEBUG
+ print_wbxml_dom_in_xml(wbxml_tree);
+#endif
+ }
+ break;
+ case DECODING_XML:
+ {
+ err = get_wbxml_tree_from_xml(byte_stream, byte_stream_len, input_wbxml_lang, &wbxml_tree);
+ if (err != PROTOCOL_BINDER_OK) {
+ goto return_part;
+ }
+ }
+ break;
+ default:
+ err = PROTOCOL_BINDER_UNKNOWN_ENCODING;
+ goto return_part;
+ }
+
+ assert(wbxml_tree != NULL);
+ assert(wbxml_tree->lang != NULL);
+ /* SVACE : wbxml_tree->lang NULL check added. */
+
+ output_protocol = get_protocol_from_wbxml_lang(wbxml_tree->lang->langID);
+
+ /* allocation Reverse_protocol_binder */
+ pBinder = (Reverse_protocol_binder *)calloc(1, sizeof(Reverse_protocol_binder));
+ if (pBinder == NULL) {
+ err = PROTOCOL_BINDER_OUT_OF_MEMORY;
+ goto return_part;
+ }
+
+ /* set property */
+ pBinder->protocol = output_protocol;
+ pBinder->dec = dec;
+ pBinder->binder_functions = pBinder_function_set;
+ pBinder->user_data = user_data;
+
+ pBinder->tree = wbxml_tree;
+ pBinder->tree_stack = NULL;
+ pBinder->current_tree_node = NULL;
+ pBinder->current_tree_node_first_visit = true;
+
+ pBinder->no_tree_node_visited = true;
+ pBinder->all_tree_node_visited = false;
+
+return_part:
+ if (err != PROTOCOL_BINDER_OK) {
+ if (pBinder == NULL) {
+ if (wbxml_tree != NULL) {
+ wbxml_tree_destroy(wbxml_tree);
+ }
+ }
+ if (pBinder != NULL) {
+ reverse_protocol_binder_terminate(pBinder);
+ pBinder = NULL;
+ }
+ } else {
+ *ppBinder = pBinder;
+ if (pProtocol != NULL)
+ *pProtocol = output_protocol;
+ }
+ return err;
+}
+
+void reverse_protocol_binder_set_user_data(Reverse_protocol_binder *pBinder, void *user_data)
+{
+ pBinder->user_data = user_data;
+}
+
+void *reverse_protocol_binder_get_user_data(Reverse_protocol_binder *pBinder)
+{
+ return pBinder->user_data;
+}
+
+PROTOCOL_BINDER_ERROR reverse_protocol_binder_next(Reverse_protocol_binder *pBinder, Protocol_Element * protocol_element, char **protocol_element_name, Content_Ptr *pContent)
+{
+ FW_LOGD("start\n");
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+
+ char *ret_protocol_element = NULL;
+
+ WBXMLTreeNode *current_tree_node = pBinder->current_tree_node;
+ bool first_visit = pBinder->current_tree_node_first_visit;
+
+ Binder_function_info *pFunction_info = NULL;
+ Reverse_Binder_Object_converter_function reverse_binder_object_converter_function = NULL;
+ bool is_element_node = false;
+ bool is_tree_node = false;
+ char *current_tree_node_protocol_element_name = NULL;
+ char *search_element_name = NULL;
+
+ /* if all node already visited, then "PROTOCOL_BINDER_HAS_NO_MORE_ELEMENT" error occurs */
+ if (pBinder->all_tree_node_visited) {
+ err = PROTOCOL_BINDER_HAS_NO_MORE_ELEMENT;
+ goto return_part;
+ }
+
+ /* find next element which has callback */
+ do {
+ /* get next tree node (order : depth-first) */
+ if (pBinder->no_tree_node_visited) {
+ current_tree_node = pBinder->tree->root;
+ pBinder->no_tree_node_visited = false;
+ } else {
+
+ is_tree_node = has_wbxml_node_same_type(current_tree_node, WBXML_TREE_TREE_NODE);
+ if (!is_tree_node) {
+ current_tree_node = get_next_node_of_element_node(current_tree_node, &first_visit);
+
+ /* get subtree node when all nodes of subtree are visited */
+ if (current_tree_node == NULL && pBinder->tree_stack != NULL) {
+ first_visit = false;
+ current_tree_node = (WBXMLTreeNode *)(pBinder->tree_stack->data);
+ continue;
+ }
+ } else {
+ /* if root tree has sub-tree which has different language,
+ * then save it to tree stack */
+ if (first_visit) {
+ /* push sub-tree into tree stack */
+ pBinder->tree_stack = g_slist_prepend(pBinder->tree_stack, current_tree_node);
+ } else {
+ /* pop sub-tree from tree stack */
+ pBinder->tree_stack = g_slist_delete_link(pBinder->tree_stack, pBinder->tree_stack); /* remove the head */
+ }
+ current_tree_node = get_next_node_of_tree_node(current_tree_node, &first_visit);
+ }
+ }
+
+ /* break when no next node to get */
+ if (current_tree_node == NULL)
+ break;
+
+ is_element_node = has_wbxml_node_same_type(current_tree_node, WBXML_TREE_ELEMENT_NODE);
+ if (!is_element_node) {
+ continue;
+ }
+
+ /* get callback */
+ err = get_xml_name_from_element_wbxml_node(current_tree_node, &current_tree_node_protocol_element_name);
+ assert(err == PROTOCOL_BINDER_OK);
+
+ assert(current_tree_node_protocol_element_name != NULL);
+ if (first_visit) {
+ FW_LOGD("currently traversing element name = %s first\n", current_tree_node_protocol_element_name);
+ } else {
+ FW_LOGD("currently traversing element name = %s second\n", current_tree_node_protocol_element_name);
+ }
+
+ Binder_function_set *binder_functions = pBinder->binder_functions;
+
+ if (first_visit) {
+ search_element_name = strdup(current_tree_node_protocol_element_name);
+ } else {
+ unsigned int protocol_element_name_len = strlen(current_tree_node_protocol_element_name);
+ search_element_name = malloc(protocol_element_name_len + 2);
+ if (search_element_name == NULL) {
+ err = PROTOCOL_BINDER_OUT_OF_MEMORY;
+ goto return_part;
+ }
+
+ search_element_name[0] = '/';
+ memcpy(search_element_name + 1, current_tree_node_protocol_element_name, protocol_element_name_len);
+ search_element_name[protocol_element_name_len + 1] = '\0';
+ }
+ if (search_element_name == NULL) {
+ err = PROTOCOL_BINDER_OUT_OF_MEMORY;
+ goto return_part;
+ }
+
+ err = lookup_binder_function(binder_functions, 0, search_element_name, &pFunction_info);
+
+ assert(search_element_name != NULL);
+ FW_LOGD("search_element_name = %s\n", search_element_name);
+ free(search_element_name);
+ FW_LOGD("search_element_name free success\n");
+ search_element_name = NULL;
+
+ if (err != PROTOCOL_BINDER_OK) {
+ continue; /* TODO */
+ }
+
+ reverse_binder_object_converter_function = pFunction_info->reverse_binder_object_converter_function;
+
+ } while (reverse_binder_object_converter_function == NULL);
+
+ /* all xml tags are visited case */
+ if (current_tree_node == NULL) {
+ err = PROTOCOL_BINDER_HAS_NO_MORE_ELEMENT;
+ goto return_part;
+ }
+ /* get next callback case */
+ else {
+ assert(reverse_binder_object_converter_function != NULL);
+
+ /* logging */
+ FW_LOGD("reverse callback call at <%s>\n", pFunction_info->protocol_element_xml_name);
+
+ /* reverse convert */
+ err = reverse_binder_object_converter_function(pBinder, current_tree_node, pContent);
+ if (err != PROTOCOL_BINDER_OK) {
+ goto return_part;
+ }
+
+ /* set protocol element, protocol element name */
+ ret_protocol_element = strdup(pFunction_info->protocol_element_xml_name);
+ if (ret_protocol_element == NULL) {
+ err = PROTOCOL_BINDER_OUT_OF_MEMORY;
+ goto return_part;
+ }
+
+ err = PROTOCOL_BINDER_OK;
+ goto return_part;
+ }
+
+return_part:
+ FW_LOGD("return part : err = %d\n", err);
+ if (err == PROTOCOL_BINDER_OK) {
+ pBinder->current_tree_node = current_tree_node;
+ pBinder->current_tree_node_first_visit = first_visit;
+
+ *protocol_element = pFunction_info->protocol_element;
+ if (protocol_element_name != NULL) {
+ *protocol_element_name = ret_protocol_element;
+ } else {
+ if (ret_protocol_element != NULL)
+ free(ret_protocol_element);
+ }
+ } else {
+ if (ret_protocol_element != NULL) {
+ free(ret_protocol_element);
+ }
+ }
+ return err;
+}
+
+void reverse_protocol_binder_terminate(Reverse_protocol_binder *pBinder)
+{
+ if (pBinder != NULL) {
+ if (pBinder->tree != NULL) {
+ wbxml_tree_destroy(pBinder->tree);
+ pBinder->tree = NULL;
+ }
+ if (pBinder->tree_stack != NULL) {
+ g_slist_free(pBinder->tree_stack);
+ pBinder->tree_stack = NULL;
+ }
+ if (pBinder->current_tree_node != NULL) {
+ pBinder->current_tree_node = NULL; /* DO NOT FREE THIS NODE */
+ }
+ if (pBinder->binder_functions != NULL) {
+ pBinder->binder_functions = NULL; /* DO NOT FREE THIS */
+ }
+
+ free(pBinder);
+ }
+}
+
+PROTOCOL_BINDER_ERROR reverse_protocol_binder_get_xml_for_debugging(Reverse_protocol_binder *pBinder, char **xml, unsigned int *xml_size)
+{
+ FW_LOGD("reverse_protocol_binder_xml_print started\n");
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+ unsigned char *out_xml = NULL;
+ unsigned int out_xml_len = 0;
+
+ if (pBinder == NULL) {
+ err = PROTOCOL_BINDER_NOT_DEFINED;
+ goto return_part;
+ }
+ if (pBinder->tree == NULL) {
+ err = PROTOCOL_BINDER_INIT_REQUIRED_OR_INVALID_BINDER;
+ goto return_part;
+ }
+
+ if (pBinder->dec == DECODING_XML) {
+ err = PROTOCOL_BINDER_NOT_SUPPORT_FOR_XML_DECODING;
+ goto return_part;
+ }
+
+ WBXMLGenXMLParams params = { WBXML_GEN_XML_INDENT, WBXML_LANG_UNKNOWN, WBXML_CHARSET_UNKNOWN, 4, FALSE };
+ WBXMLError wbxml_err = wbxml_tree_to_xml(pBinder->tree, &out_xml, &out_xml_len, &params);
+ if (wbxml_err != WBXML_OK) {
+ err = PROTOCOL_BINDER_UNKNOWN_ERROR;
+ goto return_part;
+ }
+
+return_part:
+ if (err == PROTOCOL_BINDER_OK) {
+ *xml = (char *)out_xml;
+ *xml_size = out_xml_len;
+ }
+
+ FW_LOGD("reverse_protocol_binder_xml_print ended, err = %d\n", err);
+ return err;
+}
diff --git a/framework/src/NetworkAssistant/protocol_binder/protocol_binder_util.c b/framework/src/NetworkAssistant/protocol_binder/protocol_binder_util.c
new file mode 100755
index 0000000..a7ca4a1
--- /dev/null
+++ b/framework/src/NetworkAssistant/protocol_binder/protocol_binder_util.c
@@ -0,0 +1,824 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * SeongWon Shim <seongwon.shim@samsung.com>
+ */
+
+#include <stdbool.h>
+#include <libxml/parser.h>
+
+#include "protocol_binder/protocol_binder_util_internal.h"
+#include "protocol_binder/protocol_binder_internal.h"
+#include "Utility/fw_log.h"
+#include "Utility/fw_assert.h"
+
+#define LOG_TAG "AF_PB_UTIL"
+
+/* internal function */
+unsigned int remove_xml_header(char *xml, unsigned int xml_len)
+{
+ /* note that xml generated by wbxml library always have <!DOCTYPE */
+ char *doctype_part_start = strstr(xml, "<!DOCTYPE");
+ fw_assert_condition(doctype_part_start != NULL, "<!DOCTYPE part missing in XML\n");
+
+ unsigned int xml_len_before_doctype_part_start = doctype_part_start - xml;
+ FW_LOGD("doctype_part_start = %s\n", doctype_part_start);
+
+ char *doctype_part_end = strchr(doctype_part_start, '>');
+ fw_assert_condition(doctype_part_end != NULL, "<!DOCTYPE part doesn't finished\n");
+
+ char *after_doctype_part = strchr(doctype_part_end, '<');
+ fw_assert_condition(doctype_part_end != NULL, "No xml tag after xml header part\n");
+
+ unsigned int xml_len_doctype_part = after_doctype_part - doctype_part_start;
+ FW_LOGD("after_doctype_part = %s\n", after_doctype_part);
+
+ unsigned int xml_len_after_doctype_part = xml_len - xml_len_before_doctype_part_start - xml_len_doctype_part;
+ FW_LOGD("ret_xml_len = %d, xml_len_before_doctype_part_start = %d, xml_len_doctype_part = %d\n", xml_len, xml_len_before_doctype_part_start, xml_len_doctype_part);
+
+#ifndef NDEBUG
+ unsigned int xml_len_after_doctype_part_expected = strlen(after_doctype_part);
+ FW_LOGD("real = %d, expected = %d\n", xml_len_after_doctype_part, xml_len_after_doctype_part_expected);
+#endif /* NDEBUG */
+
+ memmove(xml, after_doctype_part, xml_len_after_doctype_part + 1);
+ FW_LOGD("xml without header = %s\n", xml);
+
+ return xml_len_after_doctype_part;
+}
+
+/* external functions */
+PROTOCOL_BINDER_ERROR switch_protocol(protocol_binder *pBinder, Protocol protocol)
+{
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+
+ if (pBinder == NULL) {
+ err = PROTOCOL_BINDER_NOT_DEFINED;
+ goto return_part;
+ }
+
+ WBXMLLanguage lang = get_wbxml_language(protocol);
+ if (lang == WBXML_LANG_UNKNOWN) {
+ err = PROTOCOL_BINDER_INVALID_PROTOCOL;
+ goto return_part;
+ }
+
+ if (pBinder->prev_lang_table != NULL) {
+ err = PROTOCOL_BINDER_ALREADY_SWITCH_PROTOCOL;
+ goto return_part;
+ }
+
+ pBinder->prev_lang_table = pBinder->lang_table;
+ pBinder->lang_table = (WBXMLLangEntry *) wbxml_tables_get_table(lang);
+
+return_part:
+ return err;
+}
+
+PROTOCOL_BINDER_ERROR undo_switch_protocol(protocol_binder *pBinder)
+{
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+
+ if (pBinder == NULL) {
+ err = PROTOCOL_BINDER_NOT_DEFINED;
+ goto return_part;
+ }
+
+ if (pBinder->prev_lang_table == NULL) {
+ err = PROTOCOL_BINDER_HAS_NO_UNDO_SWITCH_PROTOCOL;
+ goto return_part;
+ }
+
+ pBinder->lang_table = pBinder->prev_lang_table;
+ pBinder->prev_lang_table = NULL;
+
+return_part:
+ return err;
+}
+
+WBXMLTree *create_wbxml_tree(const protocol_binder *pBinder)
+{
+ WBXMLCharsetMIBEnum orig_charset = WBXML_PARSER_DEFAULT_CHARSET;
+ WBXMLLanguage lang = pBinder->lang_table->langID;
+
+ return wbxml_tree_create(lang, orig_charset);
+}
+
+PROTOCOL_BINDER_ERROR add_wbxml_tree_to_wbxml_node(WBXMLTreeNode *parent_node, WBXMLTree *tree)
+{
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+ if (parent_node == NULL || tree == NULL) {
+ err = PROTOCOL_BINDER_INVALID_INPUT_PARAMETER;
+ goto return_part;
+ }
+
+ WBXMLTreeNode *tree_node = wbxml_tree_node_create(WBXML_TREE_TREE_NODE);
+ if (tree_node == NULL) {
+ err = PROTOCOL_BINDER_OUT_OF_MEMORY;
+ goto return_part;
+ }
+
+ WB_BOOL success = wbxml_tree_node_add_child(parent_node, tree_node);
+ if (!success) {
+ err = PROTOCOL_BINDER_INVALID_INPUT_PARAMETER;
+ wbxml_tree_node_destroy(tree_node);
+ goto return_part;
+ }
+
+ tree_node->tree = tree;
+
+return_part:
+ return err;
+}
+
+PROTOCOL_BINDER_ERROR set_wbxml_tree_root(WBXMLTree *tree, WBXMLTreeNode *node)
+{
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+ if (tree == NULL || node == NULL) {
+ err = PROTOCOL_BINDER_INVALID_INPUT_PARAMETER;
+ goto return_part;
+ }
+
+ WB_BOOL success = wbxml_tree_add_node(tree, NULL, node);
+ if (!success) {
+ err = PROTOCOL_BINDER_TREE_ALREADY_HAS_ROOT;
+ goto return_part;
+ }
+
+return_part:
+ return err;
+}
+
+WBXMLTreeNode *create_wbxml_node_using_xml_name(const protocol_binder *pBinder, const char *xml_name)
+{
+ return wbxml_tree_node_create_xml_elt(pBinder->lang_table, (unsigned char *)xml_name);
+}
+
+WBXMLTreeNode *create_wbxml_node_using_xml_name_and_namespace(const protocol_binder *pBinder, const char *xml_name, const char *namespace)
+{
+ WBXMLTreeNode *node = NULL;
+
+ const WBXMLTagEntry *tag_entry = NULL;
+ WBXMLTag *tag = NULL;
+ WB_UTINY code_page = 0;
+
+ code_page = wbxml_tables_get_code_page(pBinder->lang_table->nsTable, namespace);
+ if ((tag_entry = wbxml_tables_get_tag_from_xml(pBinder->lang_table, code_page, (unsigned char *)xml_name)) != NULL) {
+ /* token tag */
+ tag = wbxml_tag_create_token(tag_entry);
+ } else {
+ tag = wbxml_tag_create_literal((unsigned char *)xml_name);
+ }
+
+ if (tag == NULL)
+ return NULL;
+
+ /* Create a new Node */
+ if ((node = wbxml_tree_node_create(WBXML_TREE_ELEMENT_NODE)) == NULL) {
+ wbxml_tag_destroy(tag);
+ return NULL;
+ }
+
+ /* Set Node Tag */
+ node->name = tag;
+
+ return node;
+}
+
+WBXMLTreeNode *create_wbxml_node_using_xml_name_with_text(const protocol_binder *pBinder, const char *xml_name, const char *text, unsigned int text_len)
+{
+ return wbxml_tree_node_create_xml_elt_with_text(pBinder->lang_table, (unsigned char *)xml_name, (unsigned char *)text, text_len);
+}
+
+WBXMLTreeNode *create_wbxml_node_using_xml_name_and_namespace_with_text(const protocol_binder *pBinder, const char *xml_name, const char *namespace, const char *text, unsigned int text_len)
+{
+ WBXMLTreeNode *node = NULL;
+ WBXMLTreeNode *text_node = NULL;
+
+ node = create_wbxml_node_using_xml_name_and_namespace(pBinder, xml_name, namespace);
+ if (node == NULL) {
+ return NULL;
+ }
+
+ /* Create text node */
+ if ((text_node = wbxml_tree_node_create_text((unsigned char *)text, text_len)) == NULL) {
+ wbxml_tree_node_destroy(node);
+ return NULL;
+ }
+
+ /* Add text node to element node */
+ if (!wbxml_tree_node_add_child(node, text_node)) {
+ wbxml_tree_node_destroy(node);
+ wbxml_tree_node_destroy(text_node);
+ return NULL;
+ }
+
+ return node;
+}
+
+WBXMLTreeNode *create_wbxml_node_using_xml_name_with_cdata(const protocol_binder *pBinder, const char *xml_name, const char *text, unsigned int text_len)
+{
+ bool success = false;
+ WBXMLTreeNode *wbxml_tree_node = wbxml_tree_node_create_xml_elt(pBinder->lang_table, (unsigned char *)xml_name);
+ if (wbxml_tree_node == NULL) {
+ goto return_part;
+ }
+
+ if (text != NULL) {
+ WBXMLTreeNode *text_node = wbxml_tree_node_create_cdata((unsigned char *)text, text_len);
+ if (text_node == NULL) {
+ success = false;
+ goto return_part;
+ }
+
+ success = wbxml_node_add_child_node(wbxml_tree_node, text_node);
+ if (!success) {
+ wbxml_tree_node_destroy(text_node);
+ goto return_part;
+ }
+ }
+
+return_part:
+ if (!success) {
+ if (wbxml_tree_node != NULL) {
+ wbxml_tree_node_destroy(wbxml_tree_node);
+ wbxml_tree_node = NULL;
+ }
+ }
+ return wbxml_tree_node;
+}
+
+WBXMLTreeNode *add_child_wbxml_node_using_xml_name(const protocol_binder *pBinder, WBXMLTreeNode *parent_node, const char *xml_name)
+{
+ WBXMLTreeNode *new_node = create_wbxml_node_using_xml_name(pBinder, xml_name);
+ if (new_node == NULL) {
+ return new_node;
+ }
+
+ bool success = wbxml_node_add_child_node(parent_node, new_node);
+ if (success) {
+ return new_node;
+ } else {
+ wbxml_tree_node_destroy(new_node);
+ return NULL;
+ }
+}
+
+WBXMLTreeNode *add_child_wbxml_node_using_xml_name_and_namespace(const protocol_binder *pBinder, WBXMLTreeNode *parent_node, const char *xml_name, const char *namespace)
+{
+ WBXMLTreeNode *new_node = create_wbxml_node_using_xml_name_and_namespace(pBinder,
+ xml_name,
+ namespace);
+ if (new_node == NULL) {
+ return NULL;
+ }
+
+ bool success = wbxml_node_add_child_node(parent_node, new_node);
+ if (success) {
+ return new_node;
+ } else {
+ wbxml_tree_node_destroy(new_node);
+ return NULL;
+ }
+}
+
+WBXMLTreeNode *add_child_wbxml_node_using_xml_name_with_text(const protocol_binder *pBinder, WBXMLTreeNode *parent_node, const char *xml_name, const char *text, unsigned int text_len)
+{
+ WBXMLTreeNode *new_node = create_wbxml_node_using_xml_name_with_text(pBinder, xml_name, text, text_len);
+ if (new_node == NULL) {
+ return new_node;
+ }
+
+ bool success = wbxml_node_add_child_node(parent_node, new_node);
+ if (success) {
+ return new_node;
+ } else {
+ wbxml_tree_node_destroy(new_node);
+ return NULL;
+ }
+}
+
+WBXMLTreeNode *add_child_wbxml_node_using_xml_name_and_namespace_with_text(const protocol_binder *pBinder, WBXMLTreeNode *parent_node, const char *xml_name, const char *namespace, const char *text, unsigned int text_len)
+{
+ WBXMLTreeNode *new_node = create_wbxml_node_using_xml_name_and_namespace_with_text(pBinder,
+ xml_name,
+ namespace,
+ text,
+ text_len);
+
+ bool success = wbxml_node_add_child_node(parent_node, new_node);
+ if (success) {
+ return new_node;
+ } else {
+ wbxml_tree_node_destroy(new_node);
+ return NULL;
+ }
+}
+
+WBXMLTreeNode *add_child_wbxml_node_using_xml_name_with_cdata(const protocol_binder *pBinder, WBXMLTreeNode *parent_node, const char *xml_name, const char *text, unsigned int text_len)
+{
+ WBXMLTreeNode *new_node = create_wbxml_node_using_xml_name_with_cdata(pBinder, xml_name, text, text_len);
+ if (new_node == NULL) {
+ return new_node;
+ }
+
+ bool success = wbxml_node_add_child_node(parent_node, new_node);
+ if (success) {
+ return new_node;
+ } else {
+ wbxml_tree_node_destroy(new_node);
+ return NULL;
+ }
+}
+
+WBXMLTreeNode *add_child_wbxml_node_using_xml_name_with_int(const protocol_binder *pBinder, WBXMLTreeNode *parent_node, const char *xml_name, const int num)
+{
+ WBXMLTreeNode *node = NULL;
+ char *num_string = g_strdup_printf("%d", num);
+ if (num_string == NULL) {
+ return NULL;
+ }
+
+ node = add_child_wbxml_node_using_xml_name_with_text(pBinder, parent_node, xml_name, num_string, strlen(num_string));
+ g_free(num_string);
+
+ return node;
+}
+
+WBXMLTreeNode *add_child_wbxml_node_using_xml_name_and_namespace_with_int(const protocol_binder *pBinder, WBXMLTreeNode *parent_node, const char *xml_name, const char *namespace, const int num)
+{
+ WBXMLTreeNode *node = NULL;
+ char *num_string = g_strdup_printf("%d", num);
+ if (num_string == NULL) {
+ return NULL;
+ }
+
+ node = add_child_wbxml_node_using_xml_name_and_namespace_with_text(pBinder, parent_node, xml_name, namespace, num_string, strlen(num_string));
+ g_free(num_string);
+
+ return node;
+}
+
+WBXMLTreeNode *add_child_wbxml_node_using_xml_name_with_unsigned_int(const protocol_binder *pBinder, WBXMLTreeNode *parent_node, const char *xml_name, const unsigned int num)
+{
+ WBXMLTreeNode *node = NULL;
+ char *num_string = g_strdup_printf("%u", num);
+ if (num_string == NULL) {
+ return NULL;
+ }
+
+ node = add_child_wbxml_node_using_xml_name_with_text(pBinder, parent_node, xml_name, num_string, strlen(num_string));
+ g_free(num_string);
+
+ return node;
+}
+
+WBXMLTreeNode *add_child_wbxml_node_using_xml_name_and_namespace_with_unsigned_int(const protocol_binder *pBinder, WBXMLTreeNode *parent_node, const char *xml_name, const char *namespace, const unsigned int num)
+{
+ WBXMLTreeNode *node = NULL;
+ char *num_string = g_strdup_printf("%u", num);
+ if (num_string == NULL) {
+ return NULL;
+ }
+
+ node = add_child_wbxml_node_using_xml_name_and_namespace_with_text(pBinder, parent_node, xml_name, namespace, num_string, strlen(num_string));
+ g_free(num_string);
+
+ return node;
+}
+
+bool wbxml_node_add_child_node(WBXMLTreeNode *parent, WBXMLTreeNode *child)
+{
+ return wbxml_tree_node_add_child(parent, child);
+}
+
+PROTOCOL_BINDER_ERROR get_xml_name_from_element_wbxml_node(const WBXMLTreeNode *element_node, char **element_xml_name)
+{
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+ char *out_element_xml_name = NULL;
+
+ if (!has_wbxml_node_same_type((WBXMLTreeNode *)element_node, WBXML_TREE_ELEMENT_NODE)) {
+ err = PROTOCOL_BINDER_TREE_NODE_IS_NOT_ELEMENT_NODE;
+ goto return_part;
+ }
+
+ if (element_node->name != NULL) {
+ out_element_xml_name = (char *)wbxml_tag_get_xml_name(element_node->name);
+ }
+
+return_part:
+ if (err == PROTOCOL_BINDER_OK) {
+ *element_xml_name = out_element_xml_name;
+ }
+ return err;
+}
+
+PROTOCOL_BINDER_ERROR get_namespace_from_element_wbxml_node(const Reverse_protocol_binder *pBinder, const WBXMLTreeNode *element_node, char **namespace)
+{
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+ char *out_namespace = NULL;
+
+ if (!has_wbxml_node_same_type((WBXMLTreeNode *)element_node, WBXML_TREE_ELEMENT_NODE)) {
+ err = PROTOCOL_BINDER_TREE_NODE_IS_NOT_ELEMENT_NODE;
+ goto return_part;
+ }
+
+ if (element_node->name != NULL && element_node->name->type == WBXML_VALUE_TOKEN) {
+ const WBXMLLangEntry *pLang = get_current_subtree_lang((Reverse_protocol_binder *)pBinder);
+ assert(pLang != NULL);
+
+ out_namespace = (char *)wbxml_tables_get_xmlns(pLang->nsTable, element_node->name->u.token->wbxmlCodePage);
+ }
+
+return_part:
+ if (err == PROTOCOL_BINDER_OK) {
+ *namespace = out_namespace;
+ }
+ return err;
+}
+
+PROTOCOL_BINDER_ERROR get_text_pointer_from_wbxml_node(WBXMLTreeNode *parent, char **text_pointer)
+{
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+ if (parent->children != NULL && parent->children->type == WBXML_TREE_TEXT_NODE && parent->children->content != NULL) {
+ *text_pointer = (char *)wbxml_buffer_get_cstr(parent->children->content);
+ } else {
+ *text_pointer = NULL;
+ }
+
+ return err;
+}
+
+PROTOCOL_BINDER_ERROR get_binary_pointer_from_wbxml_node(WBXMLTreeNode *parent, char **binary_pointer, unsigned int *binary_size)
+{
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+ if (parent->children != NULL && parent->children->type == WBXML_TREE_TEXT_NODE && parent->children->content != NULL) {
+ *binary_pointer = (char *)wbxml_buffer_get_cstr(parent->children->content);
+ *binary_size = wbxml_buffer_len(parent->children->content);
+ } else {
+ err = PROTOCOL_BINDER_UTIL_NO_BINARY_VALUE;
+ }
+
+ return err;
+}
+
+PROTOCOL_BINDER_ERROR get_int_from_wbxml_node(WBXMLTreeNode *parent, int *value)
+{
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+ char *text_pointer = NULL;
+ err = get_text_pointer_from_wbxml_node(parent, &text_pointer);
+ /*if (err != PROTOCOL_BINDER_OK) {
+ assert(err == PROTOCOL_BINDER_UTIL_NO_TEXT_VALUE);
+ err = PROTOCOL_BINDER_UTIL_NO_INT_VALUE;
+ return err;
+ } */
+
+ if (text_pointer != NULL) {
+ *value = atoi(text_pointer);
+ } else {
+ err = PROTOCOL_BINDER_UTIL_NO_INT_VALUE;
+ }
+
+ return err;
+}
+
+PROTOCOL_BINDER_ERROR get_text_pointer_from_wbxml_cdata_node(WBXMLTreeNode *parent, char **text_pointer)
+{
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+ WBXMLTreeNode *cdata_node = parent->children;
+
+ if (cdata_node != NULL && cdata_node->type == WBXML_TREE_CDATA_NODE) {
+ err = get_text_pointer_from_wbxml_node(cdata_node, text_pointer);
+ } else {
+ *text_pointer = NULL;
+ }
+
+ return err;
+}
+
+PROTOCOL_BINDER_ERROR get_binary_pointer_from_wbxml_cdata_node(WBXMLTreeNode *parent, char **binary_pointer, unsigned int *binary_size)
+{
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+ WBXMLTreeNode *cdata_node = parent->children;
+
+ if (cdata_node != NULL && cdata_node->type == WBXML_TREE_CDATA_NODE) {
+ err = get_binary_pointer_from_wbxml_node(cdata_node, binary_pointer, binary_size);
+ } else {
+ err = PROTOCOL_BINDER_UTIL_NO_BINARY_VALUE;
+ }
+
+ return err;
+}
+
+PROTOCOL_BINDER_ERROR get_wbxml_tree_from_wbxml(char *byte_stream, int byte_stream_len, WBXMLLanguage wbxml_lang, WBXMLTree **wbxml_tree)
+{
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+ WBXMLTree *ret_wbxml_tree = NULL;
+
+ FW_LOGD("start with byte_stream = %x, byte_stream_len = %d\n", byte_stream, byte_stream_len);
+ WBXMLError wbxml_err = wbxml_tree_from_wbxml((unsigned char *)byte_stream, byte_stream_len, wbxml_lang, WBXML_CHARSET_UNKNOWN, &ret_wbxml_tree);
+
+ if (wbxml_err != WBXML_OK) {
+ FW_LOGE("wbxml_tree_from_wbxml error occurred. wbxml error(%d) = %s", wbxml_err, wbxml_errors_string(wbxml_err));
+ err = PROTOCOL_BINDER_WBXML_PARSE_FAIL;
+ goto return_part;
+ }
+
+return_part:
+ if (err == PROTOCOL_BINDER_OK) {
+ *wbxml_tree = ret_wbxml_tree;
+ }
+ FW_LOGD("ended with err = %d\n", err);
+ return err;
+}
+
+PROTOCOL_BINDER_ERROR get_wbxml_tree_from_xml(char *byte_stream, int byte_stream_len, WBXMLLanguage wbxml_lang, WBXMLTree **wbxml_tree)
+{
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+ WBXMLTree *ret_wbxml_tree = NULL;
+
+ FW_LOGD("start with byte_stream = %x, byte_stream_len = %d\n", byte_stream, byte_stream_len);
+ WBXMLError wbxml_err = wbxml_tree_from_xml_with_lang((unsigned char *)byte_stream, byte_stream_len, wbxml_lang, &ret_wbxml_tree);
+
+ if (wbxml_err != WBXML_OK) {
+ FW_LOGE("wbxml_tree_from_xml error occurred. wbxml error(%d) = %s", wbxml_err, wbxml_errors_string(wbxml_err));
+ err = PROTOCOL_BINDER_XML_PARSE_FAIL;
+ goto return_part;
+ }
+
+return_part:
+ if (err == PROTOCOL_BINDER_OK) {
+ *wbxml_tree = ret_wbxml_tree;
+ }
+ FW_LOGD("ended with err = %d\n", err);
+ return err;
+}
+
+bool validate_protocol(Protocol protocol)
+{
+ if (PROTOCOL_UNKNOWN <= protocol && protocol < PROTOCOL_MAX_COUNT) {
+ return true;
+ }
+ return false;
+}
+
+WBXMLLanguage get_wbxml_language(Protocol protocol)
+{
+ WBXMLLanguage lang = WBXML_LANG_UNKNOWN;
+
+ switch (protocol) {
+ case PROTOCOL_SYNCML_SYNCML10:
+ lang = WBXML_LANG_SYNCML_SYNCML10;
+ break;
+ case PROTOCOL_SYNCML_SYNCML11:
+ lang = WBXML_LANG_SYNCML_SYNCML11;
+ break;
+ case PROTOCOL_SYNCML_SYNCML12:
+ lang = WBXML_LANG_SYNCML_SYNCML12;
+ break;
+ case PROTOCOL_SYNCML_DEVINF10:
+ lang = WBXML_LANG_SYNCML_DEVINF10;
+ break;
+ case PROTOCOL_SYNCML_DEVINF11:
+ lang = WBXML_LANG_SYNCML_DEVINF11;
+ break;
+ case PROTOCOL_SYNCML_DEVINF12:
+ lang = WBXML_LANG_SYNCML_DEVINF12;
+ break;
+ case PROTOCOL_SYNCML_METINF10:
+ lang = WBXML_LANG_SYNCML_METINF10;
+ break;
+ case PROTOCOL_SYNCML_METINF11:
+ lang = WBXML_LANG_SYNCML_METINF11;
+ break;
+ case PROTOCOL_SYNCML_METINF12:
+ lang = WBXML_LANG_SYNCML_METINF12;
+ break;
+ case PROTOCOL_SYNCML_DMDDF12:
+ lang = WBXML_LANG_SYNCML_DMDDF12;
+ break;
+ case PROTOCOL_ACTIVESYNC:
+ lang = WBXML_LANG_ACTIVESYNC;
+ break;
+ case PROTOCOL_PROV10:
+ lang = WBXML_LANG_PROV10;
+ break;
+ default:
+ break;
+ }
+
+ return lang;
+}
+
+Protocol get_protocol_from_wbxml_lang(WBXMLLanguage wbxml_lang)
+{
+ Protocol protocol = PROTOCOL_UNKNOWN;
+
+ switch (wbxml_lang) {
+ case WBXML_LANG_SYNCML_SYNCML10:
+ protocol = PROTOCOL_SYNCML_SYNCML10;
+ break;
+ case WBXML_LANG_SYNCML_SYNCML11:
+ protocol = PROTOCOL_SYNCML_SYNCML11;
+ break;
+ case WBXML_LANG_SYNCML_SYNCML12:
+ protocol = PROTOCOL_SYNCML_SYNCML12;
+ break;
+ case WBXML_LANG_SYNCML_DEVINF10:
+ protocol = PROTOCOL_SYNCML_DEVINF10;
+ break;
+ case WBXML_LANG_SYNCML_DEVINF11:
+ protocol = PROTOCOL_SYNCML_DEVINF11;
+ break;
+ case WBXML_LANG_SYNCML_DEVINF12:
+ protocol = PROTOCOL_SYNCML_DEVINF12;
+ break;
+ case WBXML_LANG_SYNCML_METINF10:
+ protocol = PROTOCOL_SYNCML_METINF10;
+ break;
+ case WBXML_LANG_SYNCML_METINF11:
+ protocol = PROTOCOL_SYNCML_METINF11;
+ break;
+ case WBXML_LANG_SYNCML_METINF12:
+ protocol = PROTOCOL_SYNCML_METINF12;
+ break;
+ case WBXML_LANG_SYNCML_DMDDF12:
+ protocol = PROTOCOL_SYNCML_DMDDF12;
+ break;
+ case WBXML_LANG_ACTIVESYNC:
+ protocol = PROTOCOL_ACTIVESYNC;
+ break;
+ case WBXML_LANG_PROV10:
+ protocol = PROTOCOL_PROV10;
+ break;
+ default:
+ break;
+ }
+
+ return protocol;
+}
+
+WBXMLVersion get_wbxml_version(Encoding enc)
+{
+ WBXMLVersion version = WBXML_VERSION_UNKNOWN;
+ switch (enc) {
+ case ENCODING_WBXML_10:
+ version = WBXML_VERSION_10;
+ break;
+ case ENCODING_WBXML_11:
+ version = WBXML_VERSION_11;
+ break;
+ case ENCODING_WBXML_12:
+ version = WBXML_VERSION_12;
+ break;
+ case ENCODING_WBXML_13:
+ version = WBXML_VERSION_13;
+ break;
+ default:
+ break;
+ }
+
+ return version;
+}
+
+WBXMLTreeNode *get_next_node_of_tree_node(WBXMLTreeNode *node, bool *first_visit)
+{
+ WBXMLTreeNode *next_node = NULL;
+
+ if (*first_visit) {
+ /* *first_visit = true; */
+
+ /* get tree node */
+ next_node = node->tree->root;
+
+ /* if child node does not exist, then mark second visit and set current_node as next_node */
+ if (next_node == NULL) {
+ *first_visit = false;
+ next_node = node;
+ }
+ } else {
+ next_node = node->next;
+
+ /* if next node exist */
+ if (next_node != NULL) {
+ *first_visit = true;
+ }
+ /* if next node does not exist, then set next node as parent node */
+ else {
+ /* *first_visit = false; */
+ next_node = node->parent;
+ }
+ }
+
+ return next_node;
+}
+
+WBXMLTreeNode *get_next_node_of_element_node(WBXMLTreeNode *node, bool *first_visit)
+{
+ WBXMLTreeNode *next_node = NULL;
+
+ if (*first_visit) {
+ /* *first_visit = true; */
+
+ /* get child node */
+ next_node = node->children;
+
+ /* if child node does not exist, then mark second visit and set current_node as next_node */
+ if (next_node == NULL) {
+ *first_visit = false;
+ next_node = node;
+ }
+ } else {
+ next_node = node->next;
+
+ /* if next node exist */
+ if (next_node != NULL) {
+ *first_visit = true;
+ }
+ /* if next node does not exist, then set next node as parent node */
+ else {
+ /* *first_visit = false; */
+ next_node = node->parent;
+ }
+ }
+
+ return next_node;
+}
+
+const WBXMLLangEntry *get_current_subtree_lang(Reverse_protocol_binder *pReverse_binder)
+{
+ const WBXMLLangEntry *pLang = NULL;
+
+ if (pReverse_binder->tree_stack != NULL) {
+ /* current node belongs to subtree of root tree */
+ WBXMLTreeNode *tree_node = (WBXMLTreeNode *)(pReverse_binder->tree_stack->data);
+ assert(tree_node != NULL);
+ assert(has_wbxml_node_same_type(tree_node, WBXML_TREE_TREE_NODE));
+
+ pLang = tree_node->tree->lang;
+ } else {
+ pLang = pReverse_binder->tree->lang;
+ }
+
+ return pLang;
+}
+
+bool has_wbxml_node_same_type(WBXMLTreeNode *node, WBXMLTreeNodeType type)
+{
+ bool ret = false;
+ if (node->type == type) {
+ ret = true;
+ }
+ return ret;
+}
+
+void print_wbxml_dom_in_xml(const WBXMLTree *tree)
+{
+ FW_LOGD("started\n");
+ /* debugging */
+ unsigned char *xml = NULL;
+ unsigned int xml_len = 0;
+ WBXMLGenXMLParams params = { WBXML_GEN_XML_INDENT, WBXML_LANG_UNKNOWN, WBXML_CHARSET_UNKNOWN, 4, FALSE };
+ WBXMLError wbxml_err = wbxml_tree_to_xml((WBXMLTree *)tree, &xml, &xml_len, &params);
+
+ if (wbxml_err != WBXML_OK) {
+ /* TODO : FW_LOGE using wbxml_errors_string(wbxml_err) */
+ return;
+ }
+
+ FW_LOGD("xml printing : \n%s\n", xml);
+ if (xml != NULL) {
+ free(xml);
+ }
+
+ FW_LOGD("ended\n");
+}
diff --git a/framework/src/PlatformMonitor/EXT_PMCI.c b/framework/src/PlatformMonitor/EXT_PMCI.c
new file mode 100755
index 0000000..542af88
--- /dev/null
+++ b/framework/src/PlatformMonitor/EXT_PMCI.c
@@ -0,0 +1,388 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#include "Utility/fw_log.h"
+#include "PlatformMonitor/EXT_PMCI.h"
+#include "PlugIn/PlugIn_PlatformMonitor.h"
+#include "Utility/fw_mainloop.h"
+
+#define LOG_TAG "AF_PMCI"
+
+PMCI_RETURN PMCI_Destroy_Default_Noti_Types(int pm_plugIn_id)
+{
+ FW_LOGV("Start !! \n");
+
+ PMCI_RETURN res = PMCI_SUCCESS;
+
+ /* 1. terminate network status */
+ Terminate_Network_Status_Noti_Handler pFunc_Terminate_NS_Noti_Handler = getFunction_PlatformMonitor_Terminate_Network_Status_Noti_Handler(pm_plugIn_id);
+
+ if (pFunc_Terminate_NS_Noti_Handler == 0) {
+ FW_LOGV("cannot get pFunc_Terminate_NS_Noti_Handler !! \n");
+ res = PMCI_FAIL;
+ return res;
+ }
+
+ int err = pFunc_Terminate_NS_Noti_Handler();
+ if (err != 1) {
+ FW_LOGE("fail !!\n");
+ res = PMCI_FAIL;
+ } else {
+ FW_LOGV("success !! \n");
+ }
+
+ FW_LOGV("End !!\n");
+ return res;
+}
+
+PMCI_RETURN PMCI_Init_Specific_Type(int pm_plugIn_id, FW_SERVICE_NOTI_TYPE noti_type, const char *pkg_name, const char *user_data, int callback_cnt, ...)
+{
+ FW_LOGV("Start !!");
+
+ PMCI_RETURN res = PMCI_SUCCESS;
+
+ va_list list;
+ va_start(list, callback_cnt);
+ int i = 0;
+
+ switch (noti_type) {
+ case NETWORK:
+ {
+ FW_LOGV("noti_type = NETWORK");
+
+ for (; i < callback_cnt; i++) {
+ switch (i) {
+ case 0:
+ {
+ FW_LOGV("SetCallBack_Network_On() !!");
+ SetCallBack_Network_On pFunc_SetCallBack_Network_On = getFunction_PlatformMonitor_SetCallBack_Network_On(pm_plugIn_id);
+ if (pFunc_SetCallBack_Network_On == 0) {
+ FW_LOGE("cannot get pFunc_SetCallBack_Network_On !!");
+ res = PMCI_FAIL;
+ goto return_part;
+ }
+
+ pFunc_SetCallBack_Network_On(va_arg(list, SPECIFIC_TYPE_CALLBACK));
+ }
+ break;
+ case 1:
+ {
+ FW_LOGV("SetCallBack_Network_Off() !!");
+ SetCallBack_Network_Off pFunc_SetCallBack_Network_Off = getFunction_PlatformMonitor_SetCallBack_Network_Off(pm_plugIn_id);
+ if (pFunc_SetCallBack_Network_Off == 0) {
+ FW_LOGE("cannot get pFunc_SetCallBack_Network_Off !!");
+ res = PMCI_FAIL;
+ goto return_part;
+ }
+
+ pFunc_SetCallBack_Network_Off(va_arg(list, SPECIFIC_TYPE_CALLBACK));
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ break;
+ case SAN:
+ {
+ FW_LOGV("noti_type = SAN");
+
+ for (; i < callback_cnt; i++) {
+ switch (i) {
+ case 0:
+ {
+ FW_LOGV("SetCallBack_Syncml_SAN_Incoming() !!");
+ SetCallBack_Syncml_SAN_Incoming pFunc_SetCallBack_SAN_Incoming = getFunction_PlatformMonitor_SetCallBack_Syncml_SAN_Incoming(pm_plugIn_id);
+ if (pFunc_SetCallBack_SAN_Incoming == 0) {
+ FW_LOGE("cannot get pFunc_SetCallBack_SAN_Incoming !!");
+ res = PMCI_FAIL;
+ goto return_part;
+ }
+
+ pFunc_SetCallBack_SAN_Incoming(va_arg(list, SPECIFIC_TYPE_CALLBACK));
+ }
+ break;
+ case 1:
+ {
+ FW_LOGV("SetCallBack_Syncml_SAN_Operation() !!");
+ SetCallBack_Syncml_SAN_Operation pFunc_SetCallBack_SAN_operation = getFunction_PlatformMonitor_SetCallBack_Syncml_SAN_Operation(pm_plugIn_id);
+ if (pFunc_SetCallBack_SAN_operation == 0) {
+ FW_LOGE("cannot get pFunc_SetCallBack_SAN_operation !!");
+ res = PMCI_FAIL;
+ goto return_part;
+ }
+
+ pFunc_SetCallBack_SAN_operation(va_arg(list, SPECIFIC_TYPE_CALLBACK));
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ break;
+ case ALARM:
+ {
+ FW_LOGV("noti_type = ALARM");
+
+ for (; i < callback_cnt; i++) {
+ switch (i) {
+ case 0:
+ {
+ SetCallBack_Alarm pFunc_SetCallBack_Alarm = getFunction_PlatformMonitor_SetCallBack_Alarm(pm_plugIn_id);
+ if (pFunc_SetCallBack_Alarm == 0) {
+ FW_LOGE("cannot get pFunc_SetCallBack_Alarm !!");
+ goto return_part;
+ }
+
+ pFunc_SetCallBack_Alarm(va_arg(list, SPECIFIC_TYPE_CALLBACK));
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ break;
+ default:
+ {
+ FW_LOGV("Can not access this line");
+ res = PMCI_FAIL;
+ goto return_part;
+ }
+ break;
+ }
+
+return_part:
+ va_end(list);
+
+ FW_LOGV("End !!");
+ return res;
+}
+
+PMCI_RETURN PMCI_Destory_Specific_Type(int pm_plugIn_id, FW_SERVICE_NOTI_TYPE noti_type)
+{
+ FW_LOGV("Start !! \n");
+
+ PMCI_RETURN res = PMCI_SUCCESS;
+ int err = 1;
+
+ switch (noti_type) {
+ case SAN:
+ {
+ FW_LOGV("noti_type = SAN\n");
+ Terminate_Syncml_SAN_Noti_Handler pFunc_Terminate_SAN_Noti_Handler = getFunction_PlatformMonitor_Terminate_Symcml_SAN_Noti_Handler(pm_plugIn_id);
+ if (pFunc_Terminate_SAN_Noti_Handler == 0) {
+ FW_LOGE("cannot get pFunc_Terminate_SAN_Noti_Handler !! \n");
+ res = PMCI_FAIL;
+ return res;
+ }
+
+ err = pFunc_Terminate_SAN_Noti_Handler();
+ }
+ break;
+ case ALARM:
+ {
+ FW_LOGV("noti_type = ALARM\n");
+ Terminate_Alarm_Noti_Handler pFunc_Terminate_Alarm_Noti_Handler = getFunction_PlatformMonitor_Terminate_Alarm_Noti_Handler(pm_plugIn_id);
+ if (pFunc_Terminate_Alarm_Noti_Handler == 0) {
+ FW_LOGV("cannot get pFunc_Terminate_Alarm_Noti_Handler !! \n");
+ res = PMCI_FAIL;
+ return res;
+ }
+ }
+ break;
+ default:
+ FW_LOGV("Can not access this line");
+ return PMCI_FAIL;
+ break;
+ }
+
+ if (err != 1) {
+ FW_LOGE("fail !!\n");
+ res = PMCI_FAIL;
+ } else {
+ FW_LOGV("success !! \n");
+ }
+
+ FW_LOGV("End !!\n");
+ return res;
+}
+
+PMCI_RETURN PMCI_Add_Item_To_Specific_Type(int pm_plugIn_id, FW_SERVICE_NOTI_TYPE noti_type, void *add_item, int *out_add_item_id)
+{
+ FW_LOGV("Start !! \n");
+
+ PMCI_RETURN res = PMCI_SUCCESS;
+ int err = 1;
+
+ switch (noti_type) {
+ case SAN:
+ {
+ FW_LOGV("noti_type = SAN\n");
+ Add_Message pFunc_Add_Message = getFunction_PlatformMonitor_Add_Message(pm_plugIn_id);
+ if (pFunc_Add_Message == 0) {
+ FW_LOGE("cannot get pFunc_Add_Message !!");
+ res = PMCI_FAIL;
+ return res;
+ }
+
+ err = pFunc_Add_Message(add_item);
+ }
+ break;
+ case ALARM:
+ {
+ FW_LOGV("noti_type = ALARM\n");
+ Add_Alarm pFunc_Add_Alarm = getFunction_PlatformMonitor_Add_Alarm(pm_plugIn_id);
+ if (pFunc_Add_Alarm == 0) {
+ FW_LOGV("cannot get pFunc_Add_Alarm !! \n");
+ res = PMCI_FAIL;
+ return res;
+ }
+
+ err = pFunc_Add_Alarm(add_item, out_add_item_id);
+ }
+ break;
+ default:
+ FW_LOGV("Can not access this line");
+ return PMCI_FAIL;
+ break;
+ }
+
+ if (err != 1) {
+ FW_LOGE("fail !!\n");
+ res = PMCI_FAIL;
+ } else {
+ FW_LOGV("success !! \n");
+ }
+
+ FW_LOGV("End !!\n");
+ return res;
+}
+
+PMCI_RETURN PMCI_Remove_Item_To_Specific_Type(int pm_plugIn_id, FW_SERVICE_NOTI_TYPE noti_type, int remove_item_id)
+{
+ FW_LOGV("Start !! \n");
+
+ PMCI_RETURN res = PMCI_SUCCESS;
+ int err = 1;
+
+ switch (noti_type) {
+ case SAN:
+ {
+ FW_LOGV("noti_type = SAN\n");
+ Remove_Message pFunc_Remove_Message = getFunction_PlatformMonitor_Remove_Message(pm_plugIn_id);
+ if (pFunc_Remove_Message == 0) {
+ FW_LOGE("cannot get pFunc_Remove_Message !!");
+ res = PMCI_FAIL;
+ return res;
+ }
+
+ err = pFunc_Remove_Message(remove_item_id);
+ }
+ break;
+ case ALARM:
+ {
+ FW_LOGV("noti_type = ALARM\n");
+ Remove_Alarm pFunc_Remove_Alarm = getFunction_PlatformMonitor_Remove_Alarm(pm_plugIn_id);
+ if (pFunc_Remove_Alarm == 0) {
+ FW_LOGV("cannot get pFunc_Remove_Alarm !! \n");
+ res = PMCI_FAIL;
+ return res;
+ }
+
+ err = pFunc_Remove_Alarm(remove_item_id);
+ }
+ break;
+ default:
+ FW_LOGV("Can not access this line");
+ return PMCI_FAIL;
+ break;
+ }
+
+ if (err != 1) {
+ FW_LOGE("fail !!\n");
+ res = PMCI_FAIL;
+ } else {
+ FW_LOGV("success !! \n");
+ }
+
+ FW_LOGV("End !!\n");
+ return res;
+}
+
+PMCI_RETURN PMCI_Get_Item_To_Specific_Type(int pm_plugIn_id, FW_SERVICE_NOTI_TYPE noti_type, int get_item_id, void **out_get_item)
+{
+ FW_LOGV("Start !! \n");
+
+ PMCI_RETURN res = PMCI_SUCCESS;
+ int err = 1;
+
+ switch (noti_type) {
+ case SAN:
+ {
+ FW_LOGV("noti_type = SAN\n");
+ }
+ break;
+ case ALARM:
+ {
+ FW_LOGV("noti_type = ALARM\n");
+ Get_Alarm pFunc_Get_Alarm = getFunction_PlatformMonitor_Get_Alarm(pm_plugIn_id);
+ if (pFunc_Get_Alarm == 0) {
+ FW_LOGV("cannot get pFunc_Get_Alarm !! \n");
+ res = PMCI_FAIL;
+ return res;
+ }
+
+ err = pFunc_Get_Alarm(get_item_id, out_get_item);
+ }
+ break;
+ default:
+ FW_LOGV("Can not access this line");
+ return PMCI_FAIL;
+ break;
+ }
+
+ if (err != 1) {
+ FW_LOGE("fail !!\n");
+ res = PMCI_FAIL;
+ } else {
+ FW_LOGV("success !! \n");
+ }
+
+ FW_LOGV("End !!\n");
+ return res;
+}
diff --git a/framework/src/PlugIn/PlugIn_Account.c b/framework/src/PlugIn/PlugIn_Account.c
new file mode 100755
index 0000000..ae56a5e
--- /dev/null
+++ b/framework/src/PlugIn/PlugIn_Account.c
@@ -0,0 +1,163 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ */
+
+#include <dlfcn.h>
+
+#include "Utility/fw_log.h"
+#include "PlugIn/PlugIn_Account.h"
+
+#define LOG_TAG "AF_PlugIn"
+
+static int isExistPlugIn = 0;
+
+static PlugIn_Account plugIn_repository; /* singleton */
+
+Account_Func_Set getAccount_Func_Set(void *plugIn_handle, PLUGIN_ERROR * error_code)
+{
+ *error_code = PLUGIN_SUCCESS;
+
+ Account_Func_Set func_Set;
+
+ func_Set.pFunc_Set_AccountReposioryName = dlsym(plugIn_handle, "Set_AccountReposioryName");
+ func_Set.pFunc_Add_PlatformAccount = dlsym(plugIn_handle, "Add_PlatformAccount");
+ func_Set.pFunc_Set_PlatformAccount_Service = dlsym(plugIn_handle, "Set_PlatformAccount_Service");
+ func_Set.pFunc_Del_PlatformAccount = dlsym(plugIn_handle, "Del_PlatformAccount");
+ func_Set.pFunc_Del_PlatformAccount_Service = dlsym(plugIn_handle, "Del_PlatformAccount_Service");
+ func_Set.pFunc_Has_PlatformAccount_Service = dlsym(plugIn_handle, "Has_PlatformAccount_Service");
+ func_Set.pFunc_Get_Service_AccountID = dlsym(plugIn_handle, "Get_Service_AccountID");
+ func_Set.pFunc_Get_FW_AccountID = dlsym(plugIn_handle, "Get_FW_AccountID");
+ func_Set.pFunc_Get_Service_AccountInfo = dlsym(plugIn_handle, "Get_Service_AccountInfo");
+
+ return func_Set;
+}
+
+PLUGIN_ERROR registerPlugIn_Account(PlugIn_Account plugIn)
+{
+ plugIn_repository = plugIn;
+
+ isExistPlugIn = 1;
+
+ return PLUGIN_SUCCESS;
+}
+
+int getAccount_PlugIn_ID()
+{
+ if (isExistPlugIn) {
+ return plugIn_repository.plugIn_info.plugIn_id;
+ }
+
+ return -1;
+}
+
+Set_AccountReposioryName getFunction_Set_AccountReposioryName(int plugIn_id)
+{
+ if (isExistPlugIn) {
+ return plugIn_repository.func_Set.pFunc_Set_AccountReposioryName;
+ }
+
+ return 0;
+}
+
+Add_PlatformAccount getFunction_Account_Add_PlatformAccount(int plugIn_id)
+{
+ if (isExistPlugIn) {
+ return plugIn_repository.func_Set.pFunc_Add_PlatformAccount;
+ }
+
+ return 0;
+}
+
+Set_PlatformAccount_Service getFunction_Set_PlatformAccount_Service(int plugIn_id)
+{
+ if (isExistPlugIn) {
+ return plugIn_repository.func_Set.pFunc_Set_PlatformAccount_Service;
+ }
+
+ return 0;
+}
+
+Del_PlatformAccount getFunction_Account_Del_PlatformAccount(int plugIn_id)
+{
+ if (isExistPlugIn) {
+ return plugIn_repository.func_Set.pFunc_Del_PlatformAccount;
+ }
+
+ return 0;
+}
+
+Del_PlatformAccount_Service getFunction_Account_Del_PlatformAccount_Service(int plugIn_id)
+{
+ if (isExistPlugIn) {
+ return plugIn_repository.func_Set.pFunc_Del_PlatformAccount_Service;
+ }
+
+ return 0;
+}
+
+Has_PlatformAccount_Service getFunction_Account_Has_PlatformAccount_Service(int plugIn_id)
+{
+ if (isExistPlugIn) {
+ return plugIn_repository.func_Set.pFunc_Has_PlatformAccount_Service;
+ }
+
+ return 0;
+}
+
+Get_Service_AccountID getFunction_Account_Get_Service_AccountID(int plugIn_id)
+{
+ if (isExistPlugIn) {
+ return plugIn_repository.func_Set.pFunc_Get_Service_AccountID;
+ }
+
+ return 0;
+}
+
+Get_FW_AccountID getFunction_Account_Get_FW_AccountID(int plugIn_id)
+{
+ if (isExistPlugIn) {
+ return plugIn_repository.func_Set.pFunc_Get_FW_AccountID;
+ }
+
+ return 0;
+}
+
+Get_Service_AccountInfo getFunction_Get_Service_AccountInfo(int plugIn_id)
+{
+ if (isExistPlugIn) {
+ return plugIn_repository.func_Set.pFunc_Get_Service_AccountInfo;
+ }
+
+ return 0;
+}
diff --git a/framework/src/PlugIn/PlugIn_DataConnector.c b/framework/src/PlugIn/PlugIn_DataConnector.c
new file mode 100755
index 0000000..91dece9
--- /dev/null
+++ b/framework/src/PlugIn/PlugIn_DataConnector.c
@@ -0,0 +1,482 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ */
+
+#include <dlfcn.h>
+#include <string.h>
+
+#include "Utility/fw_log.h"
+#include "PlugIn/PlugIn_DataConnector.h"
+
+#define LOG_TAG "AF_PlugIn"
+
+static int current_PlugIn_count_DataConnector = 0;
+
+static PlugIn_DataConnector plugIn_repository[MAX_PLUGIN_DATACONNECTOR];
+
+static int __findPlugIn_DataConnector(int plugIn_id);
+
+DataConnector_Func_Set getDataConnector_Func_Set(void *plugIn_handle, PLUGIN_ERROR * error_code)
+{
+ *error_code = PLUGIN_SUCCESS;
+
+ DataConnector_Func_Set func_Set;
+
+ func_Set.pFunc_Service_Open = dlsym(plugIn_handle, "Service_Open");
+ func_Set.pFunc_Service_Close = dlsym(plugIn_handle, "Service_Close");
+ func_Set.pFunc_Begin_Transaction = dlsym(plugIn_handle, "Begin_Transaction");
+ func_Set.pFunc_End_Transaction = dlsym(plugIn_handle, "End_Transaction");
+ func_Set.pFunc_ADD_ITEM = dlsym(plugIn_handle, "Add_Item");
+ func_Set.pFunc_UPDATE_ITEM = dlsym(plugIn_handle, "Update_Item");
+ func_Set.pFunc_DEL_ITEM = dlsym(plugIn_handle, "Del_Item");
+ func_Set.pFunc_DEL_ALL_ITEMS = dlsym(plugIn_handle, "Del_All_Items");
+ func_Set.pFunc_GET_ITEM = dlsym(plugIn_handle, "Get_Item");
+ func_Set.pFunc_ADD_FOLDER = dlsym(plugIn_handle, "Add_Folder");
+ func_Set.pFunc_DEL_FOLDER = dlsym(plugIn_handle, "Del_Folder");
+ func_Set.pFunc_GET_FOLDER = dlsym(plugIn_handle, "Get_Folder");
+ func_Set.pFunc_EXECUTE = dlsym(plugIn_handle, "Execute");
+ func_Set.pFunc_GET_USED_ITEM_CNT = dlsym(plugIn_handle, "Get_Used_Item_Count");
+ func_Set.pFunc_GET_USED_CNT_FOR_FOLDER = dlsym(plugIn_handle, "Get_Used_Item_Count_For_Folder");
+ func_Set.pFunc_GET_FOLDER_ID_LIST = dlsym(plugIn_handle, "Get_Folder_ID_List");
+ func_Set.pFunc_GET_ACCOUNT_ID_LIST = dlsym(plugIn_handle, "Get_Account_ID_List");
+ func_Set.pFunc_WRITE_ITEMS_TO_FILE = dlsym(plugIn_handle, "Write_Items_To_File");
+ func_Set.pFunc_ADD_FILE_WROTE_ITEMS_TO_DATASTORE = dlsym(plugIn_handle, "Add_File_Wrote_Items_To_Datastore");
+ func_Set.pFunc_GET_CHANED_ITEM_FOR_FOLDER_ADD = dlsym(plugIn_handle, "Get_Changed_ITEM_For_Folder_Add");
+ func_Set.pFunc_GET_CHANED_ITEM_FOR_FOLDER_DEL = dlsym(plugIn_handle, "Get_Changed_ITEM_For_Folder_Del");
+ func_Set.pFunc_GET_CHANED_ITEM_FOR_FOLDER_UPDATE = dlsym(plugIn_handle, "Get_Changed_ITEM_For_Folder_Update");
+ func_Set.pFunc_GET_LAST_CHANGEPOINT = dlsym(plugIn_handle, "Get_Last_ChangePoint");
+ func_Set.pFunc_StartListening_ChangeNoti = dlsym(plugIn_handle, "StartListening_ChangeNoti");
+ func_Set.pFunc_SetCallBack_AddItem = dlsym(plugIn_handle, "SetCallBack_AddItem");
+ func_Set.pFunc_setCallBack_DeleteItem = dlsym(plugIn_handle, "SetCallBack_DeleteItem");
+ func_Set.pFunc_setCallBack_UpdateItem = dlsym(plugIn_handle, "SetCallBack_UpdateItem");
+ func_Set.pFunc_SetCallBack_GetAccountIDList = dlsym(plugIn_handle, "SetCallBack_GetAccountIDList");
+ func_Set.pFunc_GET_MAX_ITEM_COUNT = dlsym(plugIn_handle, "Get_MAX_Item_Count");
+ func_Set.pFunc_GET_MAX_FIELD_LENGTH = dlsym(plugIn_handle, "Get_MAX_Field_Length");
+ func_Set.pFunc_GET_MAX_FIELD_COUNT = dlsym(plugIn_handle, "Get_MAX_Field_Count");
+ func_Set.pFunc_GET_FIELD_VALUE = dlsym(plugIn_handle, "Get_Field_Value");
+ func_Set.pFunc_GET_IS_SUPPORT_FEATURE = dlsym(plugIn_handle, "Get_Is_Support_Feature");
+
+ return func_Set;
+}
+
+PLUGIN_ERROR registerPlugIn_DataConnector(PlugIn_DataConnector plugIn)
+{
+ if (current_PlugIn_count_DataConnector >= MAX_PLUGIN_DATACONNECTOR) {
+ return PLUGIN_FULL_CAPACITY;
+ }
+
+ plugIn_repository[current_PlugIn_count_DataConnector] = plugIn;
+
+ current_PlugIn_count_DataConnector++;
+
+ return PLUGIN_SUCCESS;
+}
+
+const PlugIn_DataConnector *getDataConnector_PlugInRepository(int *count)
+{
+ *count = current_PlugIn_count_DataConnector;
+
+ return plugIn_repository;
+}
+
+int getDataConverter_PlugIn_ID(int dc_plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(dc_plugIn_id);
+ if (index == -1) {
+ return -1;
+ }
+
+ return plugIn_repository[index].data_converter_id;
+}
+
+int *get_DataConnector_PlugIn_ID_List(int *count)
+{
+ int *dc_plugin_id_list = 0;
+ *count = 0;
+
+ if (current_PlugIn_count_DataConnector > 0) {
+ *count = current_PlugIn_count_DataConnector;
+ dc_plugin_id_list = (int *)calloc(current_PlugIn_count_DataConnector, sizeof(int));
+ int i = 0;
+ for (; i < current_PlugIn_count_DataConnector; i++) {
+ dc_plugin_id_list[i] = plugIn_repository[i].plugIn_info.plugIn_id;
+ }
+ }
+
+ return dc_plugin_id_list;
+}
+
+Service_Open getFunction_DataConnector_Service_Open(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_Service_Open;
+}
+
+Service_Close getFunction_DataConnector_Service_Close(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_Service_Close;
+}
+
+Begin_Transaction getFunction_DataConnector_Begin_Transaction(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_Begin_Transaction;
+}
+
+End_Transaction getFunction_DataConnector_End_Transaction(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_End_Transaction;
+}
+
+ADD_ITEM getFunction_DataConnector_ADD_ITEM(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_ADD_ITEM;
+}
+
+UPDATE_ITEM getFunction_DataConnector_UPDATE_ITEM(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_UPDATE_ITEM;
+}
+
+DEL_ITEM getFunction_DataConnector_DEL_ITEM(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_DEL_ITEM;
+}
+
+DEL_ALL_ITEMS getFunction_DataConnector_DEL_ALL_ITEMS(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_DEL_ALL_ITEMS;
+}
+
+GET_ITEM getFunction_DataConnector_GET_ITEM(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_GET_ITEM;
+}
+
+ADD_FOLDER getFunction_DataConnector_ADD_FOLDER(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_ADD_FOLDER;
+}
+
+DEL_FOLDER getFunction_DataConnector_DEL_FOLDER(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_DEL_FOLDER;
+}
+
+GET_FOLDER getFunction_DataConnector_GET_FOLDER(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_GET_FOLDER;
+}
+
+EXECUTE getFunction_DataConnector_EXECUTE(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_EXECUTE;
+}
+
+GET_USED_ITEM_COUNT getFunction_DataConnector_GET_USED_ITEM_COUNT(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_GET_USED_ITEM_CNT;
+
+}
+
+GET_USED_COUNT_FOR_FOLDER getFunction_DataConnector_GET_USED_COUNT_FOR_FOLDER(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_GET_USED_CNT_FOR_FOLDER;
+
+}
+
+GET_FOLDER_ID_LIST getFunction_DataConnector_GET_FOLDER_ID_LIST(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_GET_FOLDER_ID_LIST;
+}
+
+GET_ACCOUNT_ID_LIST getFunction_DataConnector_GET_ACCOUNT_ID_LIST(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_GET_ACCOUNT_ID_LIST;
+}
+
+WRITE_ITEMS_TO_FILE getFunction_DataConnector_WRITE_ITEMS_TO_FILE(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_WRITE_ITEMS_TO_FILE;
+}
+
+ADD_FILE_WROTE_ITEMS_TO_DATASTORE getFunction_DataConnector_ADD_FILE_WROTE_ITEM_TO_DATASTORE(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_ADD_FILE_WROTE_ITEMS_TO_DATASTORE;
+}
+
+GET_CHANED_ITEM_FOR_FOLDER_ADD getFunction_DataConnector_GET_CHANED_ITEM_FOR_FOLDER_ADD(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_GET_CHANED_ITEM_FOR_FOLDER_ADD;
+}
+
+GET_CHANED_ITEM_FOR_FOLDER_DEL getFunction_DataConnector_GET_CHANED_ITEM_FOR_FOLDER_DEL(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_GET_CHANED_ITEM_FOR_FOLDER_DEL;
+}
+
+GET_CHANED_ITEM_FOR_FOLDER_UPDATE getFunction_DataConnector_GET_CHANED_ITEM_FOR_FOLDER_UPDATE(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_GET_CHANED_ITEM_FOR_FOLDER_UPDATE;
+}
+
+GET_LAST_CHANGEPOINT getFunction_DataConnector_GET_LAST_CHANGEPOINT(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_GET_LAST_CHANGEPOINT;
+}
+
+StartListening_ChangeNoti getFunction_DataConnector_StartListening_ChangeNoti(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_StartListening_ChangeNoti;
+}
+
+SetCallBack_AddItem getFunction_DataConnector_SetCallBack_AddItem(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_SetCallBack_AddItem;
+}
+
+SetCallBack_DeleteItem getFunction_DataConnector_SetCallBack_DeleteItem(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_setCallBack_DeleteItem;
+}
+
+SetCallBack_UpdateItem getFunction_DataConnector_SetCallBack_UpdateItem(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_setCallBack_UpdateItem;
+}
+
+SetCallBack_GetAccountIDList getFunction_DataConnector_SetCallBack_GetAccountIDList(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_SetCallBack_GetAccountIDList;
+}
+
+GET_MAX_ITEM_COUNT getFunction_DataConnector_GET_MAX_ITEM_COUNT(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_GET_MAX_ITEM_COUNT;
+}
+
+GET_MAX_FIELD_LENGTH getFunction_DataConnector_GET_MAX_FIELD_LENGTH(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_GET_MAX_FIELD_LENGTH;
+}
+
+GET_MAX_FIELD_COUNT getFunction_DataConnector_GET_MAX_FIELD_COUNT(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_GET_MAX_FIELD_COUNT;
+}
+
+GET_FIELD_VALUE getFunction_DataConnector_GET_FIELD_VALUE(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_GET_FIELD_VALUE;
+}
+
+GET_IS_SUPPORT_FEATURE getFunction_DataConnector_GET_IS_SUPPORT_FEATURE(int plugIn_id)
+{
+ int index = __findPlugIn_DataConnector(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_set.pFunc_GET_IS_SUPPORT_FEATURE;
+}
+
+static int __findPlugIn_DataConnector(int plugIn_id)
+{
+ int i = 0;
+ for (; i < current_PlugIn_count_DataConnector; i++) {
+ if (plugIn_repository[i].plugIn_info.plugIn_id == plugIn_id) {
+ return i;
+ }
+ }
+
+ return -1;
+}
diff --git a/framework/src/PlugIn/PlugIn_DataConverter.c b/framework/src/PlugIn/PlugIn_DataConverter.c
new file mode 100755
index 0000000..e91021a
--- /dev/null
+++ b/framework/src/PlugIn/PlugIn_DataConverter.c
@@ -0,0 +1,181 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ */
+
+#include <dlfcn.h>
+
+#include "Utility/fw_log.h"
+#include "PlugIn/PlugIn_DataConverter.h"
+
+#define LOG_TAG "AF_PlugIn"
+
+static int current_PlugIn_count_DataConverter = 0;
+
+static PlugIn_DataConverter plugIn_repository[MAX_PLUGIN_DATACONVERTER];
+
+static int __findPlugIn_DataConverter(int plugIn_id);
+
+DataConverter_Func_Set getDataConverter_Func_Set(void *plugIn_handle, PLUGIN_ERROR * error_code)
+{
+ *error_code = PLUGIN_SUCCESS;
+
+ DataConverter_Func_Set func_Set;
+
+ func_Set.pFunc_Converter = dlsym(plugIn_handle, "Converter");
+ func_Set.pFunc_Replace_Converter = dlsym(plugIn_handle, "Replace_Converter");
+ func_Set.pFunc_Reverse_Converter = dlsym(plugIn_handle, "Reverse_Converter");
+ func_Set.pFunc_Alloc_Object = dlsym(plugIn_handle, "Alloc_Object");
+ func_Set.pFunc_Free_Object = dlsym(plugIn_handle, "Free_Object");
+ func_Set.pFunc_Set_Value = dlsym(plugIn_handle, "Set_Value_To_Object");
+ func_Set.pFunc_Get_Value = dlsym(plugIn_handle, "Get_Value_To_Object");
+ func_Set.pFunc_Get_Obj_Info = dlsym(plugIn_handle, "Get_Obj_Info");
+ func_Set.pFunc_Free_Obj_Info = dlsym(plugIn_handle, "Free_Obj_Info");
+
+ return func_Set;
+}
+
+PLUGIN_ERROR registerPlugIn_DataConverter(PlugIn_DataConverter plugIn)
+{
+ if (current_PlugIn_count_DataConverter >= MAX_PLUGIN_DATACONVERTER) {
+ return PLUGIN_FULL_CAPACITY;
+ }
+
+ plugIn_repository[current_PlugIn_count_DataConverter] = plugIn;
+
+ current_PlugIn_count_DataConverter++;
+
+ return PLUGIN_SUCCESS;
+}
+
+Converter getFunction_DataConverter_Converter(int plugIn_id)
+{
+ int index = __findPlugIn_DataConverter(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Converter;
+}
+
+Replace_Converter getFunction_DataConverter_Replace_Converter(int plugIn_id)
+{
+ int index = __findPlugIn_DataConverter(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Replace_Converter;
+}
+
+Reverse_Converter getFunction_DataConverter_Reverse_Converter(int plugIn_id)
+{
+ int index = __findPlugIn_DataConverter(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Reverse_Converter;
+}
+
+Alloc_Object getFunction_DataConverter_Alloc_Object(int plugIn_id)
+{
+ int index = __findPlugIn_DataConverter(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Alloc_Object;
+}
+
+Free_Object getFunction_DataConverter_Free_Object(int plugIn_id)
+{
+ int index = __findPlugIn_DataConverter(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Free_Object;
+}
+
+Set_Value getFunction_DataConverter_Set_Value_To_Object(int plugIn_id)
+{
+ int index = __findPlugIn_DataConverter(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Set_Value;
+}
+
+Get_Value getFunction_DataConverter_Get_Value_To_Object(int plugIn_id)
+{
+ int index = __findPlugIn_DataConverter(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Get_Value;
+}
+
+Get_Obj_Info getFunction_DataConverter_Get_Obj_Info(int plugIn_id)
+{
+ int index = __findPlugIn_DataConverter(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Get_Obj_Info;
+}
+
+Free_Obj_Info getFunction_DataConverter_Free_Obj_Info(int plugIn_id)
+{
+ int index = __findPlugIn_DataConverter(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Free_Obj_Info;
+}
+
+static int __findPlugIn_DataConverter(int plugIn_id)
+{
+ int i = 0;
+ for (; i < current_PlugIn_count_DataConverter; i++) {
+ if (plugIn_repository[i].plugIn_info.plugIn_id == plugIn_id) {
+ return i;
+ }
+ }
+
+ return -1;
+}
diff --git a/framework/src/PlugIn/PlugIn_DeviceInfo.c b/framework/src/PlugIn/PlugIn_DeviceInfo.c
new file mode 100755
index 0000000..9fdbd66
--- /dev/null
+++ b/framework/src/PlugIn/PlugIn_DeviceInfo.c
@@ -0,0 +1,148 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#include <dlfcn.h>
+
+#include "Utility/fw_log.h"
+#include "PlugIn/PlugIn_DeviceInfo.h"
+
+#define LOG_TAG "AF_PlugIn"
+
+static int current_PlugIn_count_DeviceInfo = 0;
+
+static PlugIn_DeviceInfo plugIn_repository[MAX_PLUGIN_DEVICEINFO];
+
+static int __findPlugIn_DeviceInfo(int plugIn_id);
+
+DeviceInfo_Func_Set getDeviceInfo_Func_Set(void *plugIn_handle, PLUGIN_ERROR * error_code)
+{
+ *error_code = PLUGIN_SUCCESS;
+
+ DeviceInfo_Func_Set func_Set;
+
+ func_Set.pFunc_Load_DevInfo = dlsym(plugIn_handle, "Load_DevInfo");
+ func_Set.pFunc_Get_DevInfo = dlsym(plugIn_handle, "Get_DevInfo");
+ func_Set.pFunc_Clear_DevInfo = dlsym(plugIn_handle, "Clear_DevInfo");
+ func_Set.pFunc_PM_Lock_State = dlsym(plugIn_handle, "PM_Lock_State");
+ func_Set.pFunc_PM_Unlock_State = dlsym(plugIn_handle, "PM_Unlock_State");
+
+ return func_Set;
+}
+
+PLUGIN_ERROR registerPlugIn_DeviceInfo(PlugIn_DeviceInfo plugIn)
+{
+ if (current_PlugIn_count_DeviceInfo >= MAX_PLUGIN_DEVICEINFO) {
+ return PLUGIN_FULL_CAPACITY;
+ }
+
+ plugIn_repository[current_PlugIn_count_DeviceInfo] = plugIn;
+
+ current_PlugIn_count_DeviceInfo++;
+
+ return PLUGIN_SUCCESS;
+}
+
+int isExsist_DeviceInfo_PlugIn(int *plugIn_id)
+{
+ if (current_PlugIn_count_DeviceInfo < 1) {
+ return 0;
+ }
+
+ *plugIn_id = plugIn_repository[0].plugIn_info.plugIn_id;
+
+ return 1;
+}
+
+Load_DevInfo getFunction_DeviceInfo_Load_DevInfo(int plugIn_id)
+{
+ int index = __findPlugIn_DeviceInfo(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Load_DevInfo;
+}
+
+Get_DevInfo getFunction_DeviceInfo_Get_DevInfo(int plugIn_id)
+{
+ int index = __findPlugIn_DeviceInfo(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Get_DevInfo;
+}
+
+Clear_DevInfo getFunction_DeviceInfo_Clear_DevInfo(int plugIn_id)
+{
+ int index = __findPlugIn_DeviceInfo(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Clear_DevInfo;
+}
+
+PM_Lock_State getFunction_PM_Lock_State(int plugIn_id)
+{
+ int index = __findPlugIn_DeviceInfo(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_PM_Lock_State;
+}
+
+PM_Unlock_State getFunction_PM_Unlock_State(int plugIn_id)
+{
+ int index = __findPlugIn_DeviceInfo(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_PM_Unlock_State;
+}
+
+static int __findPlugIn_DeviceInfo(int plugIn_id)
+{
+ int i = 0;
+ for (; i < current_PlugIn_count_DeviceInfo; i++) {
+ if (plugIn_repository[i].plugIn_info.plugIn_id == plugIn_id) {
+ return i;
+ }
+ }
+
+ return -1;
+}
diff --git a/framework/src/PlugIn/PlugIn_Mgr.c b/framework/src/PlugIn/PlugIn_Mgr.c
new file mode 100755
index 0000000..ee9a625
--- /dev/null
+++ b/framework/src/PlugIn/PlugIn_Mgr.c
@@ -0,0 +1,60 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>,
+ */
+
+#include <dlfcn.h>
+
+#include "Utility/fw_log.h"
+
+#include "PlugIn/PlugIn_Mgr.h"
+
+#define LOG_TAG "AF_PlugIn"
+
+void *load_PlugIn(const char *plugin_path, PLUGIN_ERROR * error)
+{
+ *error = PLUGIN_SUCCESS;
+
+ void *handler = dlopen(plugin_path, RTLD_LAZY);
+ if (handler == 0) {
+ FW_LOGE("dlopen error msg : %s", dlerror());
+ *error = PLUGIN_LOAD_FAIL;
+ }
+
+ return handler;
+}
+
+PLUGIN_ERROR unLoad_PlugIn(PLUGIN_DOMAIN domain, const char *plugin_name)
+{
+ return PLUGIN_SUCCESS;
+}
diff --git a/framework/src/PlugIn/PlugIn_NetworkAccess.c b/framework/src/PlugIn/PlugIn_NetworkAccess.c
new file mode 100755
index 0000000..d11e2a2
--- /dev/null
+++ b/framework/src/PlugIn/PlugIn_NetworkAccess.c
@@ -0,0 +1,241 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#include <dlfcn.h>
+#include <stdlib.h>
+
+#include "PlugIn/PlugIn_NetworkAccess.h"
+
+#include "Utility/fw_log.h"
+
+#define LOG_TAG "AF_PlugIn"
+
+static int current_PlugIn_count_NetworkAccess = 0;
+
+static PlugIn_NetworkAccess plugIn_repository[MAX_PLUGIN_NETWORKACCESS];
+
+static int __findPlugIn_NetworkAccess(int plugIn_id);
+
+NetworkAccess_Func_Set getNetworkAccess_Func_Set(void *plugIn_handle, PLUGIN_ERROR * error_code)
+{
+ *error_code = PLUGIN_SUCCESS;
+
+ NetworkAccess_Func_Set func_Set;
+
+ func_Set.pFunc_Open_Connection = dlsym(plugIn_handle, "Open_Connection");
+ func_Set.pFunc_Header_Binding = dlsym(plugIn_handle, "Header_Binding");
+ func_Set.pFunc_Send_Message = dlsym(plugIn_handle, "Send_Message");
+ func_Set.pFunc_Header_Unbinding = dlsym(plugIn_handle, "Header_Unbinding");
+ func_Set.pFunc_Close_Connection = dlsym(plugIn_handle, "Close_Connection");
+ func_Set.pFunc_Cancel_Message = dlsym(plugIn_handle, "Cancel_Message");
+ func_Set.pFunc_Just_Send_Message = dlsym(plugIn_handle, "Just_Send_Message");
+ func_Set.pFunc_Get_Header_Info = dlsym(plugIn_handle, "Get_Header_Info");
+ func_Set.pFunc_Set_Data_Down_Info = dlsym(plugIn_handle, "Set_Data_Download_Info");
+ func_Set.pFunc_Get_Data_Down_Info = dlsym(plugIn_handle, "Get_Data_Download_Info");
+ func_Set.pFunc_Add_Authentication_Info = dlsym(plugIn_handle, "Add_Authentication_Info");
+
+ return func_Set;
+}
+
+PLUGIN_ERROR registerPlugIn_NetworkAccess(PlugIn_NetworkAccess plugIn)
+{
+ if (current_PlugIn_count_NetworkAccess >= MAX_PLUGIN_NETWORKACCESS) {
+ return PLUGIN_FULL_CAPACITY;
+ }
+
+ plugIn_repository[current_PlugIn_count_NetworkAccess] = plugIn;
+
+ current_PlugIn_count_NetworkAccess++;
+
+ return PLUGIN_SUCCESS;
+}
+
+int use_Network(int plugIn_id)
+{
+ int index = __findPlugIn_NetworkAccess(plugIn_id);
+ if (index == -1) {
+ return -1;
+ }
+
+ return plugIn_repository[index].use_network;
+}
+
+int get_NetworkAccess_PlugIn_ID_List(int **plugIn_id_list)
+{
+ if (current_PlugIn_count_NetworkAccess <= 0) {
+ return 0;
+ }
+
+ *plugIn_id_list = (int *)calloc(current_PlugIn_count_NetworkAccess, sizeof(int));
+
+ int i = 0;
+ for (; i < current_PlugIn_count_NetworkAccess; i++) {
+ (*plugIn_id_list)[i] = plugIn_repository[i].plugIn_info.plugIn_id;
+ }
+
+ return current_PlugIn_count_NetworkAccess;
+}
+
+Open_Connection getFunction_NetworkAccess_Open_Connection(int plugIn_id)
+{
+ int index = __findPlugIn_NetworkAccess(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Open_Connection;
+}
+
+Header_Binding getFunction_NetworkAccess_Header_Binding(int plugIn_id)
+{
+ int index = __findPlugIn_NetworkAccess(plugIn_id);
+ FW_LOGI("index : %d", index);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Header_Binding;
+}
+
+Send_Message getFunction_NetworkAccess_Send_Message(int plugIn_id)
+{
+ int index = __findPlugIn_NetworkAccess(plugIn_id);
+ FW_LOGI("index : %d", index);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Send_Message;
+}
+
+Header_Unbinding getFunction_NetworkAccess_Header_Unbinding(int plugIn_id)
+{
+ int index = __findPlugIn_NetworkAccess(plugIn_id);
+ FW_LOGI("index : %d", index);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Header_Unbinding;
+}
+
+Close_Connection getFunction_NetworkAccess_Close_Connection(int plugIn_id)
+{
+ int index = __findPlugIn_NetworkAccess(plugIn_id);
+ FW_LOGI("index : %d", index);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Close_Connection;
+}
+
+Cancel_Message getFunction_NetworkAccess_Cancel_Message(int plugIn_id)
+{
+ int index = __findPlugIn_NetworkAccess(plugIn_id);
+ FW_LOGI("index : %d", index);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Cancel_Message;
+}
+
+Just_Send_Message getFunction_NetworkAccess_Just_Send_Message(int plugIn_id)
+{
+ int index = __findPlugIn_NetworkAccess(plugIn_id);
+ FW_LOGI("index : %d", index);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Just_Send_Message;
+}
+
+Get_Header_Info getFunction_NetworkAccess_Get_Header_Info(int plugIn_id)
+{
+ int index = __findPlugIn_NetworkAccess(plugIn_id);
+ FW_LOGI("index : %d", index);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Get_Header_Info;
+}
+
+Set_Data_Download_Info getFunction_NetworkAccess_Set_Data_Download_Info(int plugIn_id)
+{
+ int index = __findPlugIn_NetworkAccess(plugIn_id);
+ FW_LOGI("index : %d", index);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Set_Data_Down_Info;
+}
+
+Get_Data_Download_Info getFunction_NetworkAccess_Get_Data_Download_Info(int plugIn_id)
+{
+ int index = __findPlugIn_NetworkAccess(plugIn_id);
+ FW_LOGI("index : %d", index);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Get_Data_Down_Info;
+}
+
+Add_Authentication_Info getFunction_NetworkAccess_Add_Authentication_Info(int plugIn_id)
+{
+ int index = __findPlugIn_NetworkAccess(plugIn_id);
+ FW_LOGI("index : %d", index);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Add_Authentication_Info;
+}
+
+static int __findPlugIn_NetworkAccess(int plugIn_id)
+{
+ int i = 0;
+ for (; i < current_PlugIn_count_NetworkAccess; i++) {
+ if (plugIn_repository[i].plugIn_info.plugIn_id == plugIn_id) {
+ return i;
+ }
+ }
+
+ return -1;
+}
diff --git a/framework/src/PlugIn/PlugIn_PlatformMonitor.c b/framework/src/PlugIn/PlugIn_PlatformMonitor.c
new file mode 100755
index 0000000..f6192fa
--- /dev/null
+++ b/framework/src/PlugIn/PlugIn_PlatformMonitor.c
@@ -0,0 +1,297 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#include <dlfcn.h>
+
+#include "PlugIn/PlugIn_PlatformMonitor.h"
+
+#include "Utility/fw_log.h"
+
+#define LOG_TAG "AF_PlugIn"
+
+static int current_PlugIn_count_PlatformMonitor = 0;
+
+static PlugIn_PlatformMonitor plugIn_repository[MAX_PLUGIN_PLATFORMMONITOR];
+
+static int __findPlugIn_PlatformMonitor(int plugIn_id);
+
+PlatformMonitor_Func_Set getPlatformMonitor_Func_Set(void *plugIn_handle, PLUGIN_ERROR * error_code)
+{
+ PlatformMonitor_Func_Set func_Set;
+ func_Set.pFunc_Init_Network_Status_Noti_Handler = dlsym(plugIn_handle, "Init_Network_Status_Noti_Handler");
+ func_Set.pFunc_Terminate_Network_Status_Noti_Handler = dlsym(plugIn_handle, "Terminate_Network_Status_Noti_Handler");
+
+ func_Set.pFunc_Init_Syncml_SAN_Noti_Handler = dlsym(plugIn_handle, "Init_Syncml_SAN_Noti_Handler");
+ func_Set.pFunc_Terminate_Syncml_SAN_Noti_Handler = dlsym(plugIn_handle, "Terminate_Syncml_SAN_Noti_Handler");
+ func_Set.pFunc_Add_Message = dlsym(plugIn_handle, "Add_Message");
+ func_Set.pFunc_Remove_Message = dlsym(plugIn_handle, "Remove_Message");
+
+ func_Set.pFunc_Init_Alarm_Noti_Handler = dlsym(plugIn_handle, "Init_Alarm_Noti_Handler");
+ func_Set.pFunc_Terminate_Alarm_Noti_Handler = dlsym(plugIn_handle, "Init_Alarm_Noti_Handler");
+ func_Set.pFunc_Add_Alarm = dlsym(plugIn_handle, "Add_Alarm");
+ func_Set.pFunc_Remove_Alarm = dlsym(plugIn_handle, "Remove_Alarm");
+ func_Set.pFunc_Get_Alarm = dlsym(plugIn_handle, "Get_Alarm");
+
+ func_Set.pFunc_SetCallBack_NetworkStatus = dlsym(plugIn_handle, "SetCallBack_NetworkStatus");
+ func_Set.pFunc_SetCallBack_NetworkAllCancel = dlsym(plugIn_handle, "SetCallBack_NetworkAllCancel");
+
+ func_Set.pFunc_SetCallBack_Syncml_SAN_Incoming = dlsym(plugIn_handle, "SetCallBack_Syncml_SAN_Incoming");
+ func_Set.pFunc_SetCallBack_Syncml_SAN_Operation = dlsym(plugIn_handle, "SetCallBack_Syncml_SAN_Operation");
+
+ func_Set.pFunc_SetCallBack_Alarm = dlsym(plugIn_handle, "SetCallBack_Alarm");
+
+ func_Set.pFunc_SetCallBack_Network_On = dlsym(plugIn_handle, "SetCallBack_Network_On");
+ func_Set.pFunc_SetCallBack_Network_Off = dlsym(plugIn_handle, "SetCallBack_Network_Off");
+
+ *error_code = PLUGIN_SUCCESS; /* todo */
+
+ return func_Set;
+}
+
+PLUGIN_ERROR registerPlugIn_PlatformMonitor(PlugIn_PlatformMonitor plugIn)
+{
+ if (current_PlugIn_count_PlatformMonitor >= MAX_PLUGIN_PLATFORMMONITOR) {
+ return PLUGIN_FULL_CAPACITY;
+ }
+
+ plugIn_repository[current_PlugIn_count_PlatformMonitor] = plugIn;
+
+ current_PlugIn_count_PlatformMonitor++;
+
+ return PLUGIN_SUCCESS;
+}
+
+int get_PlatformMonitor_PlugIn_Id()
+{
+ if (current_PlugIn_count_PlatformMonitor < 1) {
+ return 0;
+ }
+
+ return plugIn_repository[0].plugIn_info.plugIn_id;
+}
+
+Init_Network_Status_Noti_Handler getFunction_PlatformMonitor_Init_Network_Status_Noti_Handler(int plugIn_id)
+{
+ int index = __findPlugIn_PlatformMonitor(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Init_Network_Status_Noti_Handler;
+}
+
+Terminate_Network_Status_Noti_Handler getFunction_PlatformMonitor_Terminate_Network_Status_Noti_Handler(int plugIn_id)
+{
+ int index = __findPlugIn_PlatformMonitor(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Terminate_Network_Status_Noti_Handler;
+}
+
+Init_Syncml_SAN_Noti_Handler getFunction_PlatformMonitor_Init_Syncml_SAN_Noti_Handler(int plugIn_id)
+{
+ int index = __findPlugIn_PlatformMonitor(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Init_Syncml_SAN_Noti_Handler;
+}
+
+Terminate_Syncml_SAN_Noti_Handler getFunction_PlatformMonitor_Terminate_Symcml_SAN_Noti_Handler(int plugIn_id)
+{
+ int index = __findPlugIn_PlatformMonitor(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Terminate_Syncml_SAN_Noti_Handler;
+}
+
+Add_Message getFunction_PlatformMonitor_Add_Message(int plugIn_id)
+{
+ int index = __findPlugIn_PlatformMonitor(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Add_Message;
+}
+
+Remove_Message getFunction_PlatformMonitor_Remove_Message(int plugIn_id)
+{
+ int index = __findPlugIn_PlatformMonitor(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Remove_Message;
+}
+
+Init_Alarm_Noti_Handler getFunction_PlatformMonitor_Init_Alarm_Noti_Handler(int plugIn_id)
+{
+ int index = __findPlugIn_PlatformMonitor(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Init_Alarm_Noti_Handler;
+}
+
+Terminate_Alarm_Noti_Handler getFunction_PlatformMonitor_Terminate_Alarm_Noti_Handler(int plugIn_id)
+{
+ int index = __findPlugIn_PlatformMonitor(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Terminate_Alarm_Noti_Handler;
+}
+
+Add_Alarm getFunction_PlatformMonitor_Add_Alarm(int plugIn_id)
+{
+ int index = __findPlugIn_PlatformMonitor(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Add_Alarm;
+}
+
+Remove_Alarm getFunction_PlatformMonitor_Remove_Alarm(int plugIn_id)
+{
+ int index = __findPlugIn_PlatformMonitor(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Remove_Alarm;
+}
+
+Get_Alarm getFunction_PlatformMonitor_Get_Alarm(int plugIn_id)
+{
+ int index = __findPlugIn_PlatformMonitor(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_Get_Alarm;
+}
+
+SetCallBack_NetworkStatus getFunction_PlatformMonitor_SetCallBack_NetworkStatus(int plugIn_id)
+{
+ int index = __findPlugIn_PlatformMonitor(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_SetCallBack_NetworkStatus;
+}
+
+SetCallBack_NetworkAllCancel getFunction_PlatformMonitor_SetCallBack_NetworkAllCancel(int plugIn_id)
+{
+ int index = __findPlugIn_PlatformMonitor(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_SetCallBack_NetworkAllCancel;
+}
+
+SetCallBack_Syncml_SAN_Incoming getFunction_PlatformMonitor_SetCallBack_Syncml_SAN_Incoming(int plugIn_id)
+{
+ int index = __findPlugIn_PlatformMonitor(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_SetCallBack_Syncml_SAN_Incoming;
+}
+
+SetCallBack_Syncml_SAN_Operation getFunction_PlatformMonitor_SetCallBack_Syncml_SAN_Operation(int plugIn_id)
+{
+ int index = __findPlugIn_PlatformMonitor(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_SetCallBack_Syncml_SAN_Operation;
+}
+
+SetCallBack_Alarm getFunction_PlatformMonitor_SetCallBack_Alarm(int plugIn_id)
+{
+ int index = __findPlugIn_PlatformMonitor(plugIn_id);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_SetCallBack_Alarm;
+}
+
+SetCallBack_Network_On getFunction_PlatformMonitor_SetCallBack_Network_On(int plugIn_id)
+{
+ int index = __findPlugIn_PlatformMonitor(plugIn_id);
+ FW_LOGI("index : %d", index);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_SetCallBack_Network_On;
+}
+
+SetCallBack_Network_Off getFunction_PlatformMonitor_SetCallBack_Network_Off(int plugIn_id)
+{
+ int index = __findPlugIn_PlatformMonitor(plugIn_id);
+ FW_LOGI("index : %d", index);
+ if (index == -1) {
+ return 0;
+ }
+
+ return plugIn_repository[index].func_Set.pFunc_SetCallBack_Network_Off;
+}
+
+static int __findPlugIn_PlatformMonitor(int plugIn_id)
+{
+ int i = 0;
+ for (; i < current_PlugIn_count_PlatformMonitor; i++) {
+ if (plugIn_repository[i].plugIn_info.plugIn_id == plugIn_id) {
+ return i;
+ }
+ }
+
+ return -1;
+}
diff --git a/framework/src/Utility/fw_alloc.c b/framework/src/Utility/fw_alloc.c
new file mode 100755
index 0000000..bccf929
--- /dev/null
+++ b/framework/src/Utility/fw_alloc.c
@@ -0,0 +1,352 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef NDEBUG
+
+#include <time.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <glib.h>
+#include "Utility/fw_thread.h"
+#include "Utility/fw_alloc.h"
+#include "Utility/fw_alloc_internal.h"
+#include "Utility/fw_list.h"
+
+#include "Utility/fw_log.h"
+#define LOG_TAG "AF_ALLOC"
+
+/* internal variable */
+static fw_list_node_t alloc_list_head = { &alloc_list_head, &alloc_list_head };
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
+FW_STATIC FW_INLINE void *get_realbytes(void *pBytes)
+{
+ void *pRealbytes = NULL;
+ pRealbytes = pBytes - ALLOC_FRONT_REDZONE_SIZE - FW_ALIGN64(sizeof(alloc_debug_info_t)) - sizeof(fw_list_node_t);
+ return pRealbytes;
+}
+
+FW_STATIC FW_INLINE alloc_debug_info_t *get_debug_info(void *pRealbytes)
+{
+ alloc_debug_info_t *pDebug_info = NULL;
+ pDebug_info = pRealbytes + sizeof(fw_list_node_t);
+ return pDebug_info;
+}
+
+FW_STATIC FW_INLINE void *get_front_redzone(void *pRealbytes)
+{
+ void *pFront_redzone = NULL;
+ pFront_redzone = pRealbytes + sizeof(fw_list_node_t) + FW_ALIGN64(sizeof(alloc_debug_info_t));
+ return pFront_redzone;
+}
+
+FW_STATIC FW_INLINE void *get_bytes(void *pRealbytes)
+{
+ void *pBytes = NULL;
+ pBytes = pRealbytes + sizeof(fw_list_node_t) + FW_ALIGN64(sizeof(alloc_debug_info_t)) + ALLOC_FRONT_REDZONE_SIZE;
+ return pBytes;
+}
+
+FW_STATIC FW_INLINE void *get_rear_redzone(void *pRealbytes, unsigned int bytes)
+{
+ void *pRear_redzone = NULL;
+ pRear_redzone = pRealbytes + sizeof(fw_list_node_t) + FW_ALIGN64(sizeof(alloc_debug_info_t)) + ALLOC_FRONT_REDZONE_SIZE + bytes;
+ return pRear_redzone;
+}
+
+FW_STATIC FW_INLINE fw_list_node_t *get_my_list_node(void *pRealbytes)
+{
+ fw_list_node_t *my_list_node = NULL;
+ my_list_node = (fw_list_node_t *)pRealbytes;
+ return my_list_node;
+}
+
+FW_STATIC FW_INLINE bool check_redzone(void *pRealbytes)
+{
+ FW_LOGV("start\n");
+ bool pass = true;
+ pass = check_front_redzone(pRealbytes);
+ if (!pass)
+ goto return_part;
+
+ pass = check_rear_redzone(pRealbytes);
+return_part:
+ FW_LOGV("finished with pass = %d\n", pass);
+ return pass;
+}
+
+FW_STATIC FW_INLINE bool check_redzone_with_pattern(char *redzone, char pattern, unsigned int pattern_size)
+{
+ bool different = false;
+ int i;
+ for (i = 0; i < pattern_size; i++) {
+ different |= (redzone[i] ^ pattern);
+ if (different) {
+ break;
+ }
+ }
+ return (!different);
+}
+
+FW_STATIC FW_INLINE bool check_front_redzone(void *pRealbytes)
+{
+ void *pFront_redzone = get_front_redzone(pRealbytes);
+ bool pass = check_redzone_with_pattern(pFront_redzone,
+ ALLOC_FRONT_REDZONE_PATTERN, ALLOC_FRONT_REDZONE_SIZE);
+
+ return pass;
+}
+
+FW_STATIC FW_INLINE bool check_rear_redzone(void *pRealbytes)
+{
+ alloc_debug_info_t *pAlloc_debug_info = get_debug_info(pRealbytes);
+
+ void *pRear_redzone = get_rear_redzone(pRealbytes, pAlloc_debug_info->size);
+ bool pass = check_redzone_with_pattern(pRear_redzone,
+ ALLOC_REAR_REDZONE_PATTERN, ALLOC_REAR_REDZONE_SIZE);
+
+ return pass;
+}
+
+/*
+ *@brief init already allocated debug info
+ *@param[in] debug_info : already allocated debug info structure
+ *@param[in] byte_size
+ *@param[in] file : file must be allocated already
+ *@param[in] line
+ */
+FW_STATIC FW_INLINE void _init_debug_info(alloc_debug_info_t *debug_info, unsigned int byte_size, const char *file, int line)
+{
+ /* TODO : assert debug_info != NULL */
+ debug_info->file = file;
+ debug_info->line = line;
+ debug_info->size = byte_size;
+ debug_info->time = time(NULL);
+}
+
+FW_STATIC bool init_realbytes(void *pRealbytes, unsigned int bytes, const char *file, int line)
+{
+ bool success = true;
+ void *pFront_redzone = NULL;
+ void *pRear_redzone = NULL;
+ alloc_debug_info_t *debug_info_ptr = NULL;
+ fw_list_node_t *pList_link = NULL;
+
+ char *dup_file = NULL;
+ dup_file = strdup(file);
+ if (dup_file == NULL) {
+ success = false;
+ goto return_part;
+ }
+
+ /* init list_link */
+ pList_link = get_my_list_node(pRealbytes);
+ pList_link->next = 0;
+ pList_link->prev = 0;
+
+ /* init_debug_info */
+ debug_info_ptr = get_debug_info(pRealbytes);
+ _init_debug_info(debug_info_ptr, bytes, dup_file, line);
+
+ /* init front redzone */
+ pFront_redzone = get_front_redzone(pRealbytes);
+ memset(pFront_redzone, ALLOC_FRONT_REDZONE_PATTERN, ALLOC_FRONT_REDZONE_SIZE);
+
+ /* init rear redzone */
+ pRear_redzone = get_rear_redzone(pRealbytes, bytes);
+ memset(pRear_redzone, ALLOC_REAR_REDZONE_PATTERN, ALLOC_REAR_REDZONE_SIZE);
+
+return_part:
+ if (dup_file != NULL) {
+ free(dup_file);
+ }
+ return success;
+}
+
+/*
+ *@brief alloc realbytes then init debug info, front and rear redzone
+ *@param[in] byte_size
+ *@param[in] file
+ *@param[in] line
+ */
+FW_STATIC void *_alloc_init_realbytes(unsigned int bytes, const char *file, int line)
+{
+ void *pRealbytes = NULL;
+
+ unsigned int realbytes_len = 0;
+ bool success = true;
+
+ /* get real byte size */
+ realbytes_len = sizeof(fw_list_node_t) + FW_ALIGN64(sizeof(alloc_debug_info_t)) + bytes + ALLOC_FRONT_REDZONE_SIZE + ALLOC_REAR_REDZONE_SIZE;
+
+ /* memory allocation : real byte memory & duplicate file */
+ pRealbytes = malloc(realbytes_len);
+ if (pRealbytes == NULL) {
+ success = false;
+ goto return_part;
+ }
+
+ success = init_realbytes(pRealbytes, bytes, file, line);
+
+return_part:
+ if (!success) {
+ if (pRealbytes != NULL) {
+ free(pRealbytes);
+ pRealbytes = NULL;
+ }
+ }
+
+ return pRealbytes;
+}
+
+FW_STATIC void _free_realbytes(void *pRealbytes)
+{
+ if (pRealbytes) {
+ alloc_debug_info_t *debug_info_ptr = NULL;
+
+ debug_info_ptr = get_debug_info(pRealbytes);
+ if (debug_info_ptr->file != NULL) {
+ free((void *)(debug_info_ptr->file));
+ }
+ free(pRealbytes);
+ }
+}
+
+/* external interface */
+
+void *_fw_malloc(unsigned int bytes, const char *file, int line)
+{
+ void *pRealbytes = NULL;
+ void *ret_ptr = NULL;
+ fw_list_node_t *pList_link = NULL;
+
+ pRealbytes = _alloc_init_realbytes(bytes, file, line);
+ if (pRealbytes == NULL) {
+ goto return_part;
+ }
+
+ /* put in list */
+ pList_link = get_my_list_node(pRealbytes);
+
+ pthread_mutex_lock(&mutex);
+ {
+ fw_list_add_node(pList_link, &alloc_list_head);
+ }
+ pthread_mutex_unlock(&mutex);
+
+ ret_ptr = get_bytes(pRealbytes);
+
+return_part:
+ FW_LOGD("[%s] allocation done! return ptr = %p\n", __func__, ret_ptr);
+ return ret_ptr;
+}
+
+void *_fw_calloc(unsigned int bytes, const char *file, int line)
+{
+ void *pBytes = NULL;
+ pBytes = _fw_malloc(bytes, file, line);
+ memset(pBytes, 0x00, bytes);
+
+ return pBytes;
+}
+
+void *_fw_realloc(void *ptr, unsigned int bytes, const char *file, int line)
+{
+ /* TODO */
+ return 0;
+}
+
+void _fw_free(void *ptr)
+{
+ void *pRealbytes = get_realbytes(ptr);
+ fw_list_node_t *pList_link = get_my_list_node(pRealbytes);
+ bool pass_redzone = false;
+
+ /* remove in list */
+ pthread_mutex_lock(&mutex);
+ {
+ fw_list_delete_node(pList_link);
+ }
+ pthread_mutex_unlock(&mutex);
+
+ pass_redzone = check_redzone(pRealbytes);
+ if (!pass_redzone) {
+ alloc_debug_info_t *debug_info_ptr = NULL;
+ debug_info_ptr = get_debug_info(pRealbytes);
+
+ char time_str[26];
+ ctime_r(&(debug_info_ptr->time), (char *)(&time_str));
+
+ FW_LOGE("REDZONE CHECK ERROR. \n" "\tmalloc from:" "filename = %s, line = %d, size = %d\n at time = %s", debug_info_ptr->file, debug_info_ptr->line, debug_info_ptr->size, time_str);
+
+ FW_LOGE("[%s] checking redzone failed in ptr = %p\n", __func__, ptr);
+ /* TODO : abort */
+ } else {
+ FW_LOGD("[%s] checking redzone success in ptr = %p\n", __func__, ptr);
+ }
+
+ _free_realbytes(pRealbytes);
+}
+
+char *_fw_strdup(const char *src, const char *file, int line)
+{
+ if (src == NULL) {
+ goto error_part;
+ }
+
+ unsigned int str_len = strlen(src);
+ char *pOut_string = _fw_malloc(str_len + 1, file, line);
+ if (pOut_string == NULL) {
+ goto error_part;
+ }
+
+ memcpy(pOut_string, src, str_len);
+ pOut_string[str_len] = '\0';
+
+ return pOut_string;
+
+error_part:
+ return NULL;
+}
+
+char *_fw_strndup(const char *src, unsigned int n, const char *file, int line)
+{
+ /* TODO */
+ return 0;
+}
+
+#endif
diff --git a/framework/src/Utility/fw_async_queue.c b/framework/src/Utility/fw_async_queue.c
new file mode 100755
index 0000000..7e2bda3
--- /dev/null
+++ b/framework/src/Utility/fw_async_queue.c
@@ -0,0 +1,111 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include <stdlib.h>
+#include "Utility/fw_async_queue.h"
+#include "Utility/fw_log.h"
+
+#define LOG_TAG "AF_UTIL_FW_AYNC_QUEUE"
+
+fw_async_queue_t *fw_async_queue_alloc()
+{
+ if (!g_thread_supported()) {
+ g_thread_init(NULL);
+ }
+
+ fw_async_queue_t *pQueue = (fw_async_queue_t *)calloc(1, sizeof(fw_async_queue_t));
+ if (pQueue == NULL) {
+ goto return_part;
+ }
+
+ pQueue->pQueue = g_async_queue_new();
+ if (pQueue->pQueue == NULL) {
+ goto error_part;
+ }
+
+return_part:
+ return pQueue;
+
+error_part:
+ fw_async_queue_destroy(pQueue);
+ return NULL;
+}
+
+void fw_async_queue_destroy(fw_async_queue_t *pQueue)
+{
+ if (pQueue != NULL) {
+ if (pQueue->pQueue != NULL) {
+ g_async_queue_unref(pQueue->pQueue);
+ }
+ free(pQueue);
+ }
+}
+
+void fw_async_queue_lock(fw_async_queue_t *pQueue)
+{
+ if (pQueue != NULL && pQueue->pQueue != NULL) {
+ g_async_queue_lock(pQueue->pQueue);
+ } else {
+ FW_LOGW("Invalid fw_async_queue\n");
+ }
+}
+
+void fw_async_queue_unlock(fw_async_queue_t *pQueue)
+{
+ if (pQueue != NULL && pQueue->pQueue != NULL) {
+ g_async_queue_unlock(pQueue->pQueue);
+ } else {
+ FW_LOGW("Invalid fw_async_queue\n");
+ }
+}
+
+void *fw_async_queue_receive_msg(fw_async_queue_t *pQueue)
+{
+ return g_async_queue_pop(pQueue->pQueue);
+}
+
+void fw_async_queue_send_msg(fw_async_queue_t *pQueue, void *msg)
+{
+ g_async_queue_push(pQueue->pQueue, msg);
+}
+
+void fw_async_queue_send_msg_with_compare_priority(fw_async_queue_t *pQueue, void *msg, compare_priority_func cpf, void *user_data)
+{
+ if (cpf == NULL) {
+ g_async_queue_push(pQueue->pQueue, msg);
+ } else {
+ g_async_queue_push_sorted(pQueue->pQueue, msg, cpf, user_data);
+ }
+}
diff --git a/framework/src/Utility/fw_cache.c b/framework/src/Utility/fw_cache.c
new file mode 100755
index 0000000..578596d
--- /dev/null
+++ b/framework/src/Utility/fw_cache.c
@@ -0,0 +1,251 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <inttypes.h>
+#include <glib.h>
+
+#include "Utility/fw_cache.h"
+#include "Utility/fw_common.h"
+#include "Utility/fw_thread.h"
+
+#include "Utility/fw_log.h"
+#define LOG_TAG "AF_CACHE"
+
+typedef struct {
+ FW_THREAD_MUTEX_T mutex; /* Mutex to protect access to the structure */
+ char *cache_name; /* cache name */
+ void *value; /* object pointer in this cache */
+ int ref_count; /* reference count for value */
+} cache_t;
+
+typedef struct {
+ cache_constructor_t *constructor; /* constructor to allocate memory for cache value */
+ cache_destructor_t *destructor; /* destructor to free memory for cache value */
+ cache_reloader_t *reloader; /* reloader to reload memory for cache value */
+ FW_HASH_TABLE *cache_hash_table;
+ FW_THREAD_MUTEX_T hash_mutex;
+} cache_manager_t;
+
+static cache_manager_t *cache_manager = 0;
+
+static cache_t *__alloc_cache(const char *cache_name);
+static void __free_cache(cache_t *cache);
+
+int FW_Create_Cache(cache_constructor_t *constructor, cache_destructor_t *destructor, cache_reloader_t *reloader)
+{
+ FW_LOGV("Start !!");
+ if (cache_manager != 0) {
+ FW_LOGE("cache_manager exist already !!");
+ return 0;
+ }
+
+ cache_manager = (cache_manager_t *) calloc(1, sizeof(cache_manager_t));
+ pthread_mutex_init(&cache_manager->hash_mutex, 0);
+ cache_manager->constructor = constructor;
+ cache_manager->reloader = reloader;
+ cache_manager->destructor = destructor;
+ cache_manager->cache_hash_table = g_hash_table_new(g_int_hash, 0);
+
+ FW_LOGV("End !!");
+ return 1;
+}
+
+int FW_Destroy_Cache()
+{
+ FW_LOGV("Start!!");
+ if (cache_manager == 0) {
+ FW_LOGE("cache_manage is NULL. cache cannot free !!");
+ return 0;
+ }
+
+ g_hash_table_destroy(cache_manager->cache_hash_table);
+ pthread_mutex_destroy(&cache_manager->hash_mutex);
+ free(cache_manager);
+ cache_manager = 0;
+
+ FW_LOGV("End !!");
+ return 1;
+}
+
+void *FW_Use_Cache_Info(const char *cache_name)
+{
+ FW_LOGV("Start !!");
+ void *object = 0;
+ if (cache_name == 0 || cache_manager == 0 || cache_manager->cache_hash_table == 0) {
+ FW_LOGE("cache_name == 0 || cache_manager == 0 || cache_manager->cache_hash_table == 0");
+ goto return_part;
+ }
+
+ cache_t *cache = 0;
+ fw_thread_mutex_lock(&cache_manager->hash_mutex);
+ cache = g_hash_table_lookup(cache_manager->cache_hash_table, cache_name);
+ if (cache == 0) {
+ FW_LOGV("Cache Search Fail and add Cache Hash Table !!");
+ cache = __alloc_cache(cache_name);
+ if (cache == 0) {
+ FW_LOGE("Failed to __alloc_cache()");
+ fw_thread_mutex_unlock(&cache_manager->hash_mutex);
+ return 0;
+ }
+ g_hash_table_insert(cache_manager->cache_hash_table, (void *)cache_name, cache);
+ object = cache->value;
+ fw_thread_mutex_unlock(&cache_manager->hash_mutex);
+ goto return_part;
+ }
+ fw_thread_mutex_unlock(&cache_manager->hash_mutex);
+
+ FW_LOGV("Cache Search Success !!");
+ fw_thread_mutex_lock(&cache->mutex);
+ cache->ref_count++;
+ object = cache->value;
+ fw_thread_mutex_unlock(&cache->mutex);
+
+return_part:
+ FW_LOGV("End !!");
+ return object;
+}
+
+int FW_Return_Cache_Info(const char *cache_name)
+{
+ FW_LOGV("Start !!");
+ int ret = 1;
+
+ if (cache_name == 0 || cache_manager == 0 || cache_manager->cache_hash_table == 0) {
+ FW_LOGE("cache_name == 0 || cache_manager == 0 || cache_manager->cache_hash_table == 0");
+ ret = 0;
+ goto return_part;
+ }
+
+ cache_t *cache = 0;
+ fw_thread_mutex_lock(&cache_manager->hash_mutex);
+ cache = g_hash_table_lookup(cache_manager->cache_hash_table, cache_name);
+ if (cache == 0) {
+ FW_LOGE("Cache Search Fail");
+ ret = 0;
+ goto mutex_unlock;
+ }
+
+ FW_LOGV("Cache Search Success");
+ fw_thread_mutex_lock(&cache->mutex);
+ (cache->ref_count)--;
+ fw_thread_mutex_unlock(&cache->mutex);
+
+ if (cache->ref_count <= 0) {
+ g_hash_table_remove(cache_manager->cache_hash_table, cache_name);
+ __free_cache(cache);
+ }
+
+mutex_unlock:
+ fw_thread_mutex_unlock(&cache_manager->hash_mutex);
+return_part:
+ FW_LOGV("End !!");
+ return ret;
+}
+
+void *FW_Reload_Cache_Info(const char *cache_name)
+{
+ FW_LOGV("Start !!");
+ void *object = 0;
+ if (cache_name == 0 || cache_manager == 0 || cache_manager->cache_hash_table == 0) {
+ FW_LOGE("cache_name == 0 || cache_manager == 0 || cache_manager->cache_hash_table == 0");
+ goto return_part;
+ }
+
+ cache_t *cache = 0;
+ fw_thread_mutex_lock(&cache_manager->hash_mutex);
+ cache = g_hash_table_lookup(cache_manager->cache_hash_table, cache_name);
+ if (cache == 0) {
+ /* insert cache */
+ FW_LOGV("Cache Search Fail and add Cache Hash Table !!");
+ cache = __alloc_cache(cache_name);
+ if (cache == 0) {
+ FW_LOGE("Failed to __alloc_cache()");
+ fw_thread_mutex_unlock(&cache_manager->hash_mutex);
+ return 0;
+ }
+ g_hash_table_insert(cache_manager->cache_hash_table, (void *)cache_name, cache);
+ object = cache->value;
+ fw_thread_mutex_unlock(&cache_manager->hash_mutex);
+ goto return_part;
+ }
+ fw_thread_mutex_unlock(&cache_manager->hash_mutex);
+
+ FW_LOGV("Cache Search Success");
+ fw_thread_mutex_lock(&cache->mutex);
+
+ if (cache_manager->destructor != 0)
+ cache_manager->destructor(cache_name, cache->value);
+ if (cache_manager->reloader != 0)
+ cache->value = cache_manager->reloader(cache_name);
+ object = cache->value;
+ fw_thread_mutex_unlock(&cache->mutex);
+
+return_part:
+ FW_LOGV("End !!");
+ return object;
+}
+
+static cache_t *__alloc_cache(const char *cache_name)
+{
+ cache_t *cache = (cache_t *)calloc(1, sizeof(cache_t));
+ if (cache == 0)
+ return 0;
+
+ pthread_mutex_init(&cache->mutex, 0);
+ cache->cache_name = strdup(cache_name);
+ cache->ref_count = 1;
+
+ if (cache_manager->constructor != 0)
+ cache->value = cache_manager->constructor(cache_name);
+
+ return cache;
+}
+
+static void __free_cache(cache_t *cache)
+{
+ if (cache != 0) {
+
+ if (cache->cache_name != 0 && cache->value) {
+ if (cache_manager->destructor != 0)
+ cache_manager->destructor(cache->cache_name, cache->value);
+ free(cache->cache_name);
+ }
+
+ pthread_mutex_destroy(&cache->mutex);
+ free(cache);
+ }
+}
diff --git a/framework/src/Utility/fw_compress.c b/framework/src/Utility/fw_compress.c
new file mode 100755
index 0000000..aea7dc9
--- /dev/null
+++ b/framework/src/Utility/fw_compress.c
@@ -0,0 +1,170 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "Utility/fw_log.h"
+#include "Utility/fw_compress.h"
+
+#define LOG_TAG "AF_COMPRESS"
+
+FW_COMPRESS_RESULT FW_COMPRESS(FW_COMPRESS_TYPE type, const char *input_directory_path, const char *output_file_path)
+{
+ if (input_directory_path == 0 || output_file_path == 0) {
+ return FW_COMPRESS_FAIL;
+ }
+
+ char *command = 0;
+
+ switch (type) {
+ case FW_COMPRESS_TYPE_TAR:
+ {
+ command = (char *)calloc(strlen("tar cvzpf ") + strlen(output_file_path) + strlen(" ") + strlen(input_directory_path) + 1, sizeof(char));
+ strcat(command, "tar cvzpf ");
+ strcat(command, output_file_path);
+ strcat(command, " ");
+ strcat(command, input_directory_path);
+
+ int pid = fork();
+ if (pid == -1) {
+ FW_LOGE("Fork failed to create a process");
+ return FW_COMPRESS_FAIL;
+ } else if (pid == 0) {
+ char *argv[4];
+
+ argv[0] = "sh";
+ argv[1] = "-c";
+ argv[2] = command;
+ argv[3] = 0;
+
+ execv("/bin/sh", argv);
+
+ abort();
+ }
+
+ int status = 0;
+ do {
+ if (waitpid(pid, &status, 0) == -1) {
+ if (errno != EINTR) {
+ free(command);
+ return FW_COMPRESS_SUCCESS;
+ } else {
+ return FW_COMPRESS_FAIL;
+ }
+ }
+ } while (1);
+ }
+ break;
+ case FW_COMPRESS_TYPE_ZIP:
+ {
+ /*
+ * Not yet support
+ */
+ }
+ break;
+ default:
+ FW_LOGE("Not support compress type!!");
+ break;
+ }
+
+ return FW_COMPRESS_FAIL;
+}
+
+FW_COMPRESS_RESULT FW_UNCOMPRESS(FW_COMPRESS_TYPE type, const char *input_file_path, const char *output_direcory_path)
+{
+ if (input_file_path == 0 || output_direcory_path == 0) {
+ return FW_COMPRESS_FAIL;
+ }
+
+ char *command = 0;
+
+ switch (type) {
+ case FW_COMPRESS_TYPE_TAR:
+ {
+ command = (char *)calloc(strlen("tar xvf ") + strlen(input_file_path) + strlen(" -C ") + strlen(output_direcory_path) + 1, sizeof(char));
+ strcat(command, "tar xvf ");
+ strcat(command, input_file_path);
+ strcat(command, " -C ");
+ strcat(command, output_direcory_path);
+
+ int pid = fork();
+ if (pid == -1) {
+ FW_LOGE("Fork failed to create a process");
+ return FW_COMPRESS_FAIL;
+ } else if (pid == 0) {
+ char *argv[4];
+
+ argv[0] = "sh";
+ argv[1] = "-c";
+ argv[2] = command;
+ argv[3] = 0;
+
+ execv("/bin/sh", argv);
+
+ abort();
+ }
+
+ int status = 0;
+ do {
+ if (waitpid(pid, &status, 0) == -1) {
+ if (errno != EINTR) {
+ free(command);
+ return FW_COMPRESS_SUCCESS;
+ } else {
+ return FW_COMPRESS_FAIL;
+ }
+ }
+ } while (1);
+ }
+ break;
+ case FW_COMPRESS_TYPE_ZIP:
+ {
+ /*
+ * Not yet support
+ */
+ }
+ break;
+ default:
+ FW_LOGE("Not support compress type!!");
+ break;
+ }
+
+ return FW_COMPRESS_FAIL;
+}
diff --git a/framework/src/Utility/fw_list.c b/framework/src/Utility/fw_list.c
new file mode 100644
index 0000000..481c9e5
--- /dev/null
+++ b/framework/src/Utility/fw_list.c
@@ -0,0 +1,84 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include "Utility/fw_log.h"
+
+#include "Utility/fw_list.h"
+
+
+#define LOG_TAG "AF_UTIL_LIST"
+
+
+void fw_list_add_node(fw_list_node_t *new_node, fw_list_node_t *head_ptr)
+{
+ *(volatile fw_list_node_t **)&new_node->next = head_ptr->next;
+ new_node->prev = head_ptr;
+ head_ptr->next->prev = new_node;
+ head_ptr->next = new_node;
+}
+
+void fw_list_delete_node(fw_list_node_t *target_node)
+{
+ fw_list_node_t *prev = target_node->prev;
+ fw_list_node_t *next = target_node->next;
+
+ next->prev = prev;
+ *(volatile fw_list_node_t **)&prev->next = next;
+}
+
+void fw_list_move_node(fw_list_node_t *list, fw_list_node_t *head_ptr)
+{
+ fw_list_delete_node(list);
+ fw_list_add_node(list, head_ptr);
+}
+
+int fw_list_node_count(const fw_list_node_t *head_ptr)
+{
+ int volatile count = 0;
+
+ fw_list_node_t *cursor_ptr = head_ptr->next;
+ while (cursor_ptr != head_ptr) {
+ count++;
+ cursor_ptr = cursor_ptr->next;
+ }
+
+ return count;
+}
+
+void fw_list_init(fw_list_node_t *node_ptr)
+{
+ node_ptr->next = node_ptr;
+ node_ptr->prev = node_ptr;
+}
diff --git a/framework/src/Utility/fw_log.c b/framework/src/Utility/fw_log.c
new file mode 100755
index 0000000..8c7f6c8
--- /dev/null
+++ b/framework/src/Utility/fw_log.c
@@ -0,0 +1,148 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include <stdarg.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <glib.h>
+#include "Utility/fw_log.h"
+
+#define FW_LOG_FORMAT_MAX_SIZE 1024
+#define FW_BASENAME(file_path) (strrchr((file_path), '/') ? strrchr(file_path, '/') + 1 : (file_path))
+
+#ifdef SLP_PLATFORM
+#include <dlog.h>
+#endif /* SLP_PLATFORM */
+
+#ifdef LINUX_PLATFORM
+#endif /* LINUX_PLATFORM */
+
+static const char *default_terminal_option = "\033[0m";
+
+void _fw_log(int prio, const char *log_tag, const char *terminal_option, const char *file_path, const char *func_name, const unsigned int line, const char *format, ...)
+{
+ va_list ap;
+ va_start(ap, format);
+
+ /* get new log format */
+ /* new log format to be saved here */
+ char new_log_format[FW_LOG_FORMAT_MAX_SIZE];
+ int new_log_format_len = 0;
+ if (terminal_option == NULL) {
+ new_log_format_len = snprintf(new_log_format, FW_LOG_FORMAT_MAX_SIZE, "[File = %.60s, Func = %.60s, Line = %u] %s", FW_BASENAME(file_path), func_name, line, format);
+ } else {
+ new_log_format_len = snprintf(new_log_format, FW_LOG_FORMAT_MAX_SIZE, "[File = %.60s, Func = %.60s, Line = %u] %s%s%s", FW_BASENAME(file_path), func_name, line, terminal_option, format, default_terminal_option);
+ }
+
+ if (new_log_format_len <= FW_LOG_FORMAT_MAX_SIZE) {
+ /* get right new log format case */
+#ifdef SLP_PLATFORM
+ switch (prio) {
+ case FW_LOG_UNKNOWN:
+ case FW_LOG_DEFAULT:
+ case FW_LOG_VERBOSE:
+ LOG_VA(LOG_VERBOSE, log_tag, new_log_format, ap);
+ break;
+ case FW_LOG_DEBUG:
+ LOG_VA(LOG_DEBUG, log_tag, new_log_format, ap);
+ break;
+ case FW_LOG_INFO:
+ LOG_VA(LOG_INFO, log_tag, new_log_format, ap);
+ break;
+ case FW_LOG_WARN:
+ LOG_VA(LOG_WARN, log_tag, new_log_format, ap);
+ break;
+ case FW_LOG_ERROR:
+ LOG_VA(LOG_ERROR, log_tag, new_log_format, ap);
+ break;
+ case FW_LOG_FATAL:
+ LOG_VA(LOG_FATAL, log_tag, new_log_format, ap);
+ break;
+ case FW_LOG_SILENT:
+ LOG_VA(LOG_SILENT, log_tag, new_log_format, ap);
+ break;
+ default:
+ assert(false);
+ }
+#endif /* SLP_PLATFORM */
+
+#ifdef LINUX_PLATFORM
+ /* TODO */
+ vfprintf(stderr, new_log_format, ap);
+#endif /* LINUX_PLATFORM */
+
+ } else {
+ /* may be new log format is greater than FW_LOG_FORMAT_MAX_SIZE case */
+#ifdef SLP_PLATFORM
+ switch (prio) {
+ case FW_LOG_UNKNOWN:
+ case FW_LOG_DEFAULT:
+ case FW_LOG_VERBOSE:
+ LOG_VA(LOG_VERBOSE, log_tag, format, ap);
+ break;
+ case FW_LOG_DEBUG:
+ LOG_VA(LOG_DEBUG, log_tag, format, ap);
+ break;
+ case FW_LOG_INFO:
+ LOG_VA(LOG_INFO, log_tag, format, ap);
+ break;
+ case FW_LOG_WARN:
+ LOG_VA(LOG_WARN, log_tag, format, ap);
+ break;
+ case FW_LOG_ERROR:
+ LOG_VA(LOG_ERROR, log_tag, format, ap);
+ break;
+ case FW_LOG_FATAL:
+ LOG_VA(LOG_FATAL, log_tag, format, ap);
+ break;
+ case FW_LOG_SILENT:
+ LOG_VA(LOG_SILENT, log_tag, format, ap);
+ break;
+ default:
+ assert(false);
+ }
+#endif /* SLP_PLATFORM */
+
+#ifdef LINUX_PLATFORM
+ /* TODO */
+ vfprintf(stderr, format, ap);
+#endif /* LINUX_PLATFORM */
+ }
+
+ va_end(ap);
+}
diff --git a/framework/src/Utility/fw_mainloop.c b/framework/src/Utility/fw_mainloop.c
new file mode 100755
index 0000000..8ec5b91
--- /dev/null
+++ b/framework/src/Utility/fw_mainloop.c
@@ -0,0 +1,128 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include <glib.h>
+#include <pthread.h>
+
+#include "Utility/fw_mainloop.h"
+
+#define MAX_CALLBACK 10
+
+static pthread_t mainloop_thread_id;
+static int callback_count = 0;
+
+static pthread_mutex_t loop_mutex;
+static pthread_cond_t loop_cond;
+static GMainLoop *loop = 0;
+static Callback_Rutine callbackList[MAX_CALLBACK] = { 0 };
+static void *callbackDataList[MAX_CALLBACK] = { 0 };
+
+static void *__mainloop_rutine(void *data);
+
+/*
+ * non thread safe function !!
+ */
+void register_Callback2MainLoop(Callback_Rutine callback, void *data)
+{
+ callbackList[callback_count] = callback;
+ callbackDataList[callback_count] = data;
+
+ callback_count++;
+}
+
+void run_MainLoop()
+{
+ int isRunning = isRunning_MainLoop();
+ /*
+ * when main loop is not running !!
+ */
+ if (isRunning != 1) {
+ pthread_mutex_init(&loop_mutex, NULL); /* TODO : error handling if return value is not 0, fail logic */
+ pthread_cond_init(&loop_cond, NULL); /* TODO : error handling if return value is not 0, fail logic */
+
+ pthread_mutex_lock(&loop_mutex);
+ pthread_create(&mainloop_thread_id, 0, __mainloop_rutine, 0);
+ do {
+ pthread_cond_wait(&loop_cond, &loop_mutex);
+ } while (loop == NULL);
+
+ pthread_mutex_unlock(&loop_mutex);
+ }
+}
+
+void stop_MainLoop()
+{
+ int isRunning = isRunning_MainLoop();
+
+ if (isRunning) {
+ pthread_mutex_destroy(&loop_mutex); /* TODO : error handling if return value is not 0, fail logic */
+ pthread_cond_destroy(&loop_cond); /* TODO : error handling if return value is not 0, fail logic */
+ g_main_loop_quit(loop);
+ g_main_loop_unref(loop);
+ pthread_cancel(mainloop_thread_id);
+ }
+}
+
+int isRunning_MainLoop()
+{
+ gboolean result = 0;
+ if (!loop) {
+ return result;
+ }
+ result = g_main_loop_is_running(loop);
+
+ return result;
+}
+
+static void *__mainloop_rutine(void *data)
+{
+ int i;
+ for (i = 0; i < callback_count; i++) {
+ if (callbackList[i] != 0) {
+ callbackList[i] (callbackDataList[i]);
+ }
+ }
+
+ pthread_mutex_lock(&loop_mutex);
+
+ loop = g_main_loop_new(0, 0);
+
+ pthread_cond_signal(&loop_cond);
+ pthread_mutex_unlock(&loop_mutex);
+
+ g_main_loop_run(loop);
+
+ return 0;
+}
diff --git a/framework/src/Utility/fw_ref.c b/framework/src/Utility/fw_ref.c
new file mode 100755
index 0000000..4a60bda
--- /dev/null
+++ b/framework/src/Utility/fw_ref.c
@@ -0,0 +1,94 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include "Utility/fw_ref.h"
+#include <stdlib.h>
+#include <glib.h>
+
+refObject_t *create_refObject(void *data, FREE_FUNCTION data_free_func)
+{
+ refObject_t *pRef = (refObject_t *)malloc(sizeof(refObject_t));
+ if (pRef == NULL) {
+ goto error_part;
+ }
+
+ pRef->refcount = 1;
+ pRef->data = data;
+ pRef->free_func = data_free_func;
+
+ return pRef;
+
+error_part:
+ return NULL;
+}
+
+refObject_t *getRef(refObject_t *object)
+{
+ if (object == NULL) {
+ return NULL;
+ }
+
+ g_atomic_int_inc(&(object->refcount));
+
+ return object;
+}
+
+void *getData(refObject_t *object)
+{
+ return object->data;
+}
+
+bool same_ref(refObject_t *object1, refObject_t *object2)
+{
+ if ((object1->data) == (object2->data)) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void unref_refObject(refObject_t *pRef)
+{
+ if (pRef == NULL) {
+ return;
+ }
+
+ if (g_atomic_int_dec_and_test(&(pRef->refcount))) {
+ if (pRef->free_func != 0)
+ pRef->free_func(pRef->data);
+
+ free(pRef);
+ }
+}
diff --git a/framework/src/Utility/fw_sequential_id_provider.c b/framework/src/Utility/fw_sequential_id_provider.c
new file mode 100755
index 0000000..3efb371
--- /dev/null
+++ b/framework/src/Utility/fw_sequential_id_provider.c
@@ -0,0 +1,1111 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include "Utility/fw_list.h"
+#include "Utility/fw_log.h"
+#include "Utility/fw_sequential_id_provider_internal.h"
+#include "DataAdapter/DACI_Agent_Handler_Manager.h"
+
+#define LOG_TAG "FW_UTIL_ID"
+
+/* internal interfaces */
+unsigned int __calculate_free_bit_cnt(char *bits, unsigned int bit_cnt)
+{
+ FW_LOGD("start");
+ unsigned int cnt = 0;
+
+ unsigned int i = 0;
+ for (i = 0; i < bit_cnt; i++) {
+ if (__is_bit_off(i, bits)) {
+ cnt++;
+ }
+ }
+
+ FW_LOGD("end with free_bit_cnt = %u", cnt);
+ return cnt;
+}
+
+inline bool __is_bit_on(unsigned int offset, char *bits)
+{
+ unsigned int q = offset / 8;
+ unsigned int r = offset % 8;
+ char mask = 1 << (7 - r);
+ return (bits[q] & mask);
+}
+
+inline bool __is_bit_off(unsigned int offset, char *bits)
+{
+ return !__is_bit_on(offset, bits);
+}
+
+inline void __set_bit_on(unsigned int offset, char *bits)
+{
+ unsigned int q = offset / 8;
+ unsigned int r = offset % 8;
+ char mask = 1 << (7 - r);
+ bits[q] |= mask;
+}
+
+inline void __set_bit_off(unsigned int offset, char *bits)
+{
+ unsigned int q = offset / 8;
+ unsigned int r = offset % 8;
+ char mask = 1 << (7 - r);
+ bits[q] &= (~mask);
+}
+
+id_page_t *id_page_alloc(id_page_flag_t flag, unsigned int page_index, unsigned int free_bit_cnt, unsigned int page_bit_cnt, char *bits)
+{
+ id_page_t *pId_page = (id_page_t *)malloc(sizeof(id_page_t));
+ if (pId_page == NULL) {
+ goto return_part;
+ }
+
+ pId_page->link.next = 0;
+ pId_page->link.prev = 0;
+ pId_page->flag = flag;
+ pId_page->page_index = page_index;
+ pId_page->free_bit_cnt = free_bit_cnt;
+ pId_page->page_bit_cnt = page_bit_cnt;
+ pId_page->bits = bits;
+
+return_part:
+ return pId_page;
+}
+
+id_page_t *id_page_alloc_new_page(unsigned int page_index, unsigned int page_bit_cnt)
+{
+ unsigned int size = DIVIDE_INT_ROUND_UP(page_bit_cnt, 8);
+ char *bits = (char *)calloc(size, sizeof(char));
+
+ if (bits == NULL) {
+ return NULL;
+ }
+
+ return id_page_alloc(ID_PAGE_FLAG_UNKNOWN, page_index, page_bit_cnt, page_bit_cnt, bits);
+}
+
+id_page_t *id_page_load(unsigned int code, unsigned int page_index, unsigned int page_bit_cnt)
+{
+ id_page_t *pId_page = NULL;
+
+ /* get bits from db */
+ char *page_bit = NULL;
+ DACI_RETURN ret = DACI_Get_ID_Page(code, page_index, &page_bit);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGD("Failed DACI_Get_ID_Page()\n");
+ assert(false);
+ } else {
+ FW_LOGD("Success DACI_Get_ID_Page()\n");
+ }
+
+ if (page_bit != NULL) {
+ /* calculate free bit count */
+ unsigned int free_bit_cnt = __calculate_free_bit_cnt(page_bit, page_bit_cnt);
+
+ /* create page with bits from db */
+ pId_page = id_page_alloc(ID_PAGE_FLAG_UNKNOWN, page_index, free_bit_cnt, page_bit_cnt, page_bit);
+ FW_LOGD("(page_index = %u, free_bit_cnt = %u, page_bit_cnt = %u", page_index, free_bit_cnt, page_bit_cnt);
+
+ assert(pId_page != NULL); /* TODO : remove this part by change interface */
+ }
+
+ return pId_page;
+}
+
+void id_page_free(id_page_t *pId_page)
+{
+ if (pId_page != NULL) {
+ if (pId_page->bits != NULL) {
+ free(pId_page->bits);
+ }
+ free(pId_page);
+ }
+}
+
+inline bool id_page_is_empty(id_page_t *pId_page)
+{
+ if (pId_page->free_bit_cnt == pId_page->page_bit_cnt) {
+ return true;
+ }
+ return false;
+}
+
+inline void id_page_set_flag(id_page_t *pId_page, id_page_flag_t flag)
+{
+ pId_page->flag = flag;
+}
+
+inline id_page_flag_t id_page_get_flag(id_page_t *pId_page)
+{
+ return pId_page->flag;
+}
+
+inline bool id_page_has_same_flag(id_page_t *pId_page, id_page_flag_t flag)
+{
+ if (id_page_get_flag(pId_page) == flag) {
+ return true;
+ }
+ return false;
+}
+
+inline bool id_page_is_unknown_flag(id_page_t *pId_page)
+{
+ return id_page_has_same_flag(pId_page, ID_PAGE_FLAG_UNKNOWN);
+}
+
+inline bool id_page_is_add_flag(id_page_t *pId_page)
+{
+ return id_page_has_same_flag(pId_page, ID_PAGE_FLAG_ADD);
+}
+
+inline bool id_page_is_delete_flag(id_page_t *pId_page)
+{
+ return id_page_has_same_flag(pId_page, ID_PAGE_FLAG_DELETE);
+}
+
+inline bool id_page_is_update_flag(id_page_t *pId_page)
+{
+ return id_page_has_same_flag(pId_page, ID_PAGE_FLAG_UPDATE);
+}
+
+inline bool id_page_is_unchanged_flag(id_page_t *pId_page)
+{
+ return id_page_has_same_flag(pId_page, ID_PAGE_FLAG_UNCHANGED);
+}
+
+inline unsigned int id_page_get_page_index(id_page_t *pId_page)
+{
+ return pId_page->page_index;
+}
+
+inline void id_page_set_page_index(id_page_t *pId_page, unsigned int index)
+{
+ pId_page->page_index = index;
+}
+
+inline bool id_page_is_bit_on(id_page_t *pId_page, unsigned int offset)
+{
+ return __is_bit_on(offset, pId_page->bits);
+}
+
+inline bool id_page_is_bit_off(id_page_t *pId_page, unsigned int offset)
+{
+ return __is_bit_off(offset, pId_page->bits);
+}
+
+inline bool id_page_set_bit_on(id_page_t *pId_page, unsigned int offset)
+{
+ bool success = false;
+ if (id_page_is_bit_off(pId_page, offset)) {
+ success = true;
+ __set_bit_on(offset, pId_page->bits);
+ (pId_page->free_bit_cnt)--;
+ }
+
+ return success;
+}
+
+inline bool id_page_set_bit_off(id_page_t *pId_page, unsigned int offset)
+{
+ bool success = false;
+ if (id_page_is_bit_on(pId_page, offset)) {
+ success = true;
+ __set_bit_off(offset, pId_page->bits);
+ (pId_page->free_bit_cnt)++;
+ }
+
+ return success;
+}
+
+bool id_page_find_next_free_offset(id_page_t *id_page, unsigned int search_start_offset, unsigned int *next_free_offset)
+{
+ bool found = false;
+
+ unsigned int i = 0;
+ unsigned int end_offset = id_page->page_bit_cnt;
+ for (i = search_start_offset; i < end_offset; i++) {
+ if (id_page_is_bit_off(id_page, i)) {
+ found = true;
+ *next_free_offset = i;
+ break;
+ }
+ }
+
+ return found;
+}
+
+id_provider_change_tracking_t *id_provider_change_tracking_alloc()
+{
+ id_provider_change_tracking_t *pTracking = (id_provider_change_tracking_t *)malloc(sizeof(id_provider_change_tracking_t));
+
+ if (pTracking == NULL) {
+ goto error_part;
+ }
+
+ fw_list_init(&(pTracking->id_page_add_list_head));
+ fw_list_init(&(pTracking->id_page_update_list_head));
+ fw_list_init(&(pTracking->id_page_delete_list_head));
+ fw_list_init(&(pTracking->id_page_unchanged_list_head));
+
+ return pTracking;
+
+error_part:
+ return NULL;
+}
+
+void id_provider_change_tracking_free(id_provider_change_tracking_t *pTracking)
+{
+ if (pTracking != NULL) {
+ /* Do not free pages linked with list. */
+ free(pTracking);
+ }
+}
+
+inline fw_list_node_t *id_provider_change_tracking_get_list(id_provider_change_tracking_t *pTracking, id_page_flag_t flag)
+{
+ fw_list_node_t *pHead = NULL;
+
+ switch (flag) {
+ case ID_PAGE_FLAG_UNCHANGED:
+ pHead = &(pTracking->id_page_unchanged_list_head);
+ break;
+ case ID_PAGE_FLAG_ADD:
+ pHead = &(pTracking->id_page_add_list_head);
+ break;
+ case ID_PAGE_FLAG_DELETE:
+ pHead = &(pTracking->id_page_delete_list_head);
+ break;
+ case ID_PAGE_FLAG_UPDATE:
+ pHead = &(pTracking->id_page_update_list_head);
+ break;
+ default:
+ pHead = NULL;
+ }
+
+ return pHead;
+}
+
+id_provider_t *id_provider_create_internal(bool persistent_mode, unsigned int code, unsigned int total_free_bit_cnt, unsigned int id_max, unsigned int log2_page_size, bool support_thread_safety)
+{
+ if (!g_thread_supported()) {
+ g_thread_init(NULL);
+ }
+
+ id_provider_t *pProvider = (id_provider_t *)calloc(1, sizeof(id_provider_t));
+ if (pProvider == NULL) {
+ goto error_part;
+ }
+
+ /* TODO : validation of input */
+ pProvider->persistent_mode = persistent_mode;
+ pProvider->code = code;
+
+ pProvider->tracking = false;
+
+ pProvider->support_thread_safety = support_thread_safety;
+
+ if (support_thread_safety) {
+ pProvider->mutex = g_mutex_new();
+ if (pProvider->mutex == NULL) {
+ goto error_part;
+ }
+ }
+
+ pProvider->id_max = id_max;
+
+ pProvider->log2_page_size = log2_page_size;
+ pProvider->page_size = (1 << log2_page_size);
+ pProvider->bits_per_page = BITS_PER_PAGE(pProvider->page_size);
+
+ pProvider->total_free_cnt = total_free_bit_cnt;
+ pProvider->last_id = id_max; /* To provide 0 for first id */
+
+ pProvider->id_page_cnt = ID_PAGE_CNT(id_max, pProvider->bits_per_page);
+ pProvider->id_page_array = (id_page_t **)calloc(pProvider->id_page_cnt, sizeof(id_page_t *));
+ if (pProvider->id_page_array == NULL) {
+ goto error_part;
+ }
+
+ pProvider->pTracking = id_provider_change_tracking_alloc();
+ if (pProvider->pTracking == NULL) {
+ goto error_part;
+ }
+
+ return pProvider;
+
+error_part:
+ id_provider_destroy(pProvider);
+ return NULL;
+}
+
+inline void id_provider_init_routine()
+{
+ if (!g_thread_supported()) {
+ g_thread_init(NULL);
+ }
+}
+
+inline void id_provider_lock(id_provider_t *pId_provider)
+{
+ if (pId_provider->support_thread_safety) {
+ g_mutex_lock(pId_provider->mutex);
+ }
+}
+
+inline void id_provider_unlock(id_provider_t *pId_provider)
+{
+ if (pId_provider->support_thread_safety) {
+ g_mutex_unlock(pId_provider->mutex);
+ }
+}
+
+inline bool id_provider_is_valid_id_range(id_provider_t *pId_provider, unsigned int id)
+{
+ if (id < 0 || id > pId_provider->id_max) {
+ return false;
+ }
+ return true;
+}
+
+inline bool id_provider_is_valid_page_index(id_provider_t *pId_provider, unsigned int id_page_index)
+{
+ if (id_page_index < 0 || id_page_index >= pId_provider->id_page_cnt) {
+ return false;
+ }
+ return true;
+}
+
+inline bool id_provider_is_last_page_index(id_provider_t *pId_provider, unsigned int id_page_index)
+{
+ if (id_page_index == pId_provider->id_page_cnt - 1) {
+ return true;
+ }
+ return false;
+}
+
+inline unsigned int id_provider_calculate_offset_in_page(unsigned int id, unsigned int bits_per_page)
+{
+ return (id & BITS_PER_PAGE_MASK(bits_per_page));
+}
+
+inline unsigned int id_provider_calculate_id(id_provider_t *pProvider, unsigned int id_page_index, unsigned int offset)
+{
+ return id_page_index * pProvider->bits_per_page + offset;
+}
+
+inline unsigned int id_provider_calculate_id_page_array_index(id_provider_t *pId_provider, unsigned int id)
+{
+ return id / pId_provider->bits_per_page;
+}
+
+inline id_provider_error_t id_provider_calculate_page_cnt_for_id_page(id_provider_t *pId_provider, unsigned int id_page_index, unsigned int *page_cnt)
+{
+ id_provider_error_t error = ID_PROVIDER_OK;
+ unsigned int out_page_cnt = 0;
+
+ if (!id_provider_is_valid_page_index(pId_provider, id_page_index)) {
+ error = ID_PROVIDER_NOT_EXIST_PAGE;
+ goto return_part;
+ }
+
+ if (id_provider_is_last_page_index(pId_provider, id_page_index)) {
+ out_page_cnt = (pId_provider->id_max + 1) - ((pId_provider->id_page_cnt - 1) * (pId_provider->bits_per_page));
+ } else {
+ out_page_cnt = pId_provider->bits_per_page;
+ }
+
+return_part:
+ if (error == ID_PROVIDER_OK) {
+ *page_cnt = out_page_cnt;
+ }
+ return error;
+}
+
+inline id_provider_error_t id_provider_fetch_id_page_by_index(id_provider_t *pId_provider, unsigned int index, id_page_t **ppId_page)
+{
+ FW_LOGD("start with index = %u", index);
+ id_provider_error_t error = ID_PROVIDER_OK;
+ id_page_t *pId_page = NULL;
+
+ if (!id_provider_is_valid_page_index(pId_provider, index)) {
+ error = ID_PROVIDER_NOT_EXIST_PAGE;
+ goto return_part;
+ }
+
+ pId_page = pId_provider->id_page_array[index];
+ if (pId_page == NULL) {
+ if (pId_provider->persistent_mode) {
+ /* load db page */
+ id_provider_error_t load_error = id_provider_load_id_page(pId_provider, index, &pId_page);
+ if (load_error == ID_PROVIDER_OK) {
+ goto return_part;
+ }
+
+ /* if db page does not exist, then add new page by below lines */
+ assert(load_error == ID_PROVIDER_PERSISTENT_NOT_EXIST_PAGE);
+ }
+
+ /* add new page */
+ pId_page = id_provider_add_id_page(pId_provider, index);
+ if (pId_page == NULL) {
+ error = ID_PROVIDER_NOT_ENOUGH_MEMORY;
+ goto return_part;
+ }
+ }
+
+return_part:
+ if (error == ID_PROVIDER_OK) {
+ *ppId_page = pId_page;
+ }
+
+ FW_LOGD("end with error = %d", error);
+
+ return error;
+}
+
+inline id_provider_error_t id_provider_fetch_id_page(id_provider_t *pId_provider, unsigned int id, id_page_t **ppId_page)
+{
+ FW_LOGD("start with id = %u", id);
+ id_provider_error_t error = ID_PROVIDER_OK;
+
+ unsigned int id_page_array_index = 0;
+ id_page_t *pId_page = NULL;
+
+ if (!id_provider_is_valid_id_range(pId_provider, id)) {
+ error = ID_PROVIDER_OUT_OF_ID_RANGE;
+ goto return_part;
+ }
+
+ id_page_array_index = id_provider_calculate_id_page_array_index(pId_provider, id);
+ error = id_provider_fetch_id_page_by_index(pId_provider, id_page_array_index, &pId_page);
+
+return_part:
+ if (error == ID_PROVIDER_OK) {
+ *ppId_page = pId_page;
+ }
+
+ FW_LOGD("end with error = %d", error);
+
+ return error;
+}
+
+inline id_provider_error_t id_provider_set_id_page_index(id_provider_t *pId_provider, id_page_t *pId_page, unsigned int index)
+{
+ id_provider_error_t id_error = ID_PROVIDER_OK;
+ bool valid_page_index = id_provider_is_valid_page_index(pId_provider, index);
+
+ if (valid_page_index) {
+ id_page_set_page_index(pId_page, index);
+ pId_provider->id_page_array[index] = pId_page;
+ } else {
+ id_error = ID_PROVIDER_NOT_EXIST_PAGE;
+ }
+
+ return id_error;
+}
+
+void id_provider_move_id_page(id_provider_t *pId_provider, id_page_t *id_page, id_page_flag_t next)
+{
+ id_page_flag_t prev = id_page_get_flag(id_page);
+ if (prev == next) {
+ return;
+ }
+
+ fw_list_node_t *pNextHead = id_provider_change_tracking_get_list(pId_provider->pTracking, next);
+
+ /* move from previous list to next list */
+
+ if ((id_page->link.prev == NULL) && (id_page->link.next == NULL)) {
+ fw_list_add_node(&(id_page->link), pNextHead);
+ } else {
+ fw_list_move_node(&(id_page->link), pNextHead);
+ }
+
+ /* set id_page_flag */
+ id_page_set_flag(id_page, next);
+}
+
+void id_provider_remove_id_page(id_provider_t *pId_provider, id_page_t *id_page)
+{
+ unsigned int id_page_index = 0;
+
+ /* remove from list */
+ if (!id_page_is_unknown_flag(id_page)) {
+ if ((id_page->link.prev == NULL) && (id_page->link.next == NULL)) {
+ /* DO NOTHING */
+ } else {
+ fw_list_delete_node(&(id_page->link));
+ }
+ }
+
+ /* set id_page_array NULL */
+ id_page_index = id_page_get_page_index(id_page);
+ pId_provider->id_page_array[id_page_index] = NULL;
+
+ /* free id page */
+ id_page_free(id_page);
+}
+
+id_page_t *id_provider_add_id_page(id_provider_t *pId_provider, unsigned int page_index)
+{
+ FW_LOGD("start with page_index = %u", page_index);
+ id_page_t *pId_page = NULL;
+ unsigned int page_cnt_for_new_id_page = 0;
+ id_provider_error_t error = ID_PROVIDER_OK;
+ error = id_provider_calculate_page_cnt_for_id_page(pId_provider, page_index, &page_cnt_for_new_id_page);
+ assert(error == ID_PROVIDER_OK);
+
+ /* validation */
+ if (pId_provider->id_page_array[page_index] != NULL) {
+ goto return_part;
+ }
+
+ /* get page */
+ pId_page = id_page_alloc_new_page(page_index, page_cnt_for_new_id_page);
+ if (pId_page == NULL) {
+ goto return_part;
+ }
+
+ /* set page at array */
+ pId_provider->id_page_array[page_index] = pId_page;
+
+ /* assign page to add list */
+ id_provider_move_id_page(pId_provider, pId_page, ID_PAGE_FLAG_ADD);
+
+return_part:
+ FW_LOGD("end with pId_page = %x", pId_page);
+ return pId_page;
+}
+
+id_provider_error_t id_provider_load_id_page(id_provider_t *pId_provider, unsigned int page_index, id_page_t **id_page)
+{
+ FW_LOGD("start with page_index = %u", page_index);
+ id_provider_error_t id_error = ID_PROVIDER_OK;
+ id_page_t *pId_page = NULL;
+
+ /* get page bit cnt */
+ unsigned int page_bit_cnt = 0;
+ id_error = id_provider_calculate_page_cnt_for_id_page(pId_provider, page_index, &page_bit_cnt);
+ assert(id_error == ID_PROVIDER_OK);
+
+ /* load page */
+ pId_page = id_page_load(pId_provider->code, page_index, page_bit_cnt);
+
+ if (pId_page != NULL) {
+ /* set page at array */
+ pId_provider->id_page_array[page_index] = pId_page;
+
+ /* assign page to unchanged list */
+ id_provider_move_id_page(pId_provider, pId_page, ID_PAGE_FLAG_UNCHANGED);
+ } else {
+ id_error = ID_PROVIDER_PERSISTENT_NOT_EXIST_PAGE;
+ }
+
+ if (id_error == ID_PROVIDER_OK) {
+ *id_page = pId_page;
+ }
+
+ FW_LOGD("end with id_error = %d", id_error);
+ return id_error;
+}
+
+bool id_provider_set_id_page_bit_on(id_provider_t *pId_provider, id_page_t *id_page, unsigned int offset)
+{
+ bool bit_on_success = id_page_set_bit_on(id_page, offset);
+
+ if (bit_on_success) {
+ assert(!id_page_is_unknown_flag(id_page));
+
+ /* If page is in add or update list, then DO NOTHING */
+
+ /* If page is in unchanged or delete list, then move page to update list */
+ if (id_page_is_unchanged_flag(id_page) || id_page_is_delete_flag(id_page)) {
+ id_provider_move_id_page(pId_provider, id_page, ID_PAGE_FLAG_UPDATE);
+ }
+
+ (pId_provider->total_free_cnt)--;
+ }
+
+ return bit_on_success;
+}
+
+bool id_provider_set_id_page_bit_off(id_provider_t *pId_provider, id_page_t *id_page, unsigned int offset)
+{
+ bool bit_off_success = id_page_set_bit_off(id_page, offset);
+ bool is_empty_page = false;
+
+ if (bit_off_success) {
+ assert(!id_page_is_unknown_flag(id_page));
+ assert(!id_page_is_delete_flag(id_page));
+
+ is_empty_page = id_page_is_empty(id_page);
+ if (is_empty_page) {
+ /* If page is in update or unchanged list, then move to delete list */
+ if (id_page_is_update_flag(id_page) || id_page_is_unchanged_flag(id_page)) {
+ id_provider_move_id_page(pId_provider, id_page, ID_PAGE_FLAG_DELETE);
+ }
+
+ /* If page is in add list, then remove in list & free page */
+ if (id_page_is_add_flag(id_page)) {
+ id_provider_remove_id_page(pId_provider, id_page);
+ }
+ } else {
+ /* If page is in unchaged list, then move to update list */
+ if (id_page_is_unchanged_flag(id_page)) {
+ id_provider_move_id_page(pId_provider, id_page, ID_PAGE_FLAG_UPDATE);
+ }
+ }
+
+ (pId_provider->total_free_cnt)++;
+ }
+
+ return bit_off_success;
+}
+
+void id_provider_reset_tracking_info(id_provider_t *pId_provider)
+{
+ id_provider_change_tracking_t *pTracking = pId_provider->pTracking;
+ id_page_t *page = NULL;
+ fw_list_node_t *iter = NULL;
+ fw_list_node_t *add_page_list = &(pTracking->id_page_add_list_head);
+ fw_list_node_t *update_page_list = &(pTracking->id_page_update_list_head);
+ fw_list_node_t *delete_page_list = &(pTracking->id_page_delete_list_head);
+
+ /* add list handling : move to unchaged list */
+ for (iter = add_page_list; iter != add_page_list;) {
+ page = (id_page_t *)iter;
+ iter = iter->next;
+ id_provider_move_id_page(pId_provider, page, ID_PAGE_FLAG_UNCHANGED);
+ }
+
+ /* update list handling : move to unchaged list */
+ for (iter = update_page_list; iter != update_page_list;) {
+ page = (id_page_t *)iter;
+ iter = iter->next;
+ id_provider_move_id_page(pId_provider, page, ID_PAGE_FLAG_UNCHANGED);
+ }
+
+ /* delete list handling : remove id page */
+ for (iter = delete_page_list; iter != delete_page_list;) {
+ page = (id_page_t *)iter;
+ iter = iter->next;
+ id_provider_remove_id_page(pId_provider, page);
+ }
+}
+
+void id_provider_destroy_id_page_array(unsigned int id_page_cnt, id_page_t **id_page_array)
+{
+ if (id_page_array != NULL) {
+ unsigned int i = 0;
+ id_page_t *id_page = NULL;
+
+ for (i = 0; i < id_page_cnt; i++) {
+ id_page = id_page_array[i];
+ if (id_page != NULL) {
+ id_page_free(id_page);
+ }
+ }
+ free(id_page_array);
+ }
+}
+
+/* external interfaces */
+id_provider_error_t id_persistent_provider_create(unsigned int code, unsigned int id_max, unsigned int log2_page_size)
+{
+ id_provider_error_t id_error = ID_PROVIDER_OK;
+
+ daci_id_provider id_provider;
+ id_provider.id_provider_code = code;
+ id_provider.id_capacity = id_max;
+ id_provider.bit_per_page = BITS_PER_PAGE(1 << log2_page_size);
+ id_provider.last_id = id_max;
+ id_provider.free_bit_cnt = id_max + 1;
+
+ DACI_RETURN ret = DACI_Add_ID_Provider(&id_provider);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGD("Failed DACI_Add_ID_Provider()\n");
+ id_error = ID_PROVIDER_PERSISTENT_CREATE_ERROR;
+ } else {
+ FW_LOGD("Success DACI_Add_ID_Provider()\n");
+ }
+
+ return id_error;
+}
+
+id_provider_t *id_persistent_provider_load(unsigned int code, bool support_thread_safety)
+{
+ id_provider_t *pProvider = NULL;
+ daci_id_provider *got_id_provider = NULL;
+
+ /* get information from id provider DB */
+ DACI_RETURN ret = DACI_Get_ID_Provider(code, &got_id_provider);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGD("Failed DACI_Get_ID_Provider()\n");
+ /* TODO : error handling */
+
+ goto return_part;
+ } else {
+ FW_LOGD("Success DACI_Get_ID_Provider()\n");
+ }
+
+ FW_LOGD("id_capacity : %d\n", got_id_provider->id_capacity);
+ FW_LOGD("bit_per_page : %d\n", got_id_provider->bit_per_page);
+ FW_LOGD("last_id : %d\n", got_id_provider->last_id);
+ FW_LOGD("free_bit_cnt : %d\n", got_id_provider->free_bit_cnt);
+
+ unsigned int log2_page_size = (unsigned int)log2((got_id_provider->bit_per_page) / 8);
+
+ pProvider = id_provider_create_internal(true, code, got_id_provider->free_bit_cnt, got_id_provider->id_capacity, log2_page_size, support_thread_safety);
+
+return_part:
+ if (got_id_provider != NULL) {
+ free(got_id_provider);
+ }
+
+ return pProvider;
+}
+
+id_provider_error_t id_persistent_provider_update(id_provider_t *pId_provider)
+{
+ FW_LOGD("started");
+ id_provider_error_t id_error = ID_PROVIDER_OK;
+
+ /* id_provider_tbl update */
+ daci_id_provider da_id_provider;
+ da_id_provider.id_provider_code = pId_provider->code;
+ da_id_provider.last_id = pId_provider->last_id;
+ da_id_provider.free_bit_cnt = pId_provider->total_free_cnt;
+
+ DACI_RETURN ret = DACI_Update_ID_Provider(&da_id_provider);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGD("Failed DACI_Update_ID_Provider()");
+ assert(false);
+ } else {
+ FW_LOGV("Success DACI_Update_ID_Provider()");
+ }
+
+ /* id_page_tbl update */
+ id_provider_change_tracking_t *pTracking = pId_provider->pTracking;
+ id_page_t *page = NULL;
+ fw_list_node_t *iter = NULL;
+ fw_list_node_t *add_page_list = &(pTracking->id_page_add_list_head);
+ fw_list_node_t *update_page_list = &(pTracking->id_page_update_list_head);
+ fw_list_node_t *delete_page_list = &(pTracking->id_page_delete_list_head);
+ unsigned int page_byte_size = 0;
+
+ daci_id_page id_page;
+ id_page.id_provider_code = pId_provider->code;
+
+ /* add list handling */
+/* for (iter = add_page_list->next; iter != add_page_list; iter = iter->next) { */
+ fw_list_iter(iter, add_page_list) {
+ page = (id_page_t *)iter;
+ id_page.page_index = page->page_index;
+ id_page.page_bit = page->bits;
+
+ page_byte_size = DIVIDE_INT_ROUND_UP(page->page_bit_cnt, 8);
+
+ /* add page to db */
+ ret = DACI_Add_ID_Page(&id_page, page_byte_size);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGD("Failed DACI_Add_ID_Page()\n");
+ assert(false);
+ } else {
+ FW_LOGD("Success DACI_Add_ID_Page()\n");
+ }
+ }
+
+ /* update list handling */
+/* for (iter = add_page_list->next; iter != update_page_list; iter = iter->next) { */
+ fw_list_iter(iter, update_page_list) {
+ page = (id_page_t *)iter;
+ id_page.page_index = page->page_index;
+ id_page.page_bit = page->bits;
+
+ page_byte_size = DIVIDE_INT_ROUND_UP(page->page_bit_cnt, 8);
+
+ /* update page to db */
+ ret = DACI_Update_ID_Page(&id_page, page_byte_size);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGD("Failed DACI_Update_ID_Page()\n");
+ assert(false);
+ } else {
+ FW_LOGD("Success DACI_Update_ID_Page()\n");
+ }
+ }
+
+ /* delete list handling */
+/*for (iter = add_page_list->next; iter != delete_page_list; iter = iter->next) { */
+ fw_list_iter(iter, delete_page_list) {
+ page = (id_page_t *)iter;
+
+ /* delete page in db */
+ ret = DACI_Delete_ID_Page(pId_provider->code, page->page_index);
+ if (ret != DACI_SUCCESS) {
+ FW_LOGD("Failed DACI_Delete_ID_Page()\n");
+ assert(false);
+ } else {
+ FW_LOGD("Success DACI_Delete_ID_Page()\n");
+ }
+ }
+
+ FW_LOGD("ended");
+ return id_error;
+}
+
+id_provider_t *id_provider_create(unsigned int id_max, unsigned int log2_page_size, bool support_thread_safety)
+{
+ id_provider_init_routine();
+
+ unsigned int total_free_bit_cnt = id_max + 1; /* Since 0, 1, ..., id_max */
+ return id_provider_create_internal(false, 0, total_free_bit_cnt, id_max, log2_page_size, support_thread_safety);
+}
+
+void id_provider_destroy(id_provider_t *pId_provider)
+{
+ id_provider_init_routine();
+
+ if (pId_provider != NULL) {
+ if (pId_provider->support_thread_safety && pId_provider->mutex != NULL) {
+ g_mutex_free(pId_provider->mutex);
+ }
+
+ id_provider_destroy_id_page_array(pId_provider->id_page_cnt, pId_provider->id_page_array);
+
+ if (pId_provider->pTracking != NULL) {
+ id_provider_change_tracking_free(pId_provider->pTracking);
+ }
+
+ free(pId_provider);
+ }
+}
+
+id_provider_error_t id_provider_tracking_mode_on(id_provider_t *pId_provider)
+{
+ id_provider_error_t id_error = ID_PROVIDER_OK;
+ id_provider_init_routine();
+
+ if (pId_provider == NULL) {
+ FW_LOGD("Error. pId_provider == NULL\n");
+ return ID_PROVIDER_NOT_EXIST_ID;
+ }
+
+ if (pId_provider->support_thread_safety) {
+ id_provider_lock(pId_provider);
+ }
+
+ if (pId_provider->tracking) {
+ id_error = ID_PROVIDER_ALREADY_TRACKING_MODE_ON;
+ } else {
+ pId_provider->tracking = true;
+ }
+
+ if (pId_provider->support_thread_safety) {
+ id_provider_unlock(pId_provider);
+ }
+
+ return id_error;
+}
+
+id_provider_error_t id_provider_tracking_mode_off(id_provider_t *pId_provider)
+{
+ id_provider_error_t id_error = ID_PROVIDER_OK;
+ id_provider_init_routine();
+
+ if (pId_provider == NULL) {
+ FW_LOGD("Error. pId_provider == NULL\n");
+ return ID_PROVIDER_NOT_EXIST_ID;
+ }
+
+ if (pId_provider->support_thread_safety) {
+ id_provider_lock(pId_provider);
+ }
+
+ if (!(pId_provider->tracking)) {
+ id_error = ID_PROVIDER_ALREADY_TRACKING_MODE_OFF;
+ } else {
+ pId_provider->tracking = false;
+ id_provider_reset_tracking_info(pId_provider);
+ }
+
+ if (pId_provider->support_thread_safety) {
+ id_provider_unlock(pId_provider);
+ }
+
+ return id_error;
+}
+
+id_provider_error_t id_provider_provide_id(id_provider_t *pId_provider, unsigned int *new_id)
+{
+ FW_LOGD("start");
+ id_provider_init_routine();
+
+ id_provider_error_t error = ID_PROVIDER_OK;
+
+ unsigned int out_new_id = 0;
+
+ unsigned int max_id = pId_provider->id_max;
+ unsigned int bits_per_page = pId_provider->bits_per_page;
+
+ unsigned int offset = 0;
+ id_page_t *id_page = NULL;
+ unsigned int id_page_index = 0;
+
+ id_provider_lock(pId_provider);
+
+ assert(pId_provider->total_free_cnt >= 0);
+ if (pId_provider->total_free_cnt == 0) {
+ error = ID_PROVIDER_NOT_ENOUGH_ID;
+ goto error_part;
+ }
+
+ /* find new id to provide */
+ {
+ /* set first candidate as last id + 1 */
+ out_new_id = (pId_provider->last_id + 1) % (max_id + 1);
+
+ /* find id_page of first candidate */
+ error = id_provider_fetch_id_page(pId_provider, out_new_id, &id_page);
+ if (error != ID_PROVIDER_OK) {
+ goto error_part;
+ }
+ assert(id_page != NULL);
+ assert(id_page->bits != NULL);
+
+ /* calculate page_index & offset in id_page of first candidate */
+ id_page_index = id_page_get_page_index(id_page);
+ offset = id_provider_calculate_offset_in_page(out_new_id, bits_per_page);
+
+ /* note that below loop will be finished in the end, since pId_provider->total_free_cnt > 0, we must have one free id */
+ while (true) {
+
+ /* we have to look other page, since this page is full */
+ if (id_page->free_bit_cnt == 0) {
+ if (id_provider_is_last_page_index(pId_provider, id_page_index)) {
+ id_page_index = 0;
+ } else {
+ id_page_index++;
+ }
+
+ offset = 0;
+ error = id_provider_fetch_id_page_by_index(pId_provider, id_page_index, &id_page);
+ if (error != ID_PROVIDER_OK) {
+ goto error_part;
+ }
+
+ continue;
+ }
+
+ /* we can provide not reserved id in this page */
+ if (id_page_is_bit_off(id_page, offset)) {
+ FW_LOGD("page_bit off at id_page = %u, offset = %u", id_page_index, offset);
+ /* DO NOTHING */
+ } else {
+ FW_LOGD("page_bit on at id_page = %u, offset = %u", id_page_index, offset);
+ /* encounter already used id since we have once reached max id */
+ /* in this case, find next free id */
+ unsigned int next_offset = 0;
+
+ bool find_next_free_offset_success = id_page_find_next_free_offset(id_page, offset, &next_offset);
+ assert(find_next_free_offset_success);
+
+ offset = next_offset;
+ }
+ out_new_id = id_provider_calculate_id(pId_provider, id_page_index, offset);
+ break;
+ }
+
+ bool set_bit_on_success = id_provider_set_id_page_bit_on(pId_provider, id_page, offset);
+ assert(set_bit_on_success);
+
+ pId_provider->last_id = out_new_id;
+ *new_id = out_new_id;
+ }
+
+error_part:
+ if (error == ID_PROVIDER_OK && !(pId_provider->tracking)) {
+ id_provider_reset_tracking_info(pId_provider);
+ }
+
+ id_provider_unlock(pId_provider);
+ FW_LOGD("end with error = %d, provided id = %u (page index = %u, offset = %u)", error, out_new_id, id_page_index, offset);
+ return error;
+}
+
+id_provider_error_t id_provider_delete_id(id_provider_t *pId_provider, unsigned int id)
+{
+ id_provider_init_routine();
+
+ id_provider_error_t err = ID_PROVIDER_OK;
+
+ unsigned int bits_per_page = pId_provider->bits_per_page;
+ id_page_t *id_page = NULL;
+ unsigned int offset = 0;
+
+ id_provider_lock(pId_provider);
+
+ if (!id_provider_is_valid_id_range(pId_provider, id)) {
+ err = ID_PROVIDER_OUT_OF_ID_RANGE;
+ goto error_part;
+ }
+
+ offset = id_provider_calculate_offset_in_page(id, bits_per_page);
+ err = id_provider_fetch_id_page(pId_provider, id, &id_page);
+ if (err != ID_PROVIDER_OK) {
+ goto error_part;
+ }
+
+ if (!id_provider_set_id_page_bit_off(pId_provider, id_page, offset)) {
+ /* bit already off case */
+ err = ID_PROVIDER_NOT_EXIST_ID;
+ }
+
+error_part:
+ if (err == ID_PROVIDER_OK && !(pId_provider->tracking)) {
+ id_provider_reset_tracking_info(pId_provider);
+ }
+ id_provider_unlock(pId_provider);
+ return err;
+}
+
+unsigned int id_provider_get_total_free_cnt(id_provider_t *pId_provider)
+{
+ return pId_provider->total_free_cnt;
+}
diff --git a/framework/src/Utility/fw_thread.c b/framework/src/Utility/fw_thread.c
new file mode 100755
index 0000000..ff46b03
--- /dev/null
+++ b/framework/src/Utility/fw_thread.c
@@ -0,0 +1,86 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include "Utility/fw_thread.h"
+#include <stdlib.h>
+
+pthread_mutex_t *fw_alloc_init_mutex()
+{
+ pthread_mutex_t *mutex = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t));
+ if (mutex == NULL) {
+ goto return_part;
+ }
+ if (0 != pthread_mutex_init(mutex, NULL)) {
+ free(mutex);
+ mutex = NULL;
+ goto return_part;
+ }
+
+return_part:
+ return mutex;
+}
+
+void fw_free_mutex(pthread_mutex_t *mutex)
+{
+ if (mutex != NULL) {
+ pthread_mutex_destroy(mutex);
+ free(mutex);
+ }
+}
+
+pthread_cond_t *fw_alloc_init_thread_cond()
+{
+ pthread_cond_t *thread_cond = (pthread_cond_t *)malloc(sizeof(pthread_cond_t));
+ if (thread_cond == 0) {
+ goto return_part;
+ }
+
+ if (0 != pthread_cond_init(thread_cond, 0)) {
+ free(thread_cond);
+ thread_cond = 0;
+ goto return_part;
+ }
+
+return_part:
+ return thread_cond;
+}
+
+void fw_free_thread_cond(pthread_cond_t *thread_cond)
+{
+ if (thread_cond != 0) {
+ pthread_cond_destroy(thread_cond);
+ free(thread_cond);
+ }
+}
diff --git a/framework/src/Utility/fw_time.c b/framework/src/Utility/fw_time.c
new file mode 100755
index 0000000..12696be
--- /dev/null
+++ b/framework/src/Utility/fw_time.c
@@ -0,0 +1,71 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include "Utility/fw_time.h"
+#include "Utility/fw_log.h"
+#define LOG_TAG "AF_TIME"
+
+static int get_time_zone_second();
+static int get_daylight_second();
+
+int FW_Convert_Seconds_To_UTC(int seconds)
+{
+ seconds += get_time_zone_second();
+ seconds += get_daylight_second();
+
+ return seconds;
+}
+
+static int get_time_zone_second()
+{
+ int timeZone;
+ tzset();
+ timeZone = timezone;
+ FW_LOGI("time zone : %d", timeZone);
+ timeZone = timeZone * -1;
+ return timeZone;
+}
+
+static int get_daylight_second()
+{
+ int dayLight;
+ tzset();
+ dayLight = daylight;
+ FW_LOGI("daylight = %d", dayLight);
+ if (dayLight == 0) {
+ return 0;
+ }
+ return 3600;
+}
diff --git a/framework/src/Utility/fw_timer.c b/framework/src/Utility/fw_timer.c
new file mode 100755
index 0000000..ac0a9fe
--- /dev/null
+++ b/framework/src/Utility/fw_timer.c
@@ -0,0 +1,175 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include "Utility/fw_list.h"
+#include "Utility/fw_timer.h"
+#include "Utility/fw_log.h"
+
+#define LOG_TAG "AF_TIMER"
+
+#include <string.h>
+#include <stdlib.h>
+
+static fw_timer_element_t *fw_timer_element_alloc(char *label);
+static void fw_timer_element_free(fw_timer_element_t *pElement);
+static double calculate_diff_time(fw_timer_element_t *pElement);
+
+static fw_timer_element_t *fw_timer_element_alloc(char *label)
+{
+ fw_timer_element_t *pElement = NULL;
+ char *dest_label = NULL;
+ if (label == NULL) {
+ goto return_part;
+ }
+
+ pElement = (fw_timer_element_t *)calloc(1, sizeof(fw_timer_element_t));
+ if (pElement == NULL) {
+ FW_LOGE("fw_timer_element alloc failed because of out of memory");
+ goto return_part;
+ }
+ dest_label = pElement->label;
+
+ /* set label */
+ strncpy(dest_label, label, FW_TIMER_MAX_LABEL_LEN + 1);
+
+return_part:
+ return pElement;
+}
+
+static void fw_timer_element_free(fw_timer_element_t *pElement)
+{
+ if (pElement != NULL) {
+ free(pElement);
+ }
+}
+
+fw_timer_t *fw_timer_alloc()
+{
+ fw_timer_t *pTimer = (fw_timer_t *)malloc(sizeof(fw_timer_t));
+
+ if (pTimer != NULL) {
+ fw_list_init(&(pTimer->element_head));
+ } else {
+ FW_LOGE("fw_timer_alloc failed because of out of memory");
+ }
+
+ return pTimer;
+}
+
+static double calculate_diff_time(fw_timer_element_t *pElement)
+{
+ double diff_time = 0.0;
+ double sTime = pElement->start_time.tv_sec + (pElement->start_time.tv_usec / 1000000.0);
+ double fTime = pElement->finish_time.tv_sec + (pElement->finish_time.tv_usec / 1000000.0);
+ diff_time = fTime - sTime;
+
+ return diff_time;
+}
+
+FW_ERROR fw_timer_start(fw_timer_t *pTimer, char *label)
+{
+ FW_ERROR err = FW_TIMER_OK;
+ if (pTimer == NULL) {
+ err = FW_TIMER_INVALID_TIMER;
+ goto return_part;
+ }
+
+ fw_timer_element_t *pElement = fw_timer_element_alloc(label);
+ if (pElement == NULL) {
+ err = FW_TIMER_OUT_OF_MEMORY;
+ goto return_part;
+ }
+
+ /* set timer start time */
+ if (-1 == gettimeofday(&(pElement->start_time), NULL)) {
+ err = FW_TIMER_GETTIME_ERROR;
+ fw_timer_element_free(pElement);
+ goto return_part;
+ }
+
+ /* add list */
+ fw_list_add_node((fw_list_node_t *)pElement, &(pTimer->element_head));
+
+return_part:
+ return err;
+}
+
+FW_ERROR fw_timer_finish(fw_timer_t *pTimer, char *label, double *passed_sec)
+{
+ FW_ERROR err = FW_TIMER_OK;
+ fw_list_node_t *pIter = NULL;
+ fw_list_node_t *pHead = &(pTimer->element_head);
+ fw_timer_element_t *pElement = NULL;
+
+ /* find list node */
+ fw_list_iter(pIter, pHead) {
+ pElement = (fw_timer_element_t *)pIter;
+
+ if (strncmp(label, pElement->label, FW_TIMER_MAX_LABEL_LEN) != 0) {
+ continue;
+ }
+
+ if (-1 == gettimeofday(&(pElement->finish_time), NULL)) {
+ err = FW_TIMER_GETTIME_ERROR;
+ goto return_part;
+ } else {
+ /* calcuate passed_sec */
+ if (passed_sec != NULL) {
+ *passed_sec = calculate_diff_time(pElement);
+ }
+
+ break;
+ }
+ }
+
+return_part:
+ return err;
+}
+
+/* TODO */
+FW_ERROR fw_timer_print(fw_timer_t *pTimer)
+{
+ FW_ERROR err = FW_TIMER_OK;
+
+ return err;
+}
+
+/* TODO */
+FW_ERROR fw_timer_free(fw_timer_t *pTimer)
+{
+ FW_ERROR err = FW_TIMER_OK;
+
+ return err;
+}
diff --git a/framework/src/securityAssistant/EXT_SA_Encryption_Decryption.c b/framework/src/securityAssistant/EXT_SA_Encryption_Decryption.c
new file mode 100755
index 0000000..755f3b7
--- /dev/null
+++ b/framework/src/securityAssistant/EXT_SA_Encryption_Decryption.c
@@ -0,0 +1,147 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ * Sooyi Kim <sooyi.kim@samsung.com>
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "securityAssistant/EXT_SA_Encryption_Decryption.h"
+#include "securityAssistant/IN_SA_MD5.h"
+#include "securityAssistant/IN_SA_Cryptograhic_Hash_Function.h"
+
+#include "Utility/fw_log.h"
+
+#define LOG_TAG "AF_SA"
+
+static unsigned char *__encrypt_cryptograhic_hash(CRYPTOGRAHIC_HASH_FUNTION_TYPE type, const char *plain, int plain_len, const char *key, int key_len, CRYPTOGRAHIC_HASH_FUNTION_FLAGS flags);
+
+unsigned char *SA_Get_Encryption_Value(SA_ENCRYPTION_TYPE encryption_type, char *plain, int plain_length)
+{
+ unsigned char *encryption_text = 0;
+
+ switch (encryption_type) {
+ case SA_ENCRYPTION_BASIC:
+ {
+ FW_LOGI("SA_ENCRYPTION_BASIC");
+ }
+ break;
+ case SA_ENCRYPTION_MD5:
+ {
+ FW_LOGI("SA_ENCRYPTION_MD5");
+ unsigned char *digest = (unsigned char *)calloc(16, sizeof(unsigned char));
+ MD5GetDigest(plain, plain_length, digest);
+
+ /* print */
+ int i;
+ for (i = 0; i < strlen((const char *)digest); i++) {
+ FW_LOGI("%x", digest[i]);
+ }
+ FW_LOGI("\n");
+
+ encryption_text = digest;
+
+ }
+ break;
+ default:
+ /* no case */
+ break;
+ }
+
+ FW_LOGI("plain_text = %s, length = %d", plain, plain_length);
+ FW_LOGI("encrption_text = %s", encryption_text);
+ return encryption_text;
+}
+
+char *SA_Get_Decryption_Value(SA_ENCRYPTION_TYPE decryption_type, char *encryption_text)
+{
+ char *decyption_text = 0;
+
+ switch (decryption_type) {
+ case SA_ENCRYPTION_BASIC:
+ {
+ FW_LOGI("SA_DECRYPTION_BASIC");
+ }
+ break;
+ case SA_ENCRYPTION_MD5:
+ {
+ FW_LOGI("SA_DECRYPTION_MD5");
+ }
+ break;
+ default:
+ /* no case */
+ break;
+ }
+
+ FW_LOGI("encryption_text = %s", encryption_text);
+ FW_LOGI("decyption_text = %s", decyption_text);
+ return decyption_text;
+}
+
+unsigned char *SA_Encrypt_Cryptograhic_Hash(CRYPTOGRAHIC_HASH_FUNTION_TYPE type, const char *plain, int plain_len)
+{
+ return __encrypt_cryptograhic_hash(type, plain, plain_len, 0, 0, 0);
+}
+
+unsigned char *SA_Encrypt_Cryptograhic_Hash_With_Flags(CRYPTOGRAHIC_HASH_FUNTION_TYPE type, const char *plain, int plain_len, const char *key, int key_len, CRYPTOGRAHIC_HASH_FUNTION_FLAGS flags)
+{
+ return __encrypt_cryptograhic_hash(type, plain, plain_len, key, key_len, flags);
+}
+
+static unsigned char *__encrypt_cryptograhic_hash(CRYPTOGRAHIC_HASH_FUNTION_TYPE type, const char *plain, int plain_len, const char *key, int key_len, CRYPTOGRAHIC_HASH_FUNTION_FLAGS flags)
+{
+ unsigned char *crypt_data = 0;
+
+ switch (type) {
+ case CRYPTOGRAHIC_HASH_FUNTION_MD5:
+ {
+ FW_LOGV("CRYPTOGRAHIC_HASH_FUNTION_MD5");
+ crypt_data = crypt_MD5(flags, plain, plain_len, key, key_len);
+ }
+ break;
+ case CRYPTOGRAHIC_HASH_FUNTION_SHA1:
+ {
+ FW_LOGV("CRYPTOGRAHIC_HASH_FUNTION_SHA1");
+ crypt_data = crypt_SHA1(flags, plain, plain_len, key, key_len);
+ }
+ break;
+ default:
+ {
+ FW_LOGV("default");
+ }
+ break;
+ }
+
+ return crypt_data;
+}
diff --git a/framework/src/securityAssistant/IN_SA_Cryptograhic_Hash_Function.c b/framework/src/securityAssistant/IN_SA_Cryptograhic_Hash_Function.c
new file mode 100755
index 0000000..4178286
--- /dev/null
+++ b/framework/src/securityAssistant/IN_SA_Cryptograhic_Hash_Function.c
@@ -0,0 +1,158 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ * Sooyi Kim <sooyi.kim@samsung.com>
+ */
+
+#include "securityAssistant/IN_SA_Cryptograhic_Hash_Function.h"
+#include <gcrypt.h>
+#include <gpg-error.h>
+
+#include "Utility/fw_log.h"
+
+#define LOG_TAG "AF_SA"
+
+static unsigned char *__crypt_crytograhic_hash_function(int algo, const char *data, int data_len, const char *key, int key_len, int flags);
+static unsigned char *__crypt_symmetric_cipher_function(const char *plain, int plain_len, const char *key, int key_len, int flags);
+
+unsigned char *crypt_DES(const char *plain, int plain_len, const char *key, int key_len)
+{
+ int flags = 0;
+ return __crypt_symmetric_cipher_function(plain, plain_len, key, key_len, flags);
+}
+
+unsigned char *crypt_MD5(CRYPTOGRAHIC_HASH_FUNTION_FLAGS flags, const char *plain, int plain_len, const char *key, int key_len)
+{
+ unsigned char *crypt_data = 0;
+
+ switch (flags) {
+ case CRYPTOGRAHIC_HASH_FUN_HMAC:
+ {
+ FW_LOGV("CRYPTOGRAHIC_HASH_FUN_HMAC");
+ crypt_data = __crypt_crytograhic_hash_function(GCRY_MD_MD5, plain, plain_len, key, key_len, GCRY_MD_FLAG_HMAC);
+ }
+ break;
+ default:
+ {
+ FW_LOGV("default");
+ crypt_data = __crypt_crytograhic_hash_function(GCRY_MD_MD5, plain, plain_len, 0, 0, 0);
+ }
+ break;
+ }
+
+ return crypt_data;
+}
+
+unsigned char *crypt_SHA1(CRYPTOGRAHIC_HASH_FUNTION_FLAGS flags, const char *plain, int plain_len, const char *key, int key_len)
+{
+ unsigned char *crypt_data = 0;
+
+ switch (flags) {
+ case CRYPTOGRAHIC_HASH_FUN_HMAC:
+ {
+ FW_LOGV("CRYPTOGRAHIC_HASH_FUN_HMAC");
+ crypt_data = __crypt_crytograhic_hash_function(GCRY_MD_SHA1, plain, plain_len, key, key_len, GCRY_MD_FLAG_HMAC);
+ }
+ break;
+ default:
+ {
+ FW_LOGV("default");
+ crypt_data = __crypt_crytograhic_hash_function(GCRY_MD_SHA1, plain, plain_len, 0, 0, 0);
+ }
+ break;
+ }
+
+ return crypt_data;
+}
+
+static unsigned char *__crypt_crytograhic_hash_function(int algo, const char *data, int data_len, const char *key, int key_len, int flags)
+{
+ gcry_md_hd_t hd, hd2;
+ unsigned char *crypt_data = 0;
+ unsigned char *p = 0;
+ int crypt_data_len = 0;
+ int i;
+ gcry_error_t err = 0;
+
+ err = gcry_md_open(&hd, algo, flags);
+ if (err) {
+ FW_LOGV("algo %d, grcy_md_open failed: %s\n", algo, gpg_strerror(err));
+ return 0;
+ }
+
+ crypt_data_len = gcry_md_get_algo_dlen(algo);
+ if (crypt_data_len < 1 || crypt_data_len > 500) {
+ FW_LOGV("algo %d, grcy_md_get_algo_dlen failed: %d\n", algo, crypt_data_len);
+ return 0;
+ }
+
+ if (flags != 0) {
+ gcry_md_setkey(hd, key, key_len);
+ if (err) {
+ FW_LOGV("algo %d, grcy_md_setkey failed: %s\n", algo, gpg_strerror(err));
+ return 0;
+ }
+ }
+
+ if (*data == '!' && !data[1]) { /* hash one million times a "a" */
+ char aaa[1000];
+
+ /* Write in odd size chunks so that we test the buffering. */
+ memset(aaa, 'a', 1000);
+ for (i = 0; i < 1000; i++)
+ gcry_md_write(hd, aaa, 1000);
+ } else {
+ gcry_md_write(hd, data, data_len);
+ }
+
+ err = gcry_md_copy(&hd2, hd);
+ if (err) {
+ FW_LOGV("algo %d, gcry_md_copy failed: %s\n", algo, gpg_strerror(err));
+ }
+
+ gcry_md_close(hd);
+
+ p = gcry_md_read(hd2, algo);
+ if (p != 0) {
+ crypt_data = (unsigned char *)strdup((const char *)p);
+ }
+
+ gcry_md_close(hd2);
+
+ return crypt_data;
+}
+
+static unsigned char *__crypt_symmetric_cipher_function(const char *plain, int plain_len, const char *key, int key_len, int flags)
+{
+ return NULL;
+}
diff --git a/framework/src/securityAssistant/IN_SA_MD5.c b/framework/src/securityAssistant/IN_SA_MD5.c
new file mode 100755
index 0000000..783a473
--- /dev/null
+++ b/framework/src/securityAssistant/IN_SA_MD5.c
@@ -0,0 +1,233 @@
+/*
+* $Id: md5.c,v 1.3 2004/04/14 21:06:23 mkern Exp $
+* This code implements the MD5 message-digest algorithm.
+* The algorithm is due to Ron Rivest. This code was
+* written by Colin Plumb in 1993, no copyright is claimed.
+* This code is in the public domain; do with it what you wish.
+*
+* Equivalent code is available from RSA Data Security, Inc.
+* This code has been tested against that, and is equivalent,
+* except that you don't need to include two pages of legalese
+* with every copy.
+*
+* To compute the message digest of a chunk of bytes, declare an
+* MD5Context structure, pass it to MD5Init, call MD5Update as
+* needed on buffers full of bytes, and then call MD5Final, which
+* will fill a supplied 16-byte array with the digest.
+*/
+
+
+
+#include <string.h>
+#include "securityAssistant/IN_SA_MD5.h"
+
+static void MD5Transform(unsigned long int buf[4], const unsigned long int in[16]);
+static void _byte_reverse(unsigned char *buf, unsigned int longs);
+
+void MD5GetDigest(const char *buffer, int buffer_size, unsigned char *digest)
+{
+ MD5Context ctx;
+
+ MD5Init(&ctx);
+ MD5Update(&ctx, buffer, buffer_size);
+ MD5Final(&ctx, digest);
+
+}
+
+void MD5Init(MD5Context *ctx)
+{
+ ctx->buf[0] = 0x67452301;
+ ctx->buf[1] = 0xefcdab89;
+ ctx->buf[2] = 0x98badcfe;
+ ctx->buf[3] = 0x10325476;
+
+ ctx->bits[0] = 0;
+ ctx->bits[1] = 0;
+
+ if (IS_BIG_ENDIAN())
+ ctx->doByteReverse = 1;
+ else
+ ctx->doByteReverse = 0;
+}
+
+void MD5Update(MD5Context *ctx, const char *buf, unsigned long int len)
+{
+ unsigned int t;
+
+ /* Update bitcount */
+
+ t = ctx->bits[0];
+ if ((ctx->bits[0] = t + ((unsigned int)len << 3)) < t)
+ ctx->bits[1]++; /* Carry from low to high */
+ ctx->bits[1] += len >> 29;
+
+ t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */
+
+ /* Handle any leading odd-sized chunks */
+
+ if (t) {
+ unsigned char *p = (unsigned char *)ctx->in + t;
+
+ t = 64 - t;
+ if (len < t) {
+ memcpy(p, buf, len);
+ return;
+ }
+ memcpy(p, buf, t);
+ if (ctx->doByteReverse)
+ _byte_reverse(ctx->in, 16);
+ MD5Transform(ctx->buf, (const long unsigned int *)ctx->in);
+ buf += t;
+ len -= t;
+ }
+ /* Process data in 64-byte chunks */
+
+ while (len >= 64) {
+ memcpy(ctx->in, buf, 64);
+ if (ctx->doByteReverse)
+ _byte_reverse(ctx->in, 16);
+ MD5Transform(ctx->buf, (const long unsigned int *)ctx->in);
+ buf += 64;
+ len -= 64;
+ }
+
+ /* Handle any remaining bytes of data. */
+
+ memcpy(ctx->in, buf, len);
+}
+
+static void MD5Transform(unsigned long int buf[4], const unsigned long int in[16])
+{
+ register unsigned int a, b, c, d;
+
+ a = buf[0];
+ b = buf[1];
+ c = buf[2];
+ d = buf[3];
+
+ MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
+ MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
+ MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
+ MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
+ MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
+ MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
+ MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
+ MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
+ MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
+ MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
+ MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
+ MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
+ MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
+ MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
+ MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
+ MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
+
+ MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
+ MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
+ MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
+ MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
+ MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
+ MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
+ MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
+ MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
+ MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
+ MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
+ MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
+ MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
+ MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
+ MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
+ MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
+ MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
+
+ MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
+ MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
+ MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
+ MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
+ MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
+ MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
+ MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
+ MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
+ MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
+ MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
+ MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
+ MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
+ MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
+ MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
+ MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
+ MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
+
+ MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
+ MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
+ MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
+ MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
+ MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
+ MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
+ MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
+ MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
+ MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
+ MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
+ MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
+ MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
+ MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
+ MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
+ MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
+ MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
+
+ buf[0] += a;
+ buf[1] += b;
+ buf[2] += c;
+ buf[3] += d;
+}
+
+static void _byte_reverse(unsigned char *buf, unsigned int longs)
+{
+ unsigned int t;
+ do {
+ t = (unsigned int)((unsigned int)buf[3] << 8 | buf[2]) << 16 | ((unsigned int)buf[1] << 8 | buf[0]);
+ *(unsigned int *)buf = t;
+ buf += 4;
+ } while (--longs);
+}
+
+void MD5Final(MD5Context *ctx, unsigned char *digest)
+{
+ unsigned int count;
+ unsigned char *p;
+
+ /* Compute number of bytes mod 64 */
+ count = (ctx->bits[0] >> 3) & 0x3F;
+
+ /* Set the first char of padding to 0x80. This is safe since there is
+ always at least one byte free */
+ p = ctx->in + count;
+ *p++ = 0x80;
+
+ /* Bytes of padding needed to make 64 bytes */
+ count = 64 - 1 - count;
+
+ /* Pad out to 56 mod 64 */
+ if (count < 8) {
+ /* Two lots of padding: Pad the first block to 64 bytes */
+ memset(p, 0, count);
+ if (ctx->doByteReverse)
+ _byte_reverse(ctx->in, 16);
+ MD5Transform(ctx->buf, (const long unsigned int *)ctx->in);
+
+ /* Now fill the next block with 56 bytes */
+ memset(ctx->in, 0, 56);
+ } else {
+ /* Pad block to 56 bytes */
+ memset(p, 0, count - 8);
+ }
+ if (ctx->doByteReverse)
+ _byte_reverse(ctx->in, 14);
+
+ /* Append length in bits and transform */
+ ((unsigned int *)ctx->in)[14] = ctx->bits[0];
+ ((unsigned int *)ctx->in)[15] = ctx->bits[1];
+
+ MD5Transform(ctx->buf, (const long unsigned int *)ctx->in);
+ if (ctx->doByteReverse)
+ _byte_reverse((unsigned char *)ctx->buf, 4);
+ memcpy(digest, ctx->buf, 16);
+}
diff --git a/framework/test/include/suites/unit_test_fw_alloc_suite.h b/framework/test/include/suites/unit_test_fw_alloc_suite.h
new file mode 100755
index 0000000..0884426
--- /dev/null
+++ b/framework/test/include/suites/unit_test_fw_alloc_suite.h
@@ -0,0 +1,15 @@
+/*
+ * unit_test_fw_alloc_suite.h
+ *
+ * Created on: 2011. 7. 28.
+ * Author: yangjoo.suh
+ */
+
+#ifndef UNIT_TEST_FW_ALLOC_SUITE_H_
+#define UNIT_TEST_FW_ALLOC_SUITE_H_
+
+#include "unit_test_common.h"
+
+Suite *fw_alloc_suite(void);
+
+#endif /* UNIT_TEST_FW_ALLOC_SUITE_H_ */
diff --git a/framework/test/include/suites/unit_test_fw_log_suite.h b/framework/test/include/suites/unit_test_fw_log_suite.h
new file mode 100755
index 0000000..23d0ef1
--- /dev/null
+++ b/framework/test/include/suites/unit_test_fw_log_suite.h
@@ -0,0 +1,15 @@
+/*
+ * unit_test_fw_log_suite.h
+ *
+ * Created on: 2011. 9. 25.
+ * Author: yangjoo.suh
+ */
+
+#ifndef UNIT_TEST_FW_LOG_SUITE_H_
+#define UNIT_TEST_FW_LOG_SUITE_H_
+
+#include "unit_test_common.h"
+
+Suite *fw_log_suite(void);
+
+#endif /* UNIT_TEST_FW_LOG_SUITE_H_ */
diff --git a/framework/test/include/suites/unit_test_fw_sequential_id_provider_suite.h b/framework/test/include/suites/unit_test_fw_sequential_id_provider_suite.h
new file mode 100755
index 0000000..c499f65
--- /dev/null
+++ b/framework/test/include/suites/unit_test_fw_sequential_id_provider_suite.h
@@ -0,0 +1,15 @@
+/*
+ * unit_test_fw_sequential_id_provider_suite.h
+ *
+ * Created on: 2011. 10. 18.
+ * Author: yangjoo.suh
+ */
+
+#ifndef UNIT_TEST_FW_SEQUENTIAL_ID_PROVIDER_SUITE_H_
+#define UNIT_TEST_FW_SEQUENTIAL_ID_PROVIDER_SUITE_H_
+
+#include "unit_test_common.h"
+
+Suite *fw_sequential_id_provider_suite(void);
+
+#endif /* UNIT_TEST_FW_SEQUENTIAL_ID_PROVIDER_SUITE_H_ */
diff --git a/framework/test/include/suites/unit_test_protocol_binder_suite.h b/framework/test/include/suites/unit_test_protocol_binder_suite.h
new file mode 100755
index 0000000..3f45095
--- /dev/null
+++ b/framework/test/include/suites/unit_test_protocol_binder_suite.h
@@ -0,0 +1,15 @@
+/*
+ * unit_test_protocol_binder_suite.h
+ *
+ * Created on: 2011. 9. 21.
+ * Author: yangjoo.suh
+ */
+
+#ifndef UNIT_TEST_PROTOCOL_BINDER_SUITE_H_
+#define UNIT_TEST_PROTOCOL_BINDER_SUITE_H_
+
+#include "unit_test_common.h"
+
+Suite *protocol_binder_suite(void);
+
+#endif /* UNIT_TEST_PROTOCOL_BINDER_SUITE_H_ */
diff --git a/framework/test/include/suites/unit_test_sample_suite.h b/framework/test/include/suites/unit_test_sample_suite.h
new file mode 100755
index 0000000..55774c4
--- /dev/null
+++ b/framework/test/include/suites/unit_test_sample_suite.h
@@ -0,0 +1,15 @@
+/*
+ * unit_test_sample_suite.h
+ *
+ * Created on: 2011. 7. 28.
+ * Author: yangjoo.suh
+ */
+
+#ifndef UNIT_TEST_SUITE_H_
+#define UNIT_TEST_SUITE_H_
+
+#include "unit_test_common.h"
+
+Suite *sample_suite(void);
+
+#endif /* UNIT_TEST_SUITE_H_ */
diff --git a/framework/test/include/unit_test_common.h b/framework/test/include/unit_test_common.h
new file mode 100755
index 0000000..fdf0ee5
--- /dev/null
+++ b/framework/test/include/unit_test_common.h
@@ -0,0 +1,16 @@
+/*
+ * unit_test_common.h
+ *
+ * Created on: 2011. 7. 28.
+ * Author: yangjoo.suh
+ */
+
+#ifndef UNIT_TEST_COMMON_H_
+#define UNIT_TEST_COMMON_H_
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <check.h>
+
+#endif /* UNIT_TEST_COMMON_H_ */
diff --git a/framework/test/include/unit_test_run.h b/framework/test/include/unit_test_run.h
new file mode 100755
index 0000000..fd9c075
--- /dev/null
+++ b/framework/test/include/unit_test_run.h
@@ -0,0 +1,22 @@
+/*
+ * unit_test.h
+ *
+ * Created on: 2011. 3. 29.
+ * Author: yangjoo
+ */
+
+#ifndef UNIT_TEST_H_
+#define UNIT_TEST_H_
+
+#include "unit_test_common.h"
+
+typedef enum run_unit_test_mode run_unit_test_mode_t;
+enum run_unit_test_mode {
+ FUNCTION_MODE, /* unit test runs just like function */
+ /* good for debugging */
+ FORK_MODE
+};
+
+int unit_test_run(run_unit_test_mode_t mode);
+
+#endif /* UNIT_TEST_H_ */
diff --git a/framework/test/include/unit_test_suites.h b/framework/test/include/unit_test_suites.h
new file mode 100755
index 0000000..2f26627
--- /dev/null
+++ b/framework/test/include/unit_test_suites.h
@@ -0,0 +1,28 @@
+/*
+ * unit_test_suites.h
+ *
+ * Created on: 2011. 7. 28.
+ * Author: yangjoo.suh
+ */
+
+#ifndef UNIT_TEST_SUITES_H_
+#define UNIT_TEST_SUITES_H_
+
+#include "unit_test_common.h"
+#include "suites/unit_test_sample_suite.h"
+#include "suites/unit_test_fw_alloc_suite.h"
+#include "suites/unit_test_fw_log_suite.h"
+#include "suites/unit_test_protocol_binder_suite.h"
+#include "suites/unit_test_fw_sequential_id_provider_suite.h"
+
+/* define here suites to be tested */
+typedef Suite *(*SUITE_FUNCTION) (void);
+static SUITE_FUNCTION suiteFunctions[] = {
+ sample_suite,
+ fw_alloc_suite,
+ fw_log_suite,
+ protocol_binder_suite,
+ fw_sequential_id_provider_suite
+};
+
+#endif /* UNIT_TEST_SUITES_H_ */
diff --git a/framework/test/src/fw_test_main.c b/framework/test/src/fw_test_main.c
new file mode 100755
index 0000000..8537845
--- /dev/null
+++ b/framework/test/src/fw_test_main.c
@@ -0,0 +1,14 @@
+/*
+ * fw_test_main.c
+ *
+ * Created on: 2011. 7. 28.
+ * Author: yangjoo.suh
+ */
+
+#include "unit_test_run.h"
+
+int main(void)
+{
+ int test_success = unit_test_run(FUNCTION_MODE);
+ return test_success;
+}
diff --git a/framework/test/src/suites/unit_test_fw_alloc_suite.c b/framework/test/src/suites/unit_test_fw_alloc_suite.c
new file mode 100755
index 0000000..66649b2
--- /dev/null
+++ b/framework/test/src/suites/unit_test_fw_alloc_suite.c
@@ -0,0 +1,105 @@
+/*
+ * unit_test_fw_alloc_suite.c
+ *
+ * Created on: 2011. 7. 28.
+ * Author: yangjoo.suh
+ */
+
+#include "unit_test_common.h"
+#include "suites/unit_test_fw_alloc_suite.h"
+#include "Utility/fw_alloc_internal.h"
+#include "Utility/fw_alloc.h"
+
+#include <string.h>
+
+/* test internal interfaces */
+#ifndef NDEBUG
+START_TEST(_alloc_init_realbytes_test)
+{
+ bool success = false;
+
+ unsigned int bytes = 10;
+ const char *file = "main.c";
+ int line = 10;
+
+ /* allocation */
+ void *pRealbytes = _alloc_init_realbytes(bytes, file, line);
+ if (pRealbytes == NULL) {
+ fail();
+ }
+
+ /* test */
+ /* check redzone */
+ success = check_redzone(pRealbytes);
+ fail_unless(success);
+
+ /* check debug info */
+ alloc_debug_info_t *pAlloc_debug_info = get_debug_info(pRealbytes);
+ fail_unless(!strcmp(pAlloc_debug_info->file, file));
+ fail_unless(pAlloc_debug_info->line == line);
+ fail_unless(pAlloc_debug_info->size == bytes);
+
+ /* free allocated */
+ _free_realbytes(pRealbytes);
+}
+
+END_TEST
+/* test external interfaces */
+START_TEST(_fw_malloc_and_fw_free_test)
+{
+ unsigned int bytes = 100;
+ void *ptr = NULL;
+
+ /* allocation */
+ ptr = _fw_malloc(bytes, __FILE__, __LINE__);
+ fail_unless(ptr != NULL);
+
+ /* free */
+ _fw_free(ptr);
+}
+
+END_TEST START_TEST(_fw_calloc_and_fw_free_test)
+{
+ unsigned int bytes = 100;
+ void *ptr = NULL;
+
+ /* allocation */
+ ptr = _fw_calloc(bytes, __FILE__, __LINE__);
+ fail_unless(ptr != NULL);
+
+ /* free */
+ _fw_free(ptr);
+}
+
+END_TEST
+#endif /* NDEBUG */
+Suite *fw_alloc_suite(void)
+{
+ /* create test suite */
+ Suite *s = suite_create("fw_allocation");
+
+#ifndef NDEBUG
+ /* test case create and add in suite */
+ {
+ TCase *tcase = tcase_create("_fw_malloc");
+
+ tcase_add_test(tcase, _alloc_init_realbytes_test);
+ tcase_add_test(tcase, _fw_malloc_and_fw_free_test);
+ tcase_set_timeout(tcase, 1);
+
+ suite_add_tcase(s, tcase);
+ }
+
+ /* test case create and add in suite */
+ {
+ TCase *tcase = tcase_create("_fw_calloc");
+
+ tcase_add_test(tcase, _fw_calloc_and_fw_free_test);
+ tcase_set_timeout(tcase, 1);
+
+ suite_add_tcase(s, tcase);
+ }
+#endif /* NDEBUG */
+
+ return s;
+}
diff --git a/framework/test/src/suites/unit_test_fw_log_suite.c b/framework/test/src/suites/unit_test_fw_log_suite.c
new file mode 100755
index 0000000..0dadd97
--- /dev/null
+++ b/framework/test/src/suites/unit_test_fw_log_suite.c
@@ -0,0 +1,49 @@
+/*
+ * unit_test_fw_log_suite.c
+ *
+ * Created on: 2011. 9. 25.
+ * Author: yangjoo.suh
+ */
+
+#include "unit_test_common.h"
+#include "suites/unit_test_fw_log_suite.h"
+#include "Utility/fw_log.h"
+
+/* test external interfaces */
+
+#define LOG_TAG "UNIT_TEST_FW_LOG"
+
+START_TEST(_color_logging_test)
+{
+ /* first example : logging with default option */
+ FW_LOGV("print with default option !");
+
+ /* second example : logging with background color & word color */
+ /* note that in below code, FW_TM_OPT_RED_WORD & FW_TM_OPT_WHITE_BACKGROUND is separated by space operator */
+ /* and the order is not important */
+ FW_LOGV_WITH_TERMINAL_OPTION(FW_TM_OPT_RED_WORD FW_TM_OPT_WHITE_BACKGROUND, "print red word in white background !");
+
+ /* third example : setting only word color */
+ FW_LOGV_WITH_TERMINAL_OPTION(FW_TM_OPT_GREEN_WORD, "print green word in default background !");
+
+ /* second example : setting only background color */
+ FW_LOGV_WITH_TERMINAL_OPTION(FW_TM_OPT_BLUE_BACKGROUND, "print default color word in blue background !");
+}
+
+END_TEST Suite *fw_log_suite(void)
+{
+ /* create test suite */
+ Suite *s = suite_create("fw_logging");
+
+ /* test case create and add in suite */
+ {
+ TCase *tcase = tcase_create("color logging test");
+
+ tcase_add_test(tcase, _color_logging_test);
+ tcase_set_timeout(tcase, 1);
+
+ suite_add_tcase(s, tcase);
+ }
+
+ return s;
+}
diff --git a/framework/test/src/suites/unit_test_fw_sequential_id_provider_suite.c b/framework/test/src/suites/unit_test_fw_sequential_id_provider_suite.c
new file mode 100755
index 0000000..100c209
--- /dev/null
+++ b/framework/test/src/suites/unit_test_fw_sequential_id_provider_suite.c
@@ -0,0 +1,427 @@
+/*
+ * unit_test_fw_sequential_id_provider_suite.c
+ *
+ * Created on: 2011. 10. 18.
+ * Author: yangjoo.suh
+ */
+
+#include <stdio.h>
+#include "unit_test_common.h"
+#include "Utility/fw_sequential_id_provider.h"
+#include "Utility/fw_sequential_id_provider_internal.h"
+#include "suites/unit_test_fw_sequential_id_provider_suite.h"
+
+START_TEST(provide_id_without_delete_id_test1)
+{
+ unsigned int max_id = 100;
+ id_provider_t *pId_provider = id_provider_create(max_id, 12, true);
+
+ fail_unless(pId_provider->total_free_cnt == max_id + 1);
+
+ unsigned int i = 0;
+ unsigned int id = 0;
+ id_provider_error_t error = ID_PROVIDER_OK;
+
+ for (i = 0; i <= max_id; i++) {
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(i == id);
+ fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
+ }
+
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_NOT_ENOUGH_ID);
+ fail_unless(pId_provider->total_free_cnt == 0);
+
+ id_provider_destroy(pId_provider);
+ fprintf(stderr, "provide_id_without_delete_id_test1 done\n");
+}
+
+END_TEST START_TEST(provide_id_without_delete_id_test2)
+{
+ unsigned int max_id = (1024 * 4) * 8;
+ id_provider_t *pId_provider = id_provider_create(max_id, 12, true);
+
+ fail_unless(pId_provider->total_free_cnt == max_id + 1);
+
+ unsigned int i = 0;
+ unsigned int id = 0;
+ id_provider_error_t error = ID_PROVIDER_OK;
+ for (i = 0; i <= max_id; i++) {
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(i == id);
+
+ fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
+ }
+
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_NOT_ENOUGH_ID);
+ fail_unless(pId_provider->total_free_cnt == 0);
+
+ id_provider_destroy(pId_provider);
+
+ fprintf(stderr, "provide_id_without_delete_id_test2 done\n");
+}
+
+END_TEST START_TEST(provide_id_without_delete_id_test3)
+{
+ unsigned int max_id = (1024 * 4) * 8 * 2;
+ id_provider_t *pId_provider = id_provider_create(max_id, 12, true);
+
+ fail_unless(pId_provider->total_free_cnt == max_id + 1);
+
+ unsigned int i = 0;
+ unsigned int id = 0;
+ id_provider_error_t error = ID_PROVIDER_OK;
+ for (i = 0; i <= max_id; i++) {
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(i == id);
+
+ fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
+ }
+
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_NOT_ENOUGH_ID);
+ fail_unless(pId_provider->total_free_cnt == 0);
+
+ id_provider_destroy(pId_provider);
+ fprintf(stderr, "provide_id_without_delete_id_test3 done\n");
+}
+
+END_TEST START_TEST(provide_id_with_delete_id_test1)
+{
+ unsigned int max_id = 100;
+ id_provider_t *pId_provider = id_provider_create(max_id, 12, true);
+
+ fail_unless(pId_provider->total_free_cnt == max_id + 1);
+
+ unsigned int i = 0;
+ unsigned int j = 0;
+ unsigned int id = 0;
+ id_provider_error_t error = ID_PROVIDER_OK;
+
+ for (i = 0; i <= max_id / 10; i++) {
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(i == id);
+
+ fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
+ }
+
+ for (j = 0; j <= max_id / 20; j++) {
+ fail_unless(ID_PROVIDER_OK == id_provider_delete_id(pId_provider, j));
+ fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (max_id / 10 + 1)) + j + 1);
+ }
+
+ for (i = max_id / 10 + 1; i <= max_id; i++) {
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(i == id);
+
+ fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)) + max_id / 20 + 1);
+ }
+
+ for (j = 0; j <= max_id / 20; j++) {
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(j == id);
+
+ fail_unless(pId_provider->total_free_cnt == (max_id / 20 - j));
+ }
+
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_NOT_ENOUGH_ID);
+ fail_unless(pId_provider->total_free_cnt == 0);
+
+ fail_unless(ID_PROVIDER_OK == id_provider_delete_id(pId_provider, 50));
+ fail_unless(pId_provider->total_free_cnt == 1);
+
+ fail_unless(ID_PROVIDER_NOT_EXIST_ID == id_provider_delete_id(pId_provider, 50));
+ fail_unless(pId_provider->total_free_cnt == 1);
+
+ fail_unless(ID_PROVIDER_OUT_OF_ID_RANGE == id_provider_delete_id(pId_provider, 101));
+ fail_unless(ID_PROVIDER_OUT_OF_ID_RANGE == id_provider_delete_id(pId_provider, 102));
+ fail_unless(ID_PROVIDER_OUT_OF_ID_RANGE == id_provider_delete_id(pId_provider, 2000));
+
+ id_provider_destroy(pId_provider);
+ fprintf(stderr, "provide_id_with_delete_id_test1 done\n");
+}
+
+END_TEST START_TEST(provide_id_with_delete_id_test2)
+{
+ unsigned int max_id = (1024 * 4) * 8;
+ id_provider_t *pId_provider = id_provider_create(max_id, 12, true);
+
+ fail_unless(pId_provider->total_free_cnt == max_id + 1);
+
+ unsigned int i = 0;
+ unsigned int j = 0;
+ unsigned int id = 0;
+ id_provider_error_t error = ID_PROVIDER_OK;
+
+ for (i = 0; i <= max_id / 10; i++) {
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(i == id);
+
+ fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
+ }
+
+ for (j = 0; j <= max_id / 20; j++) {
+ fail_unless(ID_PROVIDER_OK == id_provider_delete_id(pId_provider, j));
+ fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (max_id / 10 + 1)) + j + 1);
+ }
+
+ for (i = max_id / 10 + 1; i <= max_id; i++) {
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(i == id);
+
+ fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)) + max_id / 20 + 1);
+ }
+
+ for (j = max_id / 2; j <= max_id; j++) {
+ fail_unless(ID_PROVIDER_OK == id_provider_delete_id(pId_provider, j));
+ fail_unless(pId_provider->total_free_cnt == max_id / 20 + 1 + (j - max_id / 2) + 1);
+ }
+
+ for (j = 0; j <= max_id / 20; j++) {
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(j == id);
+
+ fail_unless(pId_provider->total_free_cnt == max_id / 20 + 1 + (max_id - max_id / 2) + 1 - (j + 1));
+ }
+
+ for (j = max_id / 2; j <= max_id; j++) {
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(j == id);
+
+ fail_unless(pId_provider->total_free_cnt == max_id / 20 + 1 + (max_id - max_id / 2) + 1 - (max_id / 20 + 1) - (j - max_id / 2 + 1));
+ }
+
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_NOT_ENOUGH_ID);
+ fail_unless(pId_provider->total_free_cnt == 0);
+
+ fail_unless(ID_PROVIDER_OK == id_provider_delete_id(pId_provider, 50));
+ fail_unless(pId_provider->total_free_cnt == 1);
+
+ fail_unless(ID_PROVIDER_NOT_EXIST_ID == id_provider_delete_id(pId_provider, 50));
+ fail_unless(pId_provider->total_free_cnt == 1);
+
+ fail_unless(ID_PROVIDER_OUT_OF_ID_RANGE == id_provider_delete_id(pId_provider, max_id + 1));
+ fail_unless(ID_PROVIDER_OUT_OF_ID_RANGE == id_provider_delete_id(pId_provider, max_id + 2));
+ fail_unless(ID_PROVIDER_OUT_OF_ID_RANGE == id_provider_delete_id(pId_provider, max_id + 1000));
+
+ id_provider_destroy(pId_provider);
+ fprintf(stderr, "provide_id_with_delete_id_test2 done\n");
+}
+
+END_TEST START_TEST(provide_id_without_unchanged_list)
+{
+ unsigned int page_bit_cnt = (1024 * 4) * 8;
+ unsigned int max_id = 3 * page_bit_cnt - 1;
+ id_provider_t *pId_provider = id_provider_create(max_id, 12, true);
+
+ unsigned int i = 0;
+ unsigned int id = 0;
+
+ id_provider_error_t error = ID_PROVIDER_OK;
+ fail_unless(pId_provider->total_free_cnt == max_id + 1);
+
+ for (i = 0; i < page_bit_cnt; i++) {
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(i == id);
+ fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
+
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 1);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 0);
+ }
+
+ for (i = page_bit_cnt; i < 2 * page_bit_cnt; i++) {
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(i == id);
+ fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
+
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 2);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 0);
+ }
+
+ for (i = 2 * page_bit_cnt; i < 3 * page_bit_cnt; i++) {
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(i == id);
+ fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
+
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 3);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 0);
+ }
+
+ for (i = 0; i < page_bit_cnt - 1; i++) {
+ error = id_provider_delete_id(pId_provider, i);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(pId_provider->total_free_cnt == (i + 1));
+
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 3);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 0);
+ }
+
+ error = id_provider_delete_id(pId_provider, page_bit_cnt - 1);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(pId_provider->total_free_cnt == page_bit_cnt);
+
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 2);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 0);
+
+ id_provider_destroy(pId_provider);
+}
+
+END_TEST START_TEST(provide_id_with_unchanged_list)
+{
+ unsigned int page_bit_cnt = (1024 * 4) * 8;
+ unsigned int max_id = 4 * page_bit_cnt - 1;
+ id_provider_t *pId_provider = id_provider_create(max_id, 12, true);
+
+ unsigned int i = 0;
+ unsigned int id = 0;
+
+ id_provider_error_t error = ID_PROVIDER_OK;
+ fail_unless(pId_provider->total_free_cnt == max_id + 1);
+
+ /* prepare test */
+ for (i = 0; i < page_bit_cnt; i++) {
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(i == id);
+ fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
+
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 1);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 0);
+ }
+
+ for (i = page_bit_cnt; i < 2 * page_bit_cnt; i++) {
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(i == id);
+ fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
+
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 2);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 0);
+ }
+
+ for (i = 2 * page_bit_cnt; i < 3 * page_bit_cnt; i++) {
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(i == id);
+ fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
+
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 3);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 0);
+ }
+
+ /* move all add list to unchaged list for test */
+ id_provider_move_id_page(pId_provider, pId_provider->id_page_array[0], ID_PAGE_FLAG_UNCHANGED);
+ id_provider_move_id_page(pId_provider, pId_provider->id_page_array[1], ID_PAGE_FLAG_UNCHANGED);
+ id_provider_move_id_page(pId_provider, pId_provider->id_page_array[2], ID_PAGE_FLAG_UNCHANGED);
+
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 3);
+
+ /* test started from here */
+ for (i = 0; i < page_bit_cnt - 1; i++) {
+ error = id_provider_delete_id(pId_provider, i);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(pId_provider->total_free_cnt == page_bit_cnt + (i + 1));
+
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 1);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 2);
+ }
+
+ error = id_provider_delete_id(pId_provider, page_bit_cnt - 1);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(pId_provider->total_free_cnt == 2 * page_bit_cnt);
+
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 1);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 2);
+
+ for (i = 3 * page_bit_cnt; i < 4 * page_bit_cnt; i++) {
+ error = id_provider_provide_id(pId_provider, &id);
+ fail_unless(error == ID_PROVIDER_OK);
+ fail_unless(i == id);
+ fail_unless(pId_provider->total_free_cnt == (2 * page_bit_cnt - (i - 3 * page_bit_cnt + 1)));
+
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 1);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 1);
+ fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 2);
+ }
+
+ id_provider_destroy(pId_provider);
+}
+
+END_TEST Suite *fw_sequential_id_provider_suite(void)
+{
+ /* create test suite */
+ Suite *s = suite_create("fw_sequential_id_provider_suite");
+
+ /* test case create and add in suite */
+ {
+ TCase *tcase = tcase_create("provide_id_without_delete_id");
+
+ tcase_add_test(tcase, provide_id_without_delete_id_test1);
+ tcase_add_test(tcase, provide_id_without_delete_id_test2);
+ tcase_add_test(tcase, provide_id_without_delete_id_test3);
+
+ tcase_set_timeout(tcase, 1);
+
+ suite_add_tcase(s, tcase);
+ }
+
+ /* create another test case and add to test suite just like above code */
+ {
+ TCase *tcase = tcase_create("provide_id_with_delete_id");
+ tcase_add_test(tcase, provide_id_with_delete_id_test1);
+ tcase_add_test(tcase, provide_id_with_delete_id_test2);
+ tcase_set_timeout(tcase, 1);
+ suite_add_tcase(s, tcase);
+ }
+
+ /* create another test case and add to test suite just like above code */
+ {
+ TCase *tcase = tcase_create("provide_id_tracking_mode");
+ tcase_add_test(tcase, provide_id_without_unchanged_list);
+ tcase_add_test(tcase, provide_id_with_unchanged_list);
+ tcase_set_timeout(tcase, 1);
+ suite_add_tcase(s, tcase);
+ }
+
+ return s;
+}
diff --git a/framework/test/src/suites/unit_test_protocol_binder.c b/framework/test/src/suites/unit_test_protocol_binder.c
new file mode 100755
index 0000000..67de1d1
--- /dev/null
+++ b/framework/test/src/suites/unit_test_protocol_binder.c
@@ -0,0 +1,253 @@
+/*
+ * unit_test_protocol_binder.c
+ *
+ * Created on: 2011. 9. 21.
+ * Author: yangjoo.suh
+ */
+
+#include "unit_test_common.h"
+#include "suites/unit_test_protocol_binder_suite.h"
+#include "protocol_binder.h"
+#include "protocol_binder_util_internal.h"
+#include "Utility/fw_log.h"
+
+#define LOG_TAG "TEST_FW_PROTOCOL_BINDER"
+
+typedef enum {
+ PE_UNDEF = 0,
+ PE_ADD,
+ PE_ALERT,
+ PE_ATOMIC_START,
+ PE_ATOMIC_END,
+ PE_COPY,
+ PE_DELETE,
+ PE_EXEC,
+ PE_GET,
+ PE_MAP,
+ PE_PUT_START,
+ PE_PUT_END,
+ PE_RESULTS_START,
+ PE_RESULTS_END,
+ PE_SEARCH,
+ PE_SEQUENCE_START,
+ PE_SEQUENCE_END,
+ PE_STATUS,
+ PE_SYNC_START,
+ PE_SYNC_END,
+ PE_REPLACE,
+ PE_HEADER,
+ PE_PUT_GET,
+ PE_CMD_GROUP,
+ PE_GENERIC,
+ PE_FINAL,
+ PE_DEVINF,
+ PE_SYNCML_START,
+ PE_SYNCML_END,
+ PE_BODY_START,
+ PE_BODY_END
+} OMA_DS_Protocol_Element;
+
+static PROTOCOL_BINDER_ERROR oma_ds_binder_syncml_start_converter_function(protocol_binder *pBinder, Content_Ptr pContent, WBXMLTreeNode **ppWbxml_dom_node)
+{
+ FW_LOGI("start");
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+ WBXMLTreeNode *syncml_node = create_wbxml_node_using_xml_name(pBinder, "SyncML");
+ if (syncml_node == 0)
+ return PROTOCOL_BINDER_UNKNOWN_ERROR;
+
+ switch (syncml_node->type) {
+ case WBXML_TREE_ELEMENT_NODE:
+ fprintf(stderr, "[%s] element node\n", __func__);
+ if (syncml_node->name->type == WBXML_VALUE_TOKEN) {
+ fprintf(stderr, "[%s] tag type value token", __func__);
+ } else if (syncml_node->name->type == WBXML_VALUE_LITERAL) {
+ fprintf(stderr, "[%s] tag type literal token", __func__);
+ } else {
+ fprintf(stderr, "[%s] tag type error", __func__);
+ }
+ break;
+ case WBXML_TREE_TEXT_NODE:
+ fprintf(stderr, "[%s] text node\n", __func__);
+ break;
+ case WBXML_TREE_CDATA_NODE:
+ fprintf(stderr, "[%s] cdata node\n", __func__);
+ break;
+ case WBXML_TREE_PI_NODE:
+ fprintf(stderr, "[%s] pi node\n", __func__);
+ break;
+ case WBXML_TREE_TREE_NODE:
+ fprintf(stderr, "[%s] tree node\n", __func__);
+ break;
+ }
+
+ *ppWbxml_dom_node = syncml_node;
+ FW_LOGI("end");
+
+ return err;
+}
+
+static PROTOCOL_BINDER_ERROR oma_ds_binder_header_converter_function(protocol_binder *pBinder, Content_Ptr pContent, WBXMLTreeNode **ppWbxml_dom_node)
+{
+ FW_LOGI("start");
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+
+ /* add SyncHdr, VerDTD, VerProto node */
+ WBXMLTreeNode *synchdr_node = create_wbxml_node_using_xml_name(pBinder, "SyncHdr");
+
+ char *verDTD = "VerDTD";
+ char *verProto = "VerProto";
+
+ char *verDTD_data = "1.2";
+ char *verProto_data = "SyncML/1.2";
+
+ add_child_wbxml_node_using_xml_name_with_text(pBinder, synchdr_node, verDTD, verDTD_data, strlen(verDTD_data));
+ add_child_wbxml_node_using_xml_name_with_text(pBinder, synchdr_node, verProto, verProto_data, strlen(verProto_data));
+
+ /* session ID */
+ char *sessionId = "12345";
+ add_child_wbxml_node_using_xml_name_with_text(pBinder, synchdr_node, "SessionID", sessionId, strlen(sessionId));
+
+ /* msgID */
+ char *msgID_data = "1";
+ add_child_wbxml_node_using_xml_name_with_text(pBinder, synchdr_node, "MsgID", msgID_data, strlen(msgID_data));
+
+ add_child_wbxml_node_using_xml_name(pBinder, synchdr_node, "Target");
+ add_child_wbxml_node_using_xml_name(pBinder, synchdr_node, "Source");
+
+ *ppWbxml_dom_node = synchdr_node;
+
+ FW_LOGI("end");
+ return err;
+}
+
+static PROTOCOL_BINDER_ERROR oma_ds_binder_body_start_converter_function(protocol_binder *pBinder, Content_Ptr pContent, WBXMLTreeNode **ppWbxml_dom_node)
+{
+ FW_LOGI("start");
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+
+ WBXMLTreeNode *syncbody_node = create_wbxml_node_using_xml_name(pBinder, "SyncBody");
+
+ *ppWbxml_dom_node = syncbody_node;
+ FW_LOGI("end");
+
+ return err;
+}
+
+static PROTOCOL_BINDER_ERROR oma_ds_binder_final_converter_function(protocol_binder *pBinder, Content_Ptr pContent, WBXMLTreeNode **ppWbxml_dom_node)
+{
+ FW_LOGI("start");
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+
+ WBXMLTreeNode *final_node = create_wbxml_node_using_xml_name(pBinder, "Final");
+
+ *ppWbxml_dom_node = final_node;
+
+ FW_LOGI("end");
+ return err;
+}
+
+static PROTOCOL_BINDER_ERROR oma_ds_binder_results_command_converter_function(protocol_binder *pBinder, Content_Ptr pContent, WBXMLTreeNode **ppWbxml_dom_node)
+{
+
+ FW_LOGI("start");
+ PROTOCOL_BINDER_ERROR err = PROTOCOL_BINDER_OK;
+
+ WBXMLTreeNode *results_node = create_wbxml_node_using_xml_name(pBinder, "Results");
+
+ char *str_cmdID = "1";
+ add_child_wbxml_node_using_xml_name_with_text(pBinder, results_node, "CmdID", str_cmdID, strlen(str_cmdID));
+
+ char *str_msgRef = "2";
+ add_child_wbxml_node_using_xml_name_with_text(pBinder, results_node, "MsgRef", str_msgRef, strlen(str_msgRef));
+
+ char *str_cmdRef = "3";
+ add_child_wbxml_node_using_xml_name_with_text(pBinder, results_node, "CmdRef", str_cmdRef, strlen(str_cmdRef));
+
+ char *content_type = "application/vnd.syncml-devinf+xml";
+ WBXMLTreeNode *meta_node = add_child_wbxml_node_using_xml_name(pBinder, results_node, "Meta");
+ add_child_wbxml_node_using_xml_name_with_text(pBinder, meta_node, "Type", content_type, strlen(content_type));
+
+ char *target_ref_locUri = "./devinf12";
+ add_child_wbxml_node_using_xml_name_with_text(pBinder, results_node, "TargetRef", target_ref_locUri, strlen(target_ref_locUri));
+
+ *ppWbxml_dom_node = results_node;
+
+ FW_LOGI("end");
+ return err;
+}
+
+const Binder_function_info oma_ds_binder_function_info[8] = {
+ {PE_SYNCML_START, "SyncML", oma_ds_binder_syncml_start_converter_function, NULL, false},
+ {PE_SYNCML_END, "/SyncML", NULL, NULL, false},
+ {PE_HEADER, "SyncHdr", oma_ds_binder_header_converter_function, NULL, true},
+ {PE_BODY_START, "SyncBody", oma_ds_binder_body_start_converter_function, NULL, false},
+ {PE_BODY_END, "/SyncBody", NULL, NULL, false},
+ {PE_FINAL, "Final", oma_ds_binder_final_converter_function, NULL, true},
+ {PE_RESULTS_START, "Results", oma_ds_binder_results_command_converter_function, NULL, false},
+ {PE_RESULTS_END, "/Results", NULL, NULL, false}
+};
+
+START_TEST(_protocol_binder_flow_mode_xml_output1)
+{
+ Binder_function_set *pFunction_set = NULL;
+ char *xml_output = NULL;
+ unsigned int xml_size = 0;
+ PROTOCOL_BINDER_ERROR err = init_binder_function_set(8, oma_ds_binder_function_info,
+ &pFunction_set);
+ fail_unless(err == PROTOCOL_BINDER_OK, "init_binder_function_set failed");
+ fail_unless(pFunction_set != NULL, "pFunction_set != NULL" "after init_binder_function_set function successfully done");
+
+ protocol_binder *pBinder = protocol_binder_init(NULL,
+ PROTOCOL_SYNCML_SYNCML12, NULL,
+ ENCODING_WBXML_12, false, false, false, true,
+ NULL, NULL,
+ pFunction_set);
+ fail_unless(pBinder != NULL, "pBinder != NULL failed");
+
+ err = protocol_binder_append(pBinder, PE_SYNCML_START, NULL);
+/* fail_unless(err == PROTOCOL_BINDER_OK, "protocol_binder_append PE_SYNCML_START failed"); */
+ err = protocol_binder_append(pBinder, PE_HEADER, NULL);
+/* fail_unless(err == PROTOCOL_BINDER_OK, "protocol_binder_append PE_HEADER failed"); */
+ err = protocol_binder_append(pBinder, PE_BODY_START, NULL);
+/* fail_unless(err == PROTOCOL_BINDER_OK, "protocol_binder_append PE_BODY_START failed"); */
+ err = protocol_binder_append(pBinder, PE_RESULTS_START, NULL);
+/* fail_unless(err == PROTOCOL_BINDER_OK, "protocol_binder_append PE_RESULTS_START failed"); */
+ err = protocol_binder_append(pBinder, PE_RESULTS_END, NULL);
+/* fail_unless(err == PROTOCOL_BINDER_OK, "protocol_binder_append PE_RESULTS_END failed"); */
+ err = protocol_binder_append(pBinder, PE_BODY_END, NULL);
+/* fail_unless(err == PROTOCOL_BINDER_OK, "protocol_binder_append PE_BODY_END failed"); */
+ err = protocol_binder_append(pBinder, PE_SYNCML_END, NULL);
+/* fail_unless(err == PROTOCOL_BINDER_OK, "protocol_binder_append PE_SYNCML_END failed"); */
+
+ err = protocol_binder_get_stream(pBinder, &xml_output, &xml_size);
+ /*
+ fail_unless(err != PROTOCOL_BINDER_OK, "protocol_binder_get_stream failed");
+
+ fail_unless(xml_output != NULL, "xml_output != NULL failed");
+ fail_unless(xml_size != 0, "xml_size != 0 failed");
+ */
+ fprintf(stderr, "xml = %s\n", xml_output);
+
+ if (xml_output)
+ free(xml_output);
+ if (pBinder)
+ protocol_binder_terminate(pBinder);
+}
+
+END_TEST Suite *protocol_binder_suite(void)
+{
+ /* create test suite */
+ Suite *s = suite_create("protocol binder");
+
+ /* test case create and add in suite */
+ {
+ TCase *tcase = tcase_create("binder flow mode xml test cases");
+
+ tcase_add_test(tcase, _protocol_binder_flow_mode_xml_output1);
+ tcase_set_timeout(tcase, 1);
+
+ suite_add_tcase(s, tcase);
+ }
+
+ return s;
+}
diff --git a/framework/test/src/suites/unit_test_sample_suite.c b/framework/test/src/suites/unit_test_sample_suite.c
new file mode 100755
index 0000000..ab71e6f
--- /dev/null
+++ b/framework/test/src/suites/unit_test_sample_suite.c
@@ -0,0 +1,55 @@
+/*
+ * unit_test_sample_suite.c
+ *
+ * Created on: 2011. 3. 29.
+ * Author: yangjoo.suh
+ */
+
+#include "unit_test_common.h"
+#include "suites/unit_test_sample_suite.h"
+
+START_TEST(sample_test1)
+{
+ fail_unless(2 != 1, "2 != 1 failed");
+ fail_unless(3 != 1, "3 != 1 failed");
+}
+
+END_TEST START_TEST(sample_test2)
+{
+ /* unit test code */
+ fail_unless(10 != 5, "10 != 5 failed");
+}
+
+END_TEST Suite *sample_suite(void)
+{
+ /* create test suite */
+ Suite *s = suite_create("Sample");
+
+ /* test case create and add in suite */
+ {
+ TCase *tcase = tcase_create("SampleTestCase");
+ /* TODO : explain following lines */
+ /*
+ tcase_add_unchecked_fixture (tcase, setup, teardown);
+ tcase_add_checked_fixture (tcase, setup, teardown);
+ */
+
+ tcase_add_test(tcase, sample_test1);
+ tcase_add_test(tcase, sample_test2);
+ /* TODO : explain following lines */
+ tcase_set_timeout(tcase, 1);
+
+ suite_add_tcase(s, tcase);
+ }
+
+ /* create another test case and add to test suite just like above code */
+ {
+ TCase *tc_core2 = tcase_create("Sample2");
+ tcase_add_test(tc_core2, sample_test1);
+ tcase_add_test(tc_core2, sample_test2);
+ tcase_set_timeout(tc_core2, 1);
+ suite_add_tcase(s, tc_core2);
+ }
+
+ return s;
+}
diff --git a/framework/test/src/unit_test_run.c b/framework/test/src/unit_test_run.c
new file mode 100755
index 0000000..01a1af8
--- /dev/null
+++ b/framework/test/src/unit_test_run.c
@@ -0,0 +1,121 @@
+/*
+ * unit_test_run.c
+ *
+ * Created on: 2011. 3. 29.
+ * Author: yangjoo.suh
+ */
+
+#include "unit_test_common.h"
+#include "unit_test_run.h"
+#include "unit_test_suites.h"
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+/* introduction to unit test using check by yangsuh
+ * SRunner : runner of all test which belong to added suites
+ * Suite : container of test cases(TCase)
+ * TCase : container of tests
+ * test : container of many asserts
+ *
+ * SRunner has fork_status option. I will set this option to CK_FORK which means
+ * not stopping until all test finished.
+ * (Of course, when error like SIGSEGV occurs or test failed, current test will be stopped
+ * and goes to next test)
+ */
+
+typedef enum fork_status fork_status_t;
+int unit_test_main(fork_status_t fork_status)
+{
+ SRunner *sr = NULL;
+
+ /* srunner build up by defined test suites */
+ int suite_count = sizeof(suiteFunctions) / sizeof(SUITE_FUNCTION);
+ fprintf(stderr, "total test suites number = %d\n", suite_count);
+
+ if (suite_count == 0) {
+ return 0; /* nothing to do */
+ } else { /* suite_count > 0 */
+ SUITE_FUNCTION suite_func = NULL;
+
+ int i = 0;
+ for (i = 0; i < suite_count; i++) {
+ suite_func = suiteFunctions[i];
+ Suite *s = suite_func();
+ if (s != NULL) {
+ if (i == 0) {
+ sr = srunner_create(s);
+ } else {
+ srunner_add_suite(sr, s);
+ }
+ } else {
+ fprintf(stderr, "invalid suite function\n");
+ }
+ }
+ }
+
+ /* srunner setting */
+ srunner_set_log(sr, "/tmp/test.log"); /* set log file */
+ srunner_set_fork_status(sr, fork_status); /* set fork status of Runner */
+
+ srunner_run_all(sr, CK_VERBOSE); /* set print mode to verbose */
+ srunner_free(sr);
+
+ return 0;
+}
+
+/* TODO : return handling */
+static inline int unit_test_run_fork_mode()
+{
+ pid_t pid_w;
+ pid_t pid;
+ int status = 0;
+
+ pid = fork();
+ if (pid == -1)
+ fprintf(stderr, "Error in call to fork\n");
+ if (pid == 0) {
+ /* child process : run unit_test_main */
+ unit_test_main(CK_FORK);
+ exit(EXIT_SUCCESS);
+ } else {
+ /* parent process */
+ fprintf(stderr, "test process pid = %d", pid);
+ pid_w = waitpid(pid, &status, 0);
+
+ if (pid_w == pid) {
+ fprintf(stderr, "test finished successfully\n");
+ return 1; /* test finished */
+ } else {
+ fprintf(stderr, "test failed\n");
+ return 0; /* test error */
+ }
+ }
+
+ return status;
+}
+
+/* running as main function will be need during debugging */
+/* TODO : return handling */
+static inline int unit_test_run_function_mode()
+{
+ return unit_test_main(CK_NOFORK);
+}
+
+int unit_test_run(run_unit_test_mode_t mode)
+{
+ int success = 1; /* success */
+
+ switch (mode) {
+ case FORK_MODE:
+ success = unit_test_run_fork_mode();
+ break;
+ case FUNCTION_MODE:
+ success = unit_test_run_function_mode();
+ break;
+ default:
+ break;
+ }
+
+ return success;
+}
diff --git a/fw-plugin/CMakeLists.txt b/fw-plugin/CMakeLists.txt
new file mode 100755
index 0000000..8883594
--- /dev/null
+++ b/fw-plugin/CMakeLists.txt
@@ -0,0 +1,11 @@
+ADD_SUBDIRECTORY(account-plugIn)
+ADD_SUBDIRECTORY(calendar-plugIn)
+ADD_SUBDIRECTORY(contact-plugIn)
+ADD_SUBDIRECTORY(memo-plugIn)
+ADD_SUBDIRECTORY(vcalendar-plugIn)
+ADD_SUBDIRECTORY(vcard-plugIn)
+ADD_SUBDIRECTORY(plain-text-plugIn)
+ADD_SUBDIRECTORY(http-plugIn)
+ADD_SUBDIRECTORY(slp-device-plugIn)
+ADD_SUBDIRECTORY(slp-sysnoti-plugIn)
+
diff --git a/fw-plugin/account-plugIn/.cproject b/fw-plugin/account-plugIn/.cproject
new file mode 100755
index 0000000..3c36d31
--- /dev/null
+++ b/fw-plugin/account-plugIn/.cproject
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?>
+
+<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="org.eclipse.cdt.core.default.config.2033120496">
+ <storageModule buildSystemId="org.eclipse.cdt.core.defaultConfigDataProvider" id="org.eclipse.cdt.core.default.config.2033120496" moduleId="org.eclipse.cdt.core.settings" name="Configuration">
+ <externalSettings/>
+ <extensions>
+ <extension id="com.samsung.limo.SboxELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="com.samsung.limo.SboxGCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="com.samsung.limo.SboxMakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ <storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
+ <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
+ <storageModule moduleId="org.eclipse.cdt.core.pathentry">
+ <pathentry kind="src" path="include"/>
+ <pathentry kind="src" path="src"/>
+ <pathentry excluding="include|src" kind="src" path=""/>
+ <pathentry kind="out" path=""/>
+ </storageModule>
+ </cconfiguration>
+ </storageModule>
+</cproject>
diff --git a/fw-plugin/account-plugIn/.project b/fw-plugin/account-plugIn/.project
new file mode 100755
index 0000000..0912974
--- /dev/null
+++ b/fw-plugin/account-plugIn/.project
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>account-plugIn</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>com.samsung.slp2.SboxBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>com.samsung.slp2.SboxBuilder.needConfigure</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;com.samsung.limo.SboxGCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.append_environment</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.arguments</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.command</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.auto</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.clean</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.inc</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.environment</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>com.samsung.slp2.cnature</nature>
+ </natures>
+</projectDescription>
diff --git a/fw-plugin/account-plugIn/CMakeLists.src b/fw-plugin/account-plugIn/CMakeLists.src
new file mode 100755
index 0000000..04ce4aa
--- /dev/null
+++ b/fw-plugin/account-plugIn/CMakeLists.src
@@ -0,0 +1 @@
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRCS)
diff --git a/fw-plugin/account-plugIn/CMakeLists.sub b/fw-plugin/account-plugIn/CMakeLists.sub
new file mode 100755
index 0000000..9dfe8e0
--- /dev/null
+++ b/fw-plugin/account-plugIn/CMakeLists.sub
@@ -0,0 +1,38 @@
+#################################################################################
+# THIS FILE IS CREATED AUTOMATICALLY. DO NOT DELETE OR MODIFY THIS FILE.
+#################################################################################
+
+INCLUDE(CMakeLists.src)
+
+## PROJECT NAME
+PROJECT(plugin-account C)
+
+## PACKAGE CONFIG
+SET(SLP_PKGCONFIG_LIST "accounts-svc contacts-service glib-2.0 vconf")
+
+## INCLUDES
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../framework/include)
+
+
+## DEFINITIONS
+ADD_DEFINITIONS("-DAPP_DIR=\"${CMAKE_INSTALL_PREFIX}\"")
+
+## LIBRARY PATH
+SET(SLP_LD_PATH_FLAGS "")
+
+## LIBRARY
+SET(SLP_LD_FLAGS "")
+
+## DEBUG
+SET(SLP_DEBUG_FLAGS "-g")
+
+## OPTIMIZATION
+SET(SLP_OPT_FLAGS "-O0")
+
+## COMPILER FLAGS
+SET(SLP_COMPILER_FLAGS "")
+
+## LINKER FLAGS
+SET(SLP_LINKER_FLAGS "")
+
diff --git a/fw-plugin/account-plugIn/CMakeLists.txt b/fw-plugin/account-plugIn/CMakeLists.txt
new file mode 100755
index 0000000..d3139b9
--- /dev/null
+++ b/fw-plugin/account-plugIn/CMakeLists.txt
@@ -0,0 +1,33 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+
+# INCLUDE SUB CMAKELIST FILE
+INCLUDE(CMakeLists.sub)
+
+SET(RESOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/res")
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs_plugin_account REQUIRED ${SLP_PKGCONFIG_LIST})
+
+FOREACH(flag ${pkgs_plugin_account_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+SET(CMAKE_CXX_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+
+ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS})
+
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_plugin_account_LDFLAGS} ${SLP_LD_PATH_FLAGS} ${SLP_LD_FLAGS} ${SLP_LINKER_FLAGS} sync-agent-framework)
+
+# INSTALL
+INSTALL(TARGETS ${PROJECT_NAME} DESTINATION lib)
+#INSTALL(DIRECTORY ${RESOURCE_DIR}/data DESTINATION share)
+
+#added by KTS for install to the system
+#CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY)
+#INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig)
+
+
+# INCLUDE LAYOUT DIRECTORY
+# ADD_SUBDIRECTORY(layout)
+#ADD_SUBDIRECTORY(res/locale)
diff --git a/fw-plugin/account-plugIn/include/Account_Info.h b/fw-plugin/account-plugIn/include/Account_Info.h
new file mode 100755
index 0000000..f0e7dce
--- /dev/null
+++ b/fw-plugin/account-plugIn/include/Account_Info.h
@@ -0,0 +1,51 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef SLP_ACCOUNT_INFO_H_
+#define SLP_ACCOUNT_INFO_H_
+
+typedef enum {
+ ACC_TYPE_LOCAL = 0,
+ ACC_TYPE_EAS,
+ ACC_TYPE_GOOGLE,
+ ACC_TYPE_NONE
+} ACC_TYPE;
+
+typedef struct {
+ char *email;
+ ACC_TYPE type;
+} Account_Info;
+
+#endif /* SLP_ACCOUNT_INFO_H_ */
diff --git a/fw-plugin/account-plugIn/src/PlugIn_Interface.c b/fw-plugin/account-plugIn/src/PlugIn_Interface.c
new file mode 100755
index 0000000..3d7c938
--- /dev/null
+++ b/fw-plugin/account-plugIn/src/PlugIn_Interface.c
@@ -0,0 +1,426 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include <stdio.h> /*for debugging */
+#include <string.h>
+
+#include <vconf.h>
+#include <account.h>
+#include "contacts-svc.h"
+
+#include "Account_Info.h"
+
+/* for log */
+#include "agent-framework/Utility/fw_log.h"
+
+#include "agent-framework/PlugIn/Account_Interface.h"
+
+#define LOG_TAG "PLUGIN_ACCOUNT"
+
+/*
+ * Key : db/Apps/AgentFramework/[Agent Name]/Service/[Service_Type]/[FW AccountID]
+ * Value : Service Account ID
+ */
+#define VCONF_KEY_ACCOUNT_ID_SERVICE_ACCOUNT_ID "db/Apps/AgentFramework/%s/Service/%d/%d"
+
+/*
+ * KEY : db/Apps/AgentFramework/[Agent Name]/FW/[Service_Type]/[Service AccountID]/[Index]
+ * Value : FW Account IDcat
+ */
+#define VCONF_KEY_ACCOUNT_ID_FW_ACCOUNT_ID "db/Apps/AgentFramework/%s/FW/%d/%d/%d"
+
+/*
+ * Key : db/Apps/AgentFramework/[Agent Name]/FW_Count/[Service_Type]/[Service AccountID]
+ * Value : FW Account Count Included in one service Account
+ */
+#define VCONF_KEY_ACCOUNT_ID_FW_ACCOUNT_COUNT "db/Apps/AgentFramework/%s/FW_Count/%d/%d"
+
+#define FW_CONTACT 0
+#define FW_CALENDAR 1
+#define FW_MEMO 2
+#define FW_CONTENT_COUNT 3
+
+static const char *AGENT_NAME = 0;
+
+static void __setAccountID_Service(int service_type, int fw_account_id, int service_account_id);
+
+static void __setAccountID_FW(int service_type, int service_account_id, int count, int fw_account_id);
+
+static int __increaseAccountCount_FW(int service_type, int service_account_id);
+
+static int __getAccountCount_FW(int service_type, int service_account_id);
+
+static void __unSetAccountID_Service(int service_type, int fw_account_id);
+
+static void __unSetAccountID_FW(int service_type, int service_account_id, int index);
+
+static int __decreaseAccountCount_FW(int service_type, int service_account_id);
+
+static Account_Info *get_Account_Info(int service_account_id);
+
+void Set_AccountReposioryName(const char *agent_name)
+{
+ AGENT_NAME = agent_name;
+}
+
+void Add_PlatformAccount(int fw_account_id, char *email, char *password, int create_mode)
+{
+ int slp_id = -1;
+
+ int slp_contact_id = Get_Service_AccountID(FW_CONTACT, fw_account_id);
+ int slp_calendar_id = Get_Service_AccountID(FW_CALENDAR, fw_account_id);
+ int slp_memo_id = Get_Service_AccountID(FW_MEMO, fw_account_id);
+
+ /*
+ * if not existed ?
+ */
+ if (slp_contact_id == -100) {
+ __setAccountID_Service(FW_CONTACT, fw_account_id, slp_id);
+ int contact_index = __increaseAccountCount_FW(FW_CONTACT, slp_id);
+ __setAccountID_FW(FW_CONTACT, slp_id, contact_index, fw_account_id);
+ }
+
+ if (slp_calendar_id == -100) {
+ __setAccountID_Service(FW_CALENDAR, fw_account_id, slp_id);
+ int calendar_index = __increaseAccountCount_FW(FW_CALENDAR, slp_id);
+ __setAccountID_FW(FW_CALENDAR, slp_id, calendar_index, fw_account_id);
+ }
+
+ if (slp_memo_id == -100) {
+ __setAccountID_Service(FW_MEMO, fw_account_id, slp_id);
+ int memo_index = __increaseAccountCount_FW(FW_MEMO, slp_id);
+ __setAccountID_FW(FW_MEMO, slp_id, memo_index, fw_account_id);
+ }
+}
+
+void Set_PlatformAccount_Service(int fw_account_id, int service_type, int service_account_id)
+{
+ __setAccountID_Service(service_type, fw_account_id, service_account_id);
+
+ int service_index = __increaseAccountCount_FW(service_type, service_account_id);
+
+ __setAccountID_FW(service_type, service_account_id, service_index, fw_account_id);
+}
+
+void Del_PlatformAccount(int fw_account_id)
+{
+ FW_LOGV("[account_plugIn] Start \n");
+
+ int i = 0;
+ for (; i < FW_CONTENT_COUNT; i++) {
+ int service_account_id = Get_Service_AccountID(i, fw_account_id);
+
+ __unSetAccountID_Service(i, fw_account_id);
+
+ int count = __getAccountCount_FW(i, service_account_id);
+ int k = 0;
+ for (; k < count; k++) {
+ int target_fw_account_id = Get_FW_AccountID(i, service_account_id, k);
+ if (target_fw_account_id == fw_account_id) {
+ __unSetAccountID_FW(i, service_account_id, k);
+ __decreaseAccountCount_FW(i, service_account_id);
+ }
+ }
+ }
+}
+
+void Del_PlatformAccount_Service(int fw_account_id, int service_type)
+{
+ __unSetAccountID_Service(service_type, fw_account_id);
+}
+
+int Has_PlatformAccount_Service(int fw_account_id, int service_type)
+{
+ int result = Get_Service_AccountID(service_type, fw_account_id);
+ if (result == -100) {
+ return 0;
+ }
+
+ return 1;
+}
+
+int Get_Service_AccountID(int service_type, int fw_account_id)
+{
+ int service_account_id;
+ FW_LOGV("[account_plugIn] service_type : %d\n", service_type);
+ FW_LOGV("[account_plugIn] fw_account_id : %d\n", fw_account_id);
+
+ char vConfKey[100];
+ sprintf(vConfKey, VCONF_KEY_ACCOUNT_ID_SERVICE_ACCOUNT_ID, AGENT_NAME, service_type, fw_account_id);
+
+ if (vconf_get_int(vConfKey, &service_account_id)) {
+ FW_LOGV("[account_plugIn] vconf_get_int FAIL\n");
+ return -100;
+ }
+
+ FW_LOGV("[account_plugIn] vConfKey : %s\n", vConfKey);
+ FW_LOGV("[account_plugIn] service_account_id : %d\n", service_account_id);
+
+ return service_account_id;
+}
+
+int Get_FW_AccountID(int service_type, int service_account_id, int index)
+{
+ char vConfKey[100];
+ sprintf(vConfKey, VCONF_KEY_ACCOUNT_ID_FW_ACCOUNT_ID, AGENT_NAME, service_type, service_account_id, index);
+
+ int fw_account_id;
+ if (vconf_get_int(vConfKey, &fw_account_id)) {
+ FW_LOGV("[account_plugIn] vconf_get_int FAIL\n");
+ return -1;
+ }
+
+ return fw_account_id;
+}
+
+void *Get_Service_AccountInfo(int fw_account_id, int service_type)
+{
+ int service_account_id = Get_Service_AccountID(service_type, fw_account_id);
+ FW_LOGV("[account_plugIn] service_account_id : %d\n", service_account_id);
+
+ if (service_account_id == -100) {
+ return 0;
+ }
+
+ Account_Info *account_info = get_Account_Info(service_account_id);
+
+ if (account_info != 0) {
+ FW_LOGV("[account_plugIn] account_info->type : %d\n", account_info->type);
+ FW_LOGV("[account_plugIn] account_info->email : %s\n", account_info->email);
+ } else {
+ FW_LOGV("[account_plugIn] account_info is empty\n");
+ }
+
+ return account_info;
+}
+
+/******************************************* Impl static function ********************************************/
+
+static void __setAccountID_Service(int service_type, int fw_account_id, int service_account_id)
+{
+ char vConfKey[100];
+ sprintf(vConfKey, VCONF_KEY_ACCOUNT_ID_SERVICE_ACCOUNT_ID, AGENT_NAME, service_type, fw_account_id);
+
+ if (vconf_set_int(vConfKey, service_account_id))
+ FW_LOGV("[account_plugIn] vconf_set_id FAIL\n");
+
+ FW_LOGV("\n[account_plugIn] Sucess Vconf Set Id\n");
+ FW_LOGV("[account_plugIn] service_type : %d, fw_account_id : %d, service_account_id : %d\n\n", service_type, fw_account_id, service_account_id);
+}
+
+static void __setAccountID_FW(int service_type, int service_account_id, int count, int fw_account_id)
+{
+ FW_LOGV("count : %d", count);
+
+ char vConfKey[100] = { 0 };
+
+ int index = 0;
+ for (; index < count; index++) {
+ int i = 0;
+ for (; i < 100; i++) {
+ vConfKey[i] = 0;
+ }
+
+ int data;
+ sprintf(vConfKey, VCONF_KEY_ACCOUNT_ID_FW_ACCOUNT_ID, AGENT_NAME, service_type, service_account_id, index);
+ FW_LOGV("================== 01 [%s]\n", vConfKey);
+ if (vconf_get_int(vConfKey, &data)) {
+ FW_LOGV("================== 02\n");
+ break;
+ }
+ }
+
+ if (vconf_set_int(vConfKey, fw_account_id))
+ FW_LOGV("[account_plugIn] vconf_set_id FAIL\n");
+
+ FW_LOGV("\n[account_plugIn] Sucess Vconf Set Id\n");
+ FW_LOGV("[account_plugIn] service_type : %d, service_account_id : %d, fw_account_id[%d] : %d\n\n", service_type, service_account_id, index, fw_account_id);
+}
+
+static int __increaseAccountCount_FW(int service_type, int service_account_id)
+{
+ char vConfKey[100];
+ sprintf(vConfKey, VCONF_KEY_ACCOUNT_ID_FW_ACCOUNT_COUNT, AGENT_NAME, service_type, service_account_id);
+
+ int fw_account_count;
+ if (vconf_get_int(vConfKey, &fw_account_count)) {
+ FW_LOGV("[account_plugIn] first added\n");
+ if (vconf_set_int(vConfKey, 1))
+ FW_LOGV("[account_plugIn] vconf_set_id FAIL\n");
+ return 1;
+ }
+
+ if (vconf_set_int(vConfKey, fw_account_count + 1))
+ FW_LOGV("[account_plugIn] vconf_set_id FAIL\n");
+
+ return fw_account_count + 1;
+
+}
+
+static int __getAccountCount_FW(int service_type, int service_account_id)
+{
+ char vConfKey[100];
+ sprintf(vConfKey, VCONF_KEY_ACCOUNT_ID_FW_ACCOUNT_COUNT, AGENT_NAME, service_type, service_account_id);
+
+ int fw_account_count;
+ if (vconf_get_int(vConfKey, &fw_account_count)) {
+ FW_LOGV("[account_plugIn] empty\n");
+ return 0;
+ }
+
+ return fw_account_count;
+}
+
+static void __unSetAccountID_Service(int service_type, int fw_account_id)
+{
+ char vConfKey[100];
+ sprintf(vConfKey, VCONF_KEY_ACCOUNT_ID_SERVICE_ACCOUNT_ID, AGENT_NAME, service_type, fw_account_id);
+
+ if (vconf_unset(vConfKey))
+ FW_LOGV("[account_plugIn] vconf_unset FAIL\n");
+}
+
+static void __unSetAccountID_FW(int service_type, int service_account_id, int index)
+{
+ char vConfKey[100];
+ sprintf(vConfKey, VCONF_KEY_ACCOUNT_ID_FW_ACCOUNT_ID, AGENT_NAME, service_type, service_account_id, index);
+
+ if (vconf_unset(vConfKey)) {
+ FW_LOGV("[account_plugIn] vconf_unset FAIL : %s\n", vConfKey);
+ }
+}
+
+static int __decreaseAccountCount_FW(int service_type, int service_account_id)
+{
+ char vConfKey[100];
+ sprintf(vConfKey, VCONF_KEY_ACCOUNT_ID_FW_ACCOUNT_COUNT, AGENT_NAME, service_type, service_account_id);
+
+ int fw_account_count = 0;
+ if (vconf_get_int(vConfKey, &fw_account_count)) {
+ FW_LOGV("[account_plugIn] attempt delete when empty\n");
+ return 0;
+ }
+
+ fw_account_count = fw_account_count - 1;
+
+ if (fw_account_count == 0) {
+ if (vconf_unset(vConfKey)) {
+ FW_LOGV("[account_plugIn] vconf_unset FAIL : %s\n", vConfKey);
+ }
+ return 0;
+ }
+
+ if (vconf_set_int(vConfKey, fw_account_count))
+ FW_LOGV("[account_plugIn] vconf_set_id FAIL\n");
+
+ return fw_account_count;
+}
+
+static Account_Info *get_Account_Info(int service_account_id)
+{
+ Account_Info *account_info = (Account_Info *) malloc(sizeof(Account_Info));
+ if (account_info == 0) {
+ FW_LOGE("Failed to malloc()");
+ return 0;
+ }
+
+ if (service_account_id == -1) {
+ account_info->email = 0;
+ account_info->type = ACC_TYPE_LOCAL;
+ return account_info;
+ }
+
+ int error_code = account_connect();
+ if (error_code != ACCOUNT_ERROR_NONE) {
+ FW_LOGE("Failed to call account_connect()");
+ return 0;
+ }
+
+ account_h account_handle = 0;
+ account_create(&account_handle);
+ error_code = account_query_account_by_account_id(service_account_id, &account_handle);
+ if (error_code != ACCOUNT_ERROR_NONE) {
+ FW_LOGE("Failed to call account_query_account_by_account_id()");
+ free(account_info);
+ account_destroy(account_handle);
+ account_disconnect();
+ return 0;
+ }
+
+ char *domain_name = 0;
+ error_code = account_get_domain_name(account_handle, &domain_name);
+ if (error_code != ACCOUNT_ERROR_NONE) {
+ FW_LOGE("Failed to call account_get_domain_name()");
+ free(account_info);
+ account_destroy(account_handle);
+ account_disconnect();
+ return 0;
+ }
+
+ if (!strcmp(domain_name, "Gmail")) {
+ account_info->type = ACC_TYPE_GOOGLE;
+ } else if (!strcmp(domain_name, "exchange")) {
+ account_info->type = ACC_TYPE_EAS;
+ } else {
+ account_info->type = ACC_TYPE_NONE;
+ free(account_info);
+ account_destroy(account_handle);
+ account_disconnect();
+ return 0;
+ }
+
+ char *email = 0;
+ error_code = account_get_email_address(account_handle, &email);
+ if (error_code != ACCOUNT_ERROR_NONE) {
+ FW_LOGE("Failed to call account_get_email_address()");
+ free(account_info);
+ account_destroy(account_handle);
+ account_disconnect();
+ return 0;
+ }
+
+ if (email != 0) {
+ account_info->email = strdup(email);
+ }
+
+ account_destroy(account_handle);
+ error_code = account_disconnect();
+ if (error_code != ACCOUNT_ERROR_NONE) {
+ FW_LOGE("Failed to call account_disconnect()");
+ return 0;
+ }
+
+ return account_info;
+}
diff --git a/fw-plugin/calendar-plugIn/.cproject b/fw-plugin/calendar-plugIn/.cproject
new file mode 100755
index 0000000..3c36d31
--- /dev/null
+++ b/fw-plugin/calendar-plugIn/.cproject
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?>
+
+<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="org.eclipse.cdt.core.default.config.2033120496">
+ <storageModule buildSystemId="org.eclipse.cdt.core.defaultConfigDataProvider" id="org.eclipse.cdt.core.default.config.2033120496" moduleId="org.eclipse.cdt.core.settings" name="Configuration">
+ <externalSettings/>
+ <extensions>
+ <extension id="com.samsung.limo.SboxELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="com.samsung.limo.SboxGCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="com.samsung.limo.SboxMakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ <storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
+ <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
+ <storageModule moduleId="org.eclipse.cdt.core.pathentry">
+ <pathentry kind="src" path="include"/>
+ <pathentry kind="src" path="src"/>
+ <pathentry excluding="include|src" kind="src" path=""/>
+ <pathentry kind="out" path=""/>
+ </storageModule>
+ </cconfiguration>
+ </storageModule>
+</cproject>
diff --git a/fw-plugin/calendar-plugIn/.project b/fw-plugin/calendar-plugIn/.project
new file mode 100755
index 0000000..5e83784
--- /dev/null
+++ b/fw-plugin/calendar-plugIn/.project
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>calendar-plugIn</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>com.samsung.slp2.SboxBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>com.samsung.slp2.SboxBuilder.needConfigure</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;com.samsung.limo.SboxGCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.append_environment</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.arguments</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.command</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.auto</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.clean</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.inc</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.environment</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>com.samsung.slp2.cnature</nature>
+ </natures>
+</projectDescription>
diff --git a/fw-plugin/calendar-plugIn/CMakeLists.src b/fw-plugin/calendar-plugIn/CMakeLists.src
new file mode 100755
index 0000000..04ce4aa
--- /dev/null
+++ b/fw-plugin/calendar-plugIn/CMakeLists.src
@@ -0,0 +1 @@
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRCS)
diff --git a/fw-plugin/calendar-plugIn/CMakeLists.sub b/fw-plugin/calendar-plugIn/CMakeLists.sub
new file mode 100755
index 0000000..0ced611
--- /dev/null
+++ b/fw-plugin/calendar-plugIn/CMakeLists.sub
@@ -0,0 +1,37 @@
+#################################################################################
+# THIS FILE IS CREATED AUTOMATICALLY. DO NOT DELETE OR MODIFY THIS FILE.
+#################################################################################
+
+INCLUDE(CMakeLists.src)
+
+## PROJECT NAME
+PROJECT(plugin-da-calendar C)
+
+## PACKAGE CONFIG
+SET(SLP_PKGCONFIG_LIST "calendar glib-2.0 accounts-svc")
+
+## INCLUDES
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../framework/include)
+
+## DEFINITIONS
+ADD_DEFINITIONS("-DAPP_DIR=\"${CMAKE_INSTALL_PREFIX}\"")
+
+## LIBRARY PATH
+SET(SLP_LD_PATH_FLAGS "")
+
+## LIBRARY
+SET(SLP_LD_FLAGS "")
+
+## DEBUG
+SET(SLP_DEBUG_FLAGS "-g")
+
+## OPTIMIZATION
+SET(SLP_OPT_FLAGS "-O0")
+
+## COMPILER FLAGS
+SET(SLP_COMPILER_FLAGS "-lpthread")
+
+## LINKER FLAGS
+SET(SLP_LINKER_FLAGS "-lpthread")
+
diff --git a/fw-plugin/calendar-plugIn/CMakeLists.txt b/fw-plugin/calendar-plugIn/CMakeLists.txt
new file mode 100755
index 0000000..cc82c7a
--- /dev/null
+++ b/fw-plugin/calendar-plugIn/CMakeLists.txt
@@ -0,0 +1,33 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+
+# INCLUDE SUB CMAKELIST FILE
+INCLUDE(CMakeLists.sub)
+
+SET(RESOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/res")
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs_plugin_calendar REQUIRED ${SLP_PKGCONFIG_LIST})
+
+FOREACH(flag ${pkgs_plugin_calendar_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+SET(CMAKE_CXX_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+
+ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS})
+
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_plugin_calendar_LDFLAGS} ${SLP_LD_PATH_FLAGS} ${SLP_LD_FLAGS} ${SLP_LINKER_FLAGS} sync-agent-framework)
+
+# INSTALL
+INSTALL(TARGETS ${PROJECT_NAME} DESTINATION lib)
+#INSTALL(DIRECTORY ${RESOURCE_DIR}/data DESTINATION share)
+
+#added by KTS for install to the system
+#CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY)
+#INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig)
+
+
+# INCLUDE LAYOUT DIRECTORY
+# ADD_SUBDIRECTORY(layout)
+#ADD_SUBDIRECTORY(res/locale)
diff --git a/fw-plugin/calendar-plugIn/include/EXT_DataStore_Info_Calendar.h b/fw-plugin/calendar-plugIn/include/EXT_DataStore_Info_Calendar.h
new file mode 100755
index 0000000..db6ade8
--- /dev/null
+++ b/fw-plugin/calendar-plugIn/include/EXT_DataStore_Info_Calendar.h
@@ -0,0 +1,72 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef EXT_DATASTORE_INFO_CALENDAR_H_
+#define EXT_DATASTORE_INFO_CALENDAR_H_
+
+typedef enum {
+ CALENDAR_FIELD_DB_INDEX = 1,
+ CALENDAR_FIELD_SUMMARY,
+ CALENDAR_FIELD_DESCRIPTION,
+ CALENDAR_FIELD_LOCATOIN,
+ CALENDAR_FIELD_YEAR,
+ CALENDAR_FIELD_MODEL,
+ CALENDAR_FIELD_MEMO,
+ CALENDAR_FIELD_TIMEZONE,
+ CALENDAR_FIELD_TYPE_MODEL
+} CALENADR_FIELD;
+
+typedef enum {
+ CALENDAR_CHILD_FIELD_BIAS = 1,
+ CALENDAR_CHILD_FIELD_DAYLIGHT,
+ CALENDAR_CHILD_FIELD_DAYLIGHT_BIAS,
+ CALENDAR_CHILD_FIELD_DAYLIGHT_BEGIN,
+ CALENDAR_CHILD_FIELD_DAYLIGHT_END,
+ CALENDAR_CHILD_FIELD_STANDARD_TIMENAME,
+ CALENDAR_CHILD_FIELD_DAYLIGHT_TIMENAME
+} CALENDAR_CHILD_FIELD;
+
+typedef enum {
+ CALENDAR_FEATURE_APPOINTMENT = 1,
+ CALENDAR_FEATURE_ANNIVERSARY,
+ CALENDAR_FEATURE_HOLIDAY,
+ CALENDAR_FEATURE_IMPORTANT,
+ CALENDAR_FEATURE_PRIVATE,
+ CALENDAR_FEATURE_MISCELLANEOUS,
+ CALENDAR_FEATURE_TASK,
+ CALENDAR_FEATURE_MEMO
+} CALENDAR_FEATURE;
+
+#endif /* EXT_DATASTORE_INFO_CALENDAR_H_ */
diff --git a/fw-plugin/calendar-plugIn/include/Extern_Info.h b/fw-plugin/calendar-plugIn/include/Extern_Info.h
new file mode 100755
index 0000000..4d6f7bc
--- /dev/null
+++ b/fw-plugin/calendar-plugIn/include/Extern_Info.h
@@ -0,0 +1,44 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef EXTERN_INFO_H_
+#define EXTERN_INFO_H_
+
+typedef enum {
+ DEFAULT_CALENDAR_FOLDER = 0,
+ USER_DEFINED_FOLDER
+} CALENDAR_FOLDER_TYPE;
+
+#endif /* EXTERN_INFO_H_ */
diff --git a/fw-plugin/calendar-plugIn/include/IN_DataStore_Info_Calendar.h b/fw-plugin/calendar-plugIn/include/IN_DataStore_Info_Calendar.h
new file mode 100755
index 0000000..8f291f1
--- /dev/null
+++ b/fw-plugin/calendar-plugIn/include/IN_DataStore_Info_Calendar.h
@@ -0,0 +1,80 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef IN_DATASTORE_INFO_CALENDAR_H_
+#define IN_DATASTORE_INFO_CALENDAR_H_
+
+/* ITEM COUNT */
+#define MAX_ITEM_COUNT_CALENDAR 65535
+
+/* TIMEZONE FIELD */
+#define VAL_TZ_BIAS NULL
+#define VAL_TZ_DAYLIGHT NULL
+#define VAL_TZ_DAYLIGHT_BIAS NULL
+#define VAL_TZ_DAYLIGHT_BEGIN NULL
+#define VAL_TZ_DAYLIGHT_END NULL
+#define VAL_TZ_STANDARD_TIMENAME NULL
+#define VAL_TZ_DAYLIGHT_TIMENAME NULL
+
+/* CALENDAR INFO */
+#define MAX_LEN_SUMMARY 65535
+#define MAX_LEN_DESCRIPTION 65535
+#define MAX_LEN_LOCATION 65535
+#define MIN_PERIOD_YEAR 1902
+#define MAX_PERIOD_YEAR 2037
+#define MAX_LEN_MEMO FALSE
+#define VAL_TYPE_MODEL "A"
+
+/* FEATURE */
+#define IF_SUPPORT_APPOINTMENT TRUE
+#define IF_SUPPORT_ANNIVERSARY FALSE
+#define IF_SUPPORT_HOLIDAY FALSE
+#define IF_SUPPORT_IMPORTANT FALSE
+#define IF_SUPPORT_PRIVATE FALSE
+#define IF_SUPPORT_MISCELLANEOUS FALSE
+#define IF_SUPPORT_TASK FALSE
+#define IF_SUPPORT_MEMO TRUE
+
+/* FEATURE FIELD */
+#define VAL_DB_INDEX_APPOINTMENT 1
+#define VAL_DB_INDEX_ANNIVERSARY 2
+#define VAL_DB_INDEX_HOLIDAY 3
+#define VAL_DB_INDEX_IMPORTANT 4
+#define VAL_DB_INDEX_PRIVATE 5
+#define VAL_DB_INDEX_MISCELLANEOUS 6
+#define VAL_DB_INDEX_TASK 7
+#define VAL_DB_INDEX_MEMO 8
+
+#endif /* IN_DATASTORE_INFO_CALENDAR_H_ */
diff --git a/fw-plugin/calendar-plugIn/include/Item_Change_Info.h b/fw-plugin/calendar-plugIn/include/Item_Change_Info.h
new file mode 100755
index 0000000..9d57b0e
--- /dev/null
+++ b/fw-plugin/calendar-plugIn/include/Item_Change_Info.h
@@ -0,0 +1,43 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef ITEM_CHANGE_INFO_H_
+#define ITEM_CHANGE_INFO_H_
+
+int getCalendarTimeStamp();
+
+int setCalendarTimeStamp(int settingTime);
+
+#endif /* ITEM_CHANGE_INFO_H_ */
diff --git a/fw-plugin/calendar-plugIn/src/Item_Change_Info.c b/fw-plugin/calendar-plugIn/src/Item_Change_Info.c
new file mode 100755
index 0000000..cd9a332
--- /dev/null
+++ b/fw-plugin/calendar-plugIn/src/Item_Change_Info.c
@@ -0,0 +1,54 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include <time.h>
+
+#include "Item_Change_Info.h"
+
+static int calendarTimeStamp = 0;
+
+int getCalendarTimeStamp()
+{
+ return ((int)time(0) - 3);
+}
+
+int setCalendarTimeStamp(int settingTime)
+{
+ /* Critical Sectioin Start */
+ calendarTimeStamp = settingTime;
+ /* Critical Section End */
+
+ return settingTime;
+}
diff --git a/fw-plugin/calendar-plugIn/src/PlugIn_Interface.c b/fw-plugin/calendar-plugIn/src/PlugIn_Interface.c
new file mode 100755
index 0000000..80376b9
--- /dev/null
+++ b/fw-plugin/calendar-plugIn/src/PlugIn_Interface.c
@@ -0,0 +1,1208 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include <stdio.h>
+#include <glib.h>
+#include <pthread.h>
+#include <calendar-svc-provider.h>
+#include <account.h>
+
+#include "Extern_Info.h"
+#include "Item_Change_Info.h"
+#include "EXT_DataStore_Info_Calendar.h"
+#include "IN_DataStore_Info_Calendar.h"
+
+/* for log */
+#include "agent-framework/Utility/fw_log.h"
+
+#include "agent-framework/PlugIn/DataConnector_Interface.h"
+
+#define LOG_TAG "PLUGIN_DA_CALENDAR"
+
+#define FW_CALENDAR 1 /* plugIn-Id */
+
+static pthread_mutex_t lockx;
+
+static int isNotiFromMe = 0;
+
+static int isStorageChanged = 0;
+
+static CALLBACK_ADD_ITEM callback_add_item;
+
+static CALLBACK_DEL_ITEM callback_del_item;
+
+static CALLBACK_UPDATE_ITEM callback_update_item;
+
+static GET_ACCOUNTIDLIST callback_get_accountidlist;
+
+static void __set_IsNotiFromMe(int set_flag);
+
+static int __get_IsNotiFromMe();
+
+static void __process_Calendar_Change(void *);
+
+static void *__rutine_Calendar_Change(void *);
+
+static DACI_RETURN __convert_service_error_to_common_error(cal_error err);
+
+static bool __get_account_id(account_h account, void *user_data);
+
+static bool __is_Calendar_ID(account_capability_type_e capability_type, account_capability_state_e capability_value, void *user_data);
+
+typedef struct Account_ID {
+ int account_id;
+ struct Account_ID *next;
+} Account_ID_t;
+
+DACI_RETURN Service_Open()
+{
+ FW_LOGV("[da_calendar_plugIn] Start in Calendar\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = calendar_svc_connect();
+ if (err != CAL_SUCCESS) {
+ FW_LOGV("[da_calendar_plugIn] in calendar Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ } else {
+ FW_LOGV("[da_calendar_plugIn] in calendar Success!\n");
+ }
+
+ FW_LOGV("[da_calendar_plugIn] End in Calendar\n");
+ return ret;
+}
+
+DACI_RETURN Service_Close()
+{
+ FW_LOGV("[da_calendar_plugIn] Start in Calendar\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = calendar_svc_close();
+ if (err < CAL_SUCCESS) {
+ FW_LOGV("[da_calendar_plugIn] in calendar Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ } else {
+ FW_LOGV("[da_calendar_plugIn] in calendar Success!\n");
+ }
+
+ FW_LOGV("[da_calendar_plugIn] End in Calendar\n");
+ return ret;
+}
+
+DACI_RETURN Begin_Transaction()
+{
+ FW_LOGV("[da_calendar_plugIn] Start in Calendar\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = calendar_svc_begin_trans();
+ if (err != CAL_SUCCESS) {
+ FW_LOGV("[da_calendar_plugIn] in calendar Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ } else {
+ FW_LOGV("[da_calendar_plugIn] in calendar Success!\n");
+ __set_IsNotiFromMe(1);
+ }
+
+ FW_LOGV("[da_calendar_plugIn] End in Calendar\n");
+ return ret;
+}
+
+int End_Transaction(int is_success)
+{
+ FW_LOGV("[da_calendar_plugIn] Start in Calendar\n");
+ FW_LOGV("[da_calendar_plugIn] SLP Calendar Service is not supported Rollback Operation!\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = calendar_svc_end_trans();
+ if (err != CAL_SUCCESS) {
+ FW_LOGV("[da_calendar_plugIn] in calendar Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ } else {
+ FW_LOGV("[da_calendar_plugIn] in calendar Success!\n");
+ if (isStorageChanged == 0) {
+ FW_LOGV("calendar storaged was not Changed!!");
+ __set_IsNotiFromMe(0);
+ }
+ isStorageChanged = 0;
+ }
+
+ FW_LOGV("[da_calendar_plugIn] End in Calendar\n");
+ return ret;
+}
+
+DACI_RETURN Add_Item(int account_id, char *folder_id, void *data, char **item_id)
+{
+ FW_LOGV("[da_calendar_plugIn] Start in Calendar\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+ cal_struct *item = (cal_struct *) data;
+
+ /* parameter check */
+ if (folder_id == 0) {
+ /* memory free */
+ if (item != 0)
+ calendar_svc_struct_free(&item);
+
+ *item_id = 0;
+
+ FW_LOGV("[da_calendar_plugIn] service id is null \n");
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ /* setting account & folder id */
+ calendar_svc_struct_set_int(item, CAL_VALUE_INT_ACCOUNT_ID, account_id);
+ calendar_svc_struct_set_int(item, CAL_VALUE_INT_CALENDAR_ID, atoi(folder_id));
+
+ /* add item */
+ err = calendar_svc_insert(item);
+ if (err < CAL_SUCCESS) {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_insert() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ *item_id = 0;
+ } else {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_insert() Success!");
+ *item_id = g_strdup_printf("%d", err);
+ isStorageChanged = 1;
+ }
+
+ /* memory free */
+ if (item != 0)
+ calendar_svc_struct_free(&item);
+
+ FW_LOGV("[da_calendar_plugIn] End in Calendar\n");
+ return ret;
+}
+
+DACI_RETURN Update_Item(int account_id, char *folder_id, char *item_id, void *data)
+{
+ FW_LOGV("[da_calendar_plugIn] Start in Calendar\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+ cal_struct *item = (cal_struct *) data;
+
+ /* parameter check */
+ if ((folder_id == 0) || (item_id == 0)) {
+ /* memory free */
+ if (item != 0)
+ calendar_svc_struct_free(&item);
+
+ FW_LOGV("[da_calendar_plugIn] service id is null \n");
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ /* setting account & folder id */
+ calendar_svc_struct_set_int(item, CAL_VALUE_INT_ACCOUNT_ID, account_id);
+ calendar_svc_struct_set_int(item, CAL_VALUE_INT_CALENDAR_ID, atoi(folder_id));
+ calendar_svc_struct_set_int(item, CAL_VALUE_INT_INDEX, atoi(item_id));
+
+ /* update item */
+ err = calendar_svc_update(item);
+ if (err < CAL_SUCCESS) {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_update() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ } else {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_update() Success!");
+ isStorageChanged = 1;
+ }
+
+ /* memory free */
+ if (item != 0)
+ calendar_svc_struct_free(&item);
+
+ FW_LOGV("[da_calendar_plugIn] End in Calendar\n");
+ return ret;
+}
+
+DACI_RETURN Del_Item(int account_id, char *folder_id, char *item_id)
+{
+ FW_LOGV("[da_calendar_plugIn] Start in Calendar\n");
+
+ /* parameter check */
+ if (item_id == 0) {
+ FW_LOGV("[da_calendar_plugIn] service id is null \n");
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ /* delete item */
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = calendar_svc_delete(CAL_STRUCT_SCHEDULE, atoi(item_id));
+
+ if (err != CAL_SUCCESS) {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_delete() Fail!");
+ ret = __convert_service_error_to_common_error(err);
+ } else {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_delete() Success!");
+ isStorageChanged = 1;
+ }
+
+ FW_LOGV("[da_calendar_plugIn] End in Calendar\n");
+ return ret;
+}
+
+DACI_RETURN Del_All_Items(int account_id)
+{
+ FW_LOGV("[da_calendar_plugIn] Start in Calendar\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 1;
+ int folder_id_list_cnt = 0;
+ int *folder_type_list;
+ char **folder_id_list = 0;
+ cal_iter *iter = 0;
+ cal_struct *item = 0;
+ int item_id = 0;
+
+ /* get folder id list for account id */
+ folder_id_list = Get_Folder_ID_List(account_id, &folder_id_list_cnt, &folder_type_list);
+ if (folder_id_list == 0) {
+ FW_LOGV("[da_calendar_plugIn] folder id list cnt : %d\n", folder_id_list_cnt);
+ return DACI_ERR_NO_DATA;
+ }
+
+ int cnt = 0;
+ for (; cnt < folder_id_list_cnt; cnt++) {
+ /* get item id list (iter) for each folder id */
+ err = calendar_svc_get_all(account_id, atoi(folder_id_list[cnt]), CAL_STRUCT_SCHEDULE, &iter);
+
+ if (err == CAL_SUCCESS) {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_get_all Success!! \n");
+
+ while (calendar_svc_iter_next(iter) == CAL_SUCCESS) {
+ /* get item */
+ err = calendar_svc_iter_get_info(iter, &item);
+ if (err == CAL_SUCCESS) {
+ item_id = calendar_svc_struct_get_int(item, CAL_VALUE_INT_INDEX);
+ FW_LOGV("[da_calendar_plugIn] item id : %d\n", item_id);
+
+ err = calendar_svc_delete(CAL_STRUCT_SCHEDULE, item_id);
+ if (err != CAL_SUCCESS) {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_delete(%d) Fail!\n", item_id);
+ ret = __convert_service_error_to_common_error(err);
+ goto DACI_FINISH;
+ } else {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_delete(%d) Success!\n", item_id);
+ isStorageChanged = 1;
+ }
+
+ /* memory free */
+ if (item != 0) {
+ calendar_svc_struct_free(&item);
+ item = 0;
+ }
+ item_id = 0;
+
+ } else {
+ FW_LOGV("[da_calendar_plugIn] get item (item id : %d) Fail!\n", item_id);
+ ret = __convert_service_error_to_common_error(err);
+ goto DACI_FINISH;
+ }
+ } /* end while */
+
+ if (iter != 0) {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_iter_remove !! \n");
+ calendar_svc_iter_remove(&iter);
+ iter = 0;
+ }
+
+ } else {
+ FW_LOGV("[da_calendar_plugIn] get item id list (folder id : %d) Fail!\n", atoi(folder_id_list[cnt]));
+ ret = __convert_service_error_to_common_error(err);
+ goto DACI_FINISH;
+ }
+ }
+
+DACI_FINISH:
+
+ /* memory free */
+ if (item != 0)
+ calendar_svc_struct_free(&item);
+
+ if (iter != 0) {
+ calendar_svc_iter_remove(&iter);
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_iter_remove !! \n");
+ }
+ if (folder_id_list != 0) {
+ for (cnt = 0; cnt < folder_id_list_cnt; cnt++) {
+ if (folder_id_list[cnt] != NULL) {
+ free(folder_id_list[cnt]);
+ FW_LOGV("[da_calendar_plugIn] folder id free !! \n");
+ }
+ }
+ cfree(folder_id_list);
+ FW_LOGV("[da_calendar_plugIn] folder id list free !! \n");
+ }
+ if (folder_type_list != 0) {
+ cfree(folder_type_list);
+ FW_LOGV("[da_calendar_plugIn] folder type list free !! \n");
+ }
+
+ FW_LOGV("[da_calendar_plugIn] End in Calendar\n");
+ return ret;
+}
+
+DACI_RETURN Get_Item(int account_id, char *folder_id, char *item_id, void **data)
+{
+ FW_LOGV("[da_calendar_plugIn] Start in Calendar\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+ cal_struct *item = 0;
+
+ /* parameter check */
+ if (item_id == 0) {
+ FW_LOGV("[da_calendar_plugIn] service id is null \n");
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ /* get item */
+ err = calendar_svc_get(CAL_STRUCT_SCHEDULE, atoi(item_id), 0, &item);
+ if (err < CAL_SUCCESS) {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_get() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ *data = 0;
+ } else {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_get() Success!\n");
+ *data = (void *)item;
+ }
+
+ FW_LOGV("[da_calendar_plugIn] End in Calendar\n");
+ return ret;
+}
+
+DACI_RETURN Add_Folder(int account_id, char *folder_name, int folder_type, char **folder_id)
+{
+ FW_LOGV("[da_calendar_plugIn] Start in Calendar\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+ cal_struct *folder = 0;
+
+ /* parameter check */
+ if (folder_name == 0) {
+ FW_LOGV("[da_calendar_plugIn] service id is null \n");
+ *folder_id = 0;
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ /* new service struct */
+ folder = calendar_svc_struct_new(CAL_STRUCT_CALENDAR);
+ if (folder == 0) {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_struct_new() Fail!\n");
+ *folder_id = 0;
+ return DACI_ERRORS;
+ }
+
+ /* setting folder data */
+ calendar_svc_struct_set_int(folder, CAL_TABLE_INT_ACCOUNT_ID, account_id);
+ calendar_svc_struct_set_int(folder, CAL_TABLE_INT_VISIBILITY, 1);
+ calendar_svc_struct_set_str(folder, CAL_TABLE_TXT_NAME, folder_name);
+
+ /* add folder */
+ err = calendar_svc_insert(folder);
+ if (err < CAL_SUCCESS) {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_insert() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ *folder_id = 0;
+ } else {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_insert() Success!");
+ *folder_id = g_strdup_printf("%d", err);
+ isStorageChanged = 1;
+ }
+
+ /* memory free */
+ if (folder != 0)
+ calendar_svc_struct_free(&folder);
+
+ FW_LOGV("[da_calendar_plugIn] End in Calendar\n");
+ return ret;
+}
+
+DACI_RETURN Del_Folder(int account_id, char *folder_id)
+{
+ FW_LOGV("[da_calendar_plugIn] Start in Calendar\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+
+ /* parameter check */
+ if (folder_id == 0) {
+ FW_LOGV("[da_calendar_plugIn] service id is null \n");
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ /* delete folder */
+ err = calendar_svc_delete(CAL_STRUCT_CALENDAR, atoi(folder_id));
+ if (err < CAL_SUCCESS) {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_delete() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ } else {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_delete() Success!\n");
+ calendar_svc_clean_after_sync(account_id);
+ isStorageChanged = 1;
+ }
+
+ FW_LOGV("[da_calendar_plugIn] End in Calendar\n");
+ return ret;
+}
+
+DACI_RETURN Get_Folder(int account_id, char *folder_id, char **out_folder_name, int *out_folder_type)
+{
+ FW_LOGV("[da_calendar_plugIn] Start in Calendar\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+ cal_struct *folder = 0;
+
+ /* parameter check */
+ if (folder_id == 0) {
+ FW_LOGV("[da_calendar_plugIn] service id is null \n");
+ *out_folder_name = 0;
+ *out_folder_type = -1;
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ /* get item */
+ int calendar_folder_id = atoi(folder_id);
+ FW_LOGV("[da_calendar_plugIn] calendar_folder_id : %d\n", calendar_folder_id);
+ err = calendar_svc_get(CAL_STRUCT_CALENDAR, calendar_folder_id, 0, &folder);
+ if (err < CAL_SUCCESS) {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_get_addressbook() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ *out_folder_name = 0;
+ *out_folder_type = -1;
+ } else {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_get_addressbook() Success!\n");
+ *out_folder_name = calendar_svc_struct_get_str(folder, CAL_TABLE_TXT_NAME);
+ *out_folder_type = DEFAULT_CALENDAR_FOLDER;
+ }
+
+ /* memory free */
+ if (folder != 0)
+ calendar_svc_struct_free(&folder);
+
+ FW_LOGV("[da_calendar_plugIn] End in Calendar\n");
+ return ret;
+}
+
+DACI_RETURN Execute(int account_ID, const char *execute_key, void *execute_values, void **result)
+{
+ FW_LOGV("[da_calendar_plugIn] Start in Calendar\n");
+ FW_LOGV("[da_calendar_plugIn] service is not supported execute. \n");
+ *result = 0;
+ FW_LOGV("[da_calendar_plugIn] End in Calendar\n");
+ return DACI_SUCCESS;
+}
+
+int Get_Used_Item_Count()
+{
+ FW_LOGV("[da_calendar_plugIn] Start in Calendar\n");
+
+ int ret = DACI_SUCCESS;
+ int used_cnt = calendar_svc_get_count(0, 0, CAL_STRUCT_SCHEDULE);
+ if (used_cnt < 0) {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_get_count() Fail\n");
+ ret = __convert_service_error_to_common_error(used_cnt);
+ } else {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_get_count() Success\n");
+ FW_LOGV("[da_calendar_plugIn] used_count = %d\n", used_cnt);
+ ret = used_cnt;
+ }
+
+ FW_LOGV("[da_contact_plugIn] End in Calendar\n");
+ return ret;
+}
+
+int Get_Used_Item_Count_For_Folder(int account_id, char *folder_id)
+{
+ FW_LOGV("[da_calendar_plugIn] Start in Calendar\n");
+
+ /* parameter check */
+ if (folder_id == 0) {
+ FW_LOGV("[da_calendar_plugIn] service id is null \n");
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ int ret = DACI_SUCCESS;
+ int used_cnt = calendar_svc_get_count(account_id, atoi(folder_id), CAL_STRUCT_SCHEDULE);
+ if (used_cnt < 0) {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_get_count(%s) Fail\n", folder_id);
+ ret = __convert_service_error_to_common_error(used_cnt);
+ } else {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_get_count(%s) Success\n", folder_id);
+ FW_LOGV("[da_calendar_plugIn] used_count = %d\n", used_cnt);
+ ret = used_cnt;
+ }
+
+ FW_LOGV("[da_contact_plugIn] End in Calendar\n");
+ return ret;
+}
+
+char **Get_Folder_ID_List(int account_id, int *folder_count, int **folder_type_list)
+{
+ FW_LOGV("[da_calendar_plugIn] Start in Calendar\n");
+
+ char **folder_id_list = 0;
+ int count = 0;
+ cal_iter *folder_Iter = 0;
+ cal_struct *folder = 0;
+ int err = 0;
+ int i = 0;
+ *folder_count = 0;
+
+ count = calendar_svc_get_count(account_id, 0, CAL_STRUCT_CALENDAR);
+ if (count != 0) {
+ folder_id_list = (char **)calloc(count, sizeof(char *));
+ *folder_type_list = (int *)calloc(count, sizeof(int));
+
+ /* find */
+ err = calendar_svc_get_all(account_id, 0, CAL_STRUCT_CALENDAR, &folder_Iter);
+
+ do {
+ /* get */
+ err = calendar_svc_iter_get_info(folder_Iter, &folder);
+ if (err == CAL_SUCCESS) {
+
+ /* check */
+ folder_id_list[i] = g_strdup_printf("%d", calendar_svc_struct_get_int(folder, CAL_TABLE_INT_INDEX));
+ (*folder_type_list)[i] = DEFAULT_CALENDAR_FOLDER;
+ i++;
+ *folder_count = i;
+
+ if (folder != 0)
+ calendar_svc_struct_free(&folder);
+ } else {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_iter_get_info() Fail!\n");
+ break;
+ }
+ } while (calendar_svc_iter_next(folder_Iter) == CAL_SUCCESS);
+ }
+ /* memory free */
+ if (folder_Iter != 0)
+ calendar_svc_iter_remove(&folder_Iter);
+
+ return folder_id_list;
+}
+
+int *Get_Account_ID_List(int *count)
+{
+ FW_LOGV("[da_calendar_plugIn] start!!\n");
+
+ int error_code = account_connect();
+
+ Account_ID_t *account_info_list = (Account_ID_t *) calloc(1, sizeof(Account_ID_t));
+ account_info_list->account_id = -1;
+ account_info_list->next = 0;
+
+ account_foreach_account_from_db(__get_account_id, account_info_list);
+
+ *count = 0;
+ Account_ID_t *cursor_ptr = account_info_list;
+ while (cursor_ptr != 0) {
+ cursor_ptr = cursor_ptr->next;
+ (*count)++;
+ }
+
+ int *id_list = 0;
+ if ((*count) > 0) {
+ id_list = (int *)calloc(*count, sizeof(int));
+ cursor_ptr = account_info_list;
+ int i = 0;
+ while (cursor_ptr != 0) {
+ id_list[i] = cursor_ptr->account_id;
+ cursor_ptr = cursor_ptr->next;
+ i++;
+ }
+ }
+
+ free(account_info_list);
+
+ error_code = account_disconnect();
+
+ FW_LOGV("[da_calendar_plugIn] end!!\n");
+
+ return id_list;
+}
+
+Item_Node *Get_Changed_ITEM_For_Folder_Add(int account_id, const char *folder_id, int changepoint, int *changeCount)
+{
+ FW_LOGV("\n[da_calendar_plugIn] account_id : %d\n", account_id);
+ FW_LOGV("[da_calendar_plugIn] folder_id : %s\n", folder_id);
+ FW_LOGV("[da_calendar_plugIn] changepoint : %d\n", changepoint);
+
+ int calendarTimeStamp = changepoint;
+ int temp_folder_id = atoi(folder_id);
+ int calendar_ret = 0;
+ cal_iter *iter = 0;
+ cal_struct *row_event = 0;
+
+ Item_Node *root_ptr = 0;
+ Item_Node *cursor_ptr = 0;
+ int chagned_count = 0;
+
+ calendar_svc_get_updated_event_list(account_id, calendarTimeStamp, &iter);
+ calendar_ret = calendar_svc_iter_next(iter);
+ FW_LOGV("[da_calendar_plugIn] calendar_ret : %d\n", calendar_ret);
+
+ while (CAL_SUCCESS == calendar_ret) {
+ if ((calendar_svc_iter_get_info(iter, &row_event)) != CAL_SUCCESS) {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_iter_get_info() failed.\n");
+ } else {
+ int type = calendar_svc_struct_get_int(row_event, CAL_VALUE_INT_SYNC_STATUS);
+ int calendar_folder_id = calendar_svc_struct_get_int(row_event, CAL_VALUE_INT_CALENDAR_ID);
+
+ if ((type == CAL_SYNC_STATUS_NEW) && (calendar_folder_id == temp_folder_id)) {
+ int calendar_id = calendar_svc_struct_get_int(row_event, CAL_VALUE_INT_INDEX);
+ char *calendar_id_str = (char *)calloc(5, sizeof(char));
+ sprintf(calendar_id_str, "%d", calendar_id);
+ FW_LOGV("[da_calendar_plugIn] CAL_SYNC_STATUS_NEW : [%s]\n", calendar_id_str);
+
+ if (root_ptr == 0) {
+ root_ptr = (Item_Node *) calloc(1, sizeof(Item_Node));
+ root_ptr->item_id = calendar_id_str;
+ root_ptr->next = 0;
+ cursor_ptr = root_ptr;
+ } else {
+ cursor_ptr->next = (Item_Node *) calloc(1, sizeof(Item_Node));
+ cursor_ptr->next->item_id = calendar_id_str;
+ cursor_ptr->next->next = 0;
+ cursor_ptr = cursor_ptr->next;
+ }
+
+ chagned_count++;
+ }
+ }
+
+ if (row_event != 0) {
+ calendar_svc_struct_free(&row_event);
+ row_event = 0;
+ }
+ calendar_ret = calendar_svc_iter_next(iter);
+ }
+
+ if (iter != 0)
+ calendar_svc_iter_remove(&iter);
+
+ *changeCount = chagned_count;
+ return root_ptr;
+}
+
+Item_Node *Get_Changed_ITEM_For_Folder_Del(int account_id, const char *folder_id, int changepoint, int *changeCount)
+{
+ FW_LOGV("\n[da_calendar_plugIn] account_id : %d\n", account_id);
+ FW_LOGV("[da_calendar_plugIn] folder_id : %s\n", folder_id);
+ FW_LOGV("[da_calendar_plugIn] changepoint : %d\n", changepoint);
+
+ int calendarTimeStamp = changepoint;
+ int temp_folder_id = atoi(folder_id);
+ int calendar_ret = 0;
+ cal_iter *iter = 0;
+ cal_struct *row_event = 0;
+
+ Item_Node *root_ptr = 0;
+ Item_Node *cursor_ptr = 0;
+ int chagned_count = 0;
+
+ calendar_svc_get_updated_event_list(account_id, calendarTimeStamp, &iter);
+ calendar_ret = calendar_svc_iter_next(iter);
+ FW_LOGV("[da_calendar_plugIn] calendar_ret : %d\n", calendar_ret);
+
+ while (CAL_SUCCESS == calendar_ret) {
+ if ((calendar_svc_iter_get_info(iter, &row_event)) != CAL_SUCCESS) {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_iter_get_info() failed.\n");
+ } else {
+ int type = calendar_svc_struct_get_int(row_event, CAL_VALUE_INT_SYNC_STATUS);
+ int calendar_folder_id = calendar_svc_struct_get_int(row_event, CAL_VALUE_INT_CALENDAR_ID);
+
+ if ((type == CAL_SYNC_STATUS_DELETED) && (calendar_folder_id == temp_folder_id)) {
+ int calendar_id = calendar_svc_struct_get_int(row_event, CAL_VALUE_INT_INDEX);
+ char *calendar_id_str = (char *)calloc(5, sizeof(char));
+ sprintf(calendar_id_str, "%d", calendar_id);
+ FW_LOGV("[da_calendar_plugIn] CAL_SYNC_STATUS_DELETED : [%s]\n", calendar_id_str);
+
+ if (root_ptr == 0) {
+ root_ptr = (Item_Node *) calloc(1, sizeof(Item_Node));
+ root_ptr->item_id = calendar_id_str;
+ root_ptr->next = 0;
+ cursor_ptr = root_ptr;
+ } else {
+ cursor_ptr->next = (Item_Node *) calloc(1, sizeof(Item_Node));
+ cursor_ptr->next->item_id = calendar_id_str;
+ cursor_ptr->next->next = 0;
+ cursor_ptr = cursor_ptr->next;
+ }
+
+ chagned_count++;
+ }
+ }
+
+ if (row_event != 0) {
+ calendar_svc_struct_free(&row_event);
+ row_event = 0;
+ }
+ calendar_ret = calendar_svc_iter_next(iter);
+ }
+
+ if (iter != 0)
+ calendar_svc_iter_remove(&iter);
+
+ *changeCount = chagned_count;
+ return root_ptr;
+}
+
+Item_Node *Get_Changed_ITEM_For_Folder_Update(int account_id, const char *folder_id, int changepoint, int *changeCount)
+{
+ FW_LOGV("\n[da_calendar_plugIn] account_id : %d\n", account_id);
+ FW_LOGV("[da_calendar_plugIn] folder_id : %s\n", folder_id);
+ FW_LOGV("[da_calendar_plugIn] changepoint : %d\n", changepoint);
+
+ int calendarTimeStamp = changepoint;
+ int temp_folder_id = atoi(folder_id);
+ int calendar_ret = 0;
+ cal_iter *iter = 0;
+ cal_struct *row_event = 0;
+
+ Item_Node *root_ptr = 0;
+ Item_Node *cursor_ptr = 0;
+ int chagned_count = 0;
+
+ calendar_svc_get_updated_event_list(account_id, calendarTimeStamp, &iter);
+ calendar_ret = calendar_svc_iter_next(iter);
+ FW_LOGV("[da_calendar_plugIn] calendar_ret : %d\n", calendar_ret);
+
+ while (CAL_SUCCESS == calendar_ret) {
+ if ((calendar_svc_iter_get_info(iter, &row_event)) != CAL_SUCCESS) {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_iter_get_info() failed.\n");
+ } else {
+ int type = calendar_svc_struct_get_int(row_event, CAL_VALUE_INT_SYNC_STATUS);
+ int calendar_folder_id = calendar_svc_struct_get_int(row_event, CAL_VALUE_INT_CALENDAR_ID);
+
+ if ((type == CAL_SYNC_STATUS_UPDATED) && (calendar_folder_id == temp_folder_id)) {
+ int calendar_id = calendar_svc_struct_get_int(row_event, CAL_VALUE_INT_INDEX);
+ char *calendar_id_str = (char *)calloc(5, sizeof(char));
+ sprintf(calendar_id_str, "%d", calendar_id);
+ FW_LOGV("[da_calendar_plugIn] CAL_SYNC_STATUS_UPDATED : [%s]\n", calendar_id_str);
+
+ if (root_ptr == 0) {
+ root_ptr = (Item_Node *) calloc(1, sizeof(Item_Node));
+ root_ptr->item_id = calendar_id_str;
+ root_ptr->next = 0;
+ cursor_ptr = root_ptr;
+ } else {
+ cursor_ptr->next = (Item_Node *) calloc(1, sizeof(Item_Node));
+ cursor_ptr->next->item_id = calendar_id_str;
+ cursor_ptr->next->next = 0;
+ cursor_ptr = cursor_ptr->next;
+ }
+
+ chagned_count++;
+ }
+ }
+
+ if (row_event != 0) {
+ calendar_svc_struct_free(&row_event);
+ row_event = 0;
+ }
+ calendar_ret = calendar_svc_iter_next(iter);
+ }
+
+ if (iter != 0)
+ calendar_svc_iter_remove(&iter);
+
+ *changeCount = chagned_count;
+ return root_ptr;
+}
+
+int Get_Last_ChangePoint()
+{
+ return (int)time(0);
+}
+
+void StartListening_ChangeNoti(void *data)
+{
+ calendar_svc_subscribe_change(__process_Calendar_Change, 0);
+}
+
+void SetCallBack_AddItem(CALLBACK_ADD_ITEM callback)
+{
+ callback_add_item = callback;
+}
+
+void SetCallBack_DeleteItem(CALLBACK_DEL_ITEM callback)
+{
+ callback_del_item = callback;
+}
+
+void SetCallBack_UpdateItem(CALLBACK_UPDATE_ITEM callback)
+{
+ callback_update_item = callback;
+}
+
+void SetCallBack_GetAccountIDList(GET_ACCOUNTIDLIST callback)
+{
+ callback_get_accountidlist = callback;
+}
+
+int Get_MAX_Item_Count(int folder_type)
+{
+ return MAX_ITEM_COUNT_CALENDAR;
+}
+
+int Get_MAX_Field_Length(int field_name, int child_field_name)
+{
+ switch (field_name) {
+ case CALENDAR_FIELD_SUMMARY:
+ return MAX_LEN_SUMMARY;
+ case CALENDAR_FIELD_DESCRIPTION:
+ return MAX_LEN_DESCRIPTION;
+ case CALENDAR_FIELD_LOCATOIN:
+ return MAX_LEN_LOCATION;
+ case CALENDAR_FIELD_MEMO:
+ return MAX_LEN_MEMO;
+ default:
+ return -1;
+ }
+}
+
+int Get_MAX_Field_Count(int field_name, int child_field_name)
+{
+ return -1;
+}
+
+int Get_Field_Value(int field_name, int child_field_name, char **str_val, int *num_val1, int *num_val2)
+{
+ switch (field_name) {
+ case CALENDAR_FIELD_YEAR:
+ *num_val1 = MIN_PERIOD_YEAR;
+ *num_val2 = MAX_PERIOD_YEAR;
+ return 1;
+ case CALENDAR_FIELD_TYPE_MODEL:
+ *str_val = VAL_TYPE_MODEL;
+ return 1;
+ case CALENDAR_FIELD_DB_INDEX:
+ switch (child_field_name) {
+ case CALENDAR_FEATURE_APPOINTMENT:
+ *num_val1 = VAL_DB_INDEX_APPOINTMENT;
+ return 1;
+ case CALENDAR_FEATURE_ANNIVERSARY:
+ *num_val1 = VAL_DB_INDEX_ANNIVERSARY;
+ return 1;
+ case CALENDAR_FEATURE_HOLIDAY:
+ *num_val1 = VAL_DB_INDEX_HOLIDAY;
+ return 1;
+ case CALENDAR_FEATURE_IMPORTANT:
+ *num_val1 = VAL_DB_INDEX_IMPORTANT;
+ return 1;
+ case CALENDAR_FEATURE_PRIVATE:
+ *num_val1 = VAL_DB_INDEX_PRIVATE;
+ return 1;
+ case CALENDAR_FEATURE_MISCELLANEOUS:
+ *num_val1 = VAL_DB_INDEX_MISCELLANEOUS;
+ return 1;
+ case CALENDAR_FEATURE_TASK:
+ *num_val1 = VAL_DB_INDEX_TASK;
+ return 1;
+ case CALENDAR_FEATURE_MEMO:
+ *num_val1 = VAL_DB_INDEX_MEMO;
+ return 1;
+ default:
+ return -1;
+ }
+ case CALENDAR_FIELD_TIMEZONE:
+ switch (child_field_name) {
+ case CALENDAR_CHILD_FIELD_BIAS:
+ *num_val1 = (int)VAL_TZ_BIAS;
+ return 1;
+ case CALENDAR_CHILD_FIELD_DAYLIGHT:
+ *num_val1 = (int)VAL_TZ_DAYLIGHT;
+ return 1;
+ case CALENDAR_CHILD_FIELD_DAYLIGHT_BIAS:
+ *num_val1 = (int)VAL_TZ_DAYLIGHT_BIAS;
+ return 1;
+ case CALENDAR_CHILD_FIELD_DAYLIGHT_BEGIN:
+ *str_val = VAL_TZ_DAYLIGHT_BEGIN;
+ return 1;
+ case CALENDAR_CHILD_FIELD_DAYLIGHT_END:
+ *str_val = VAL_TZ_DAYLIGHT_END;
+ return 1;
+ case CALENDAR_CHILD_FIELD_STANDARD_TIMENAME:
+ *str_val = VAL_TZ_STANDARD_TIMENAME;
+ return 1;
+ case CALENDAR_CHILD_FIELD_DAYLIGHT_TIMENAME:
+ *str_val = VAL_TZ_DAYLIGHT_TIMENAME;
+ return 1;
+ default:
+ return -1;
+ }
+ default:
+ return -1;
+ }
+}
+
+int Get_Is_Support_Feature(int feature)
+{
+ switch (feature) {
+ case CALENDAR_FEATURE_APPOINTMENT:
+ return IF_SUPPORT_APPOINTMENT;
+ case CALENDAR_FEATURE_ANNIVERSARY:
+ return IF_SUPPORT_ANNIVERSARY;
+ case CALENDAR_FEATURE_HOLIDAY:
+ return IF_SUPPORT_HOLIDAY;
+ case CALENDAR_FEATURE_IMPORTANT:
+ return IF_SUPPORT_IMPORTANT;
+ case CALENDAR_FEATURE_PRIVATE:
+ return IF_SUPPORT_PRIVATE;
+ case CALENDAR_FEATURE_MISCELLANEOUS:
+ return IF_SUPPORT_MISCELLANEOUS;
+ case CALENDAR_FEATURE_TASK:
+ return IF_SUPPORT_TASK;
+ case CALENDAR_FEATURE_MEMO:
+ return IF_SUPPORT_MEMO;
+ default:
+ return -1;
+ }
+}
+
+/********************************** static function *******************************************/
+
+static void __set_IsNotiFromMe(int set_flag)
+{
+ if (pthread_mutex_lock(&lockx)) {
+ FW_LOGV("[da_calendar_plugIn] pthread_mutex_lock error");
+ }
+
+ isNotiFromMe = set_flag;
+
+ if (pthread_mutex_unlock(&lockx)) {
+ FW_LOGV("[da_calendar_plugIn] pthread_mutex_unlock error");
+ }
+}
+
+static int __get_IsNotiFromMe()
+{
+ return isNotiFromMe;
+}
+
+void __process_Calendar_Change(void *data)
+{
+ FW_LOGV("[da_calendar_plugIn] detected calendar storage changed\n");
+
+ int from_Me = __get_IsNotiFromMe();
+ if (from_Me == 1) {
+ __set_IsNotiFromMe(0);
+ FW_LOGV("[da_calendar_plugIn] This noti is from Me!! so will be ignored!!\n");
+ return;
+ }
+
+ pthread_t thread_process_change_id;
+ pthread_create(&thread_process_change_id, 0, __rutine_Calendar_Change, 0);
+}
+
+static void *__rutine_Calendar_Change(void *data)
+{
+ FW_LOGV("[da_calendar_plugIn] Start __rutine_Calendar_Change (create thread)\n");
+
+ int calendarTimeStamp = getCalendarTimeStamp();
+
+ int count;
+ int *accountList = callback_get_accountidlist(FW_CALENDAR, &count);
+ if (accountList == 0)
+ return 0;
+
+ cal_iter *iter = 0;
+
+ int i = 0;
+ for (; i < count; i++) {
+ int calendar_account_id = accountList[i];
+ FW_LOGV("[da_calendar_plugIn] calendar_account_id : %d, count : %d\n", calendar_account_id, count);
+ FW_LOGV("[da_calendar_plugIn] Before calendar_svc_get_updated_event_list : %d\n", calendarTimeStamp);
+
+ calendar_svc_get_updated_event_list(calendar_account_id, calendarTimeStamp, &iter);
+ int calendar_ret = calendar_svc_iter_next(iter);
+ FW_LOGV("[da_calendar_plugIn] calendar_ret : %d\n", calendar_ret);
+
+ while (CAL_SUCCESS == calendar_ret) {
+ cal_struct *row_event = 0;
+
+ if ((calendar_svc_iter_get_info(iter, &row_event)) != CAL_SUCCESS) {
+ FW_LOGV("[da_calendar_plugIn] calendar_svc_iter_get_info() failed.\n");
+ } else {
+ int calendar_id = calendar_svc_struct_get_int(row_event, CAL_VALUE_INT_INDEX);
+ char calendar_id_str[12];
+ sprintf(calendar_id_str, "%d", calendar_id);
+ int type = calendar_svc_struct_get_int(row_event, CAL_VALUE_INT_SYNC_STATUS);
+ int calendar_folder_id = calendar_svc_struct_get_int(row_event, CAL_VALUE_INT_CALENDAR_ID);
+ char calendar_folder_id_str[12];
+ sprintf(calendar_folder_id_str, "%d", calendar_folder_id);
+ switch (type) {
+ case CAL_SYNC_STATUS_NEW:
+ {
+ FW_LOGV("[da_calendar_plugIn] Calendar Inserted!\n");
+ FW_LOGV("[da_calendar_plugIn] calendar folder id : %s\n", calendar_folder_id_str);
+ int result = callback_add_item(accountList[i], i, calendar_id_str, FW_CALENDAR, calendar_folder_id_str, 0);
+ if (!result)
+ FW_LOGV("[da_calendar_plugIn] Failed to call SA_EH_Add_Item() \n");
+ else
+ FW_LOGV("[da_calendar_plugIn] Success to call SA_EH_Add_Item() \n");
+
+ }
+ break;
+ case CAL_SYNC_STATUS_UPDATED:
+ {
+ FW_LOGV("[da_calendar_plugIn] Calendar Updated!\n");
+ int result = callback_update_item(accountList[i], i, calendar_id_str, FW_CALENDAR);
+ if (!result)
+ FW_LOGV("[da_calendar_plugIn] Failed to call callback_del_item() \n");
+ }
+ break;
+ case CAL_SYNC_STATUS_DELETED:
+ {
+ FW_LOGV("[da_calendar_plugIn] Calendar Deleted!\n");
+ int result = callback_del_item(accountList[i], i, calendar_id_str, FW_CALENDAR);
+ if (!result)
+ FW_LOGV("[da_calendar_plugIn] Failed to call callback_del_item() \n");
+ }
+ break;
+ default:
+ FW_LOGV("[da_calendar_plugIn] cached Another Calendar Change Noti!\n");
+ break;
+ }
+ }
+
+ calendar_svc_struct_free(&row_event);
+ row_event = 0;
+ calendar_ret = calendar_svc_iter_next(iter);
+ }
+ }
+
+ if (accountList != 0) {
+ free(accountList);
+ }
+
+ calendar_svc_iter_remove(&iter);
+
+ FW_LOGV("[da_calendar_plugIn] End __rutine_Calendar_Change (create thread)\n");
+
+ return 0;
+}
+
+static DACI_RETURN __convert_service_error_to_common_error(cal_error err)
+{
+ DACI_RETURN ret = DACI_SUCCESS;
+ FW_LOGV("[da_calendar_plugIn] Error Code : %d\n", err);
+
+ switch (err) {
+ case CAL_ERR_DB_LOCK: /* -204 */
+ ret = DACI_ERR_LOCKED;
+ break;
+ case CAL_ERR_DB_RECORD_NOT_FOUND: /* -203 */
+ case CAL_ERR_NO_DATA: /* -3 */
+ ret = DACI_ERR_NO_DATA;
+ break;
+ case CAL_ERR_DB_NOT_OPENED: /* -201 */
+ ret = DACI_ERR_OPEN_FAILED;
+ break;
+ case CAL_ERR_OUT_OF_MEMORY: /* -8 */
+ ret = DACI_ERR_MEMORY_FULL;
+ break;
+ case CAL_ERR_ALREADY_EXIST: /* -7 */
+ ret = DACI_ERR_ALREADY_EXIST;
+ break;
+ case CAL_ERR_EVENT_START_DATE: /* -405 */
+ case CAL_ERR_EVENT_END_DATE: /* -404 */
+ case CAL_ERR_EVENT_REPEAT_END_DATE: /* -403 */
+ case CAL_ERR_EVENT_DURATION: /* -402 */
+ case CAL_ERR_EVENT_REPEAT_DURATION_TOO_SHORT: /* -401 */
+ case CAL_ERR_INVALID_DATA_TYPE: /* -301 */
+ case CAL_ERR_ARG_NULL: /* -5 */
+ case CAL_ERR_ARG_INVALID: /* -4 */
+ ret = DACI_ERR_INVALID_CONTENT;
+ break;
+ case CAL_ERR_FINISH_ITER: /* -2 */
+ case CAL_SUCCESS: /* 0 */
+ case CAL_TRUE: /* 1 */
+ ret = DACI_SUCCESS;
+ break;
+ /*
+ * CAL_ERR_DB_FAILED: -202,
+ * CAL_ERR_VCONF_FAILED: -102,
+ * CAL_ERR_VOBJECT_FAILED: -101,
+ * CAL_ERR_EXCEEDED_LIMIT: -9,
+ * CAL_ERR_ENV_INVALID: -6, CAL_ERR_FAIL: -1,
+ */
+ default:
+ ret = DACI_ERRORS;
+ break;
+ }
+
+ return ret;
+}
+
+static bool __get_account_id(account_h account, void *user_data)
+{
+ Account_ID_t *account_info_list = user_data;
+
+ bool has_contact = FALSE;
+
+ account_get_capability(account, __is_Calendar_ID, &has_contact);
+
+ if (has_contact == FALSE) {
+ /* DO Nothing */
+ } else {
+ Account_ID_t *account_info = (Account_ID_t *) calloc(1, sizeof(Account_ID_t));
+ account_get_account_id(account, &(account_info->account_id));
+ FW_LOGV("Getted accont id : %d", account_info->account_id);
+ account_info->next = 0;
+
+ Account_ID_t *cursor_ptr = account_info_list;
+ while (cursor_ptr->next != 0) {
+ cursor_ptr = cursor_ptr->next;
+ }
+
+ cursor_ptr->next = account_info;
+ }
+
+ return has_contact;
+}
+
+static bool __is_Calendar_ID(account_capability_type_e capability_type, account_capability_state_e capability_value, void *user_data)
+{
+ bool *has_contact = user_data;
+ if (capability_type == ACCOUNT_CAPABILITY_CALENDAR) {
+ *has_contact = TRUE;
+ return FALSE;
+ }
+ return TRUE;
+}
diff --git a/fw-plugin/contact-plugIn/.cproject b/fw-plugin/contact-plugIn/.cproject
new file mode 100755
index 0000000..3c36d31
--- /dev/null
+++ b/fw-plugin/contact-plugIn/.cproject
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?>
+
+<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="org.eclipse.cdt.core.default.config.2033120496">
+ <storageModule buildSystemId="org.eclipse.cdt.core.defaultConfigDataProvider" id="org.eclipse.cdt.core.default.config.2033120496" moduleId="org.eclipse.cdt.core.settings" name="Configuration">
+ <externalSettings/>
+ <extensions>
+ <extension id="com.samsung.limo.SboxELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="com.samsung.limo.SboxGCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="com.samsung.limo.SboxMakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ <storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
+ <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
+ <storageModule moduleId="org.eclipse.cdt.core.pathentry">
+ <pathentry kind="src" path="include"/>
+ <pathentry kind="src" path="src"/>
+ <pathentry excluding="include|src" kind="src" path=""/>
+ <pathentry kind="out" path=""/>
+ </storageModule>
+ </cconfiguration>
+ </storageModule>
+</cproject>
diff --git a/fw-plugin/contact-plugIn/.project b/fw-plugin/contact-plugIn/.project
new file mode 100755
index 0000000..8b2297c
--- /dev/null
+++ b/fw-plugin/contact-plugIn/.project
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>contact-plugIn</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>com.samsung.slp2.SboxBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>com.samsung.slp2.SboxBuilder.needConfigure</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;com.samsung.limo.SboxGCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.append_environment</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.arguments</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.command</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.auto</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.clean</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.inc</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.environment</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>com.samsung.slp2.cnature</nature>
+ </natures>
+</projectDescription>
diff --git a/fw-plugin/contact-plugIn/CMakeLists.src b/fw-plugin/contact-plugIn/CMakeLists.src
new file mode 100755
index 0000000..04ce4aa
--- /dev/null
+++ b/fw-plugin/contact-plugIn/CMakeLists.src
@@ -0,0 +1 @@
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRCS)
diff --git a/fw-plugin/contact-plugIn/CMakeLists.sub b/fw-plugin/contact-plugIn/CMakeLists.sub
new file mode 100755
index 0000000..b7259d2
--- /dev/null
+++ b/fw-plugin/contact-plugIn/CMakeLists.sub
@@ -0,0 +1,37 @@
+#################################################################################
+# THIS FILE IS CREATED AUTOMATICALLY. DO NOT DELETE OR MODIFY THIS FILE.
+#################################################################################
+
+INCLUDE(CMakeLists.src)
+
+## PROJECT NAME
+PROJECT(plugin-da-contact C)
+
+## PACKAGE CONFIG
+SET(SLP_PKGCONFIG_LIST "contacts-service accounts-svc")
+
+## INCLUDES
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../framework/include)
+
+## DEFINITIONS
+ADD_DEFINITIONS("-DAPP_DIR=\"${CMAKE_INSTALL_PREFIX}\"")
+
+## LIBRARY PATH
+SET(SLP_LD_PATH_FLAGS "")
+
+## LIBRARY
+SET(SLP_LD_FLAGS "")
+
+## DEBUG
+SET(SLP_DEBUG_FLAGS "-g")
+
+## OPTIMIZATION
+SET(SLP_OPT_FLAGS "-O0")
+
+## COMPILER FLAGS
+SET(SLP_COMPILER_FLAGS "-lpthread")
+
+## LINKER FLAGS
+SET(SLP_LINKER_FLAGS "-lpthread")
+
diff --git a/fw-plugin/contact-plugIn/CMakeLists.txt b/fw-plugin/contact-plugIn/CMakeLists.txt
new file mode 100755
index 0000000..2789562
--- /dev/null
+++ b/fw-plugin/contact-plugIn/CMakeLists.txt
@@ -0,0 +1,33 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+
+# INCLUDE SUB CMAKELIST FILE
+INCLUDE(CMakeLists.sub)
+
+SET(RESOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/res")
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs_plugin_contact REQUIRED ${SLP_PKGCONFIG_LIST})
+
+FOREACH(flag ${pkgs_plugin_contact_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+SET(CMAKE_CXX_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+
+ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS})
+
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_plugin_contact_LDFLAGS} ${SLP_LD_PATH_FLAGS} ${SLP_LD_FLAGS} ${SLP_LINKER_FLAGS} sync-agent-framework)
+
+# INSTALL
+INSTALL(TARGETS ${PROJECT_NAME} DESTINATION lib)
+#INSTALL(DIRECTORY ${RESOURCE_DIR}/data DESTINATION share)
+
+#added by KTS for install to the system
+#CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY)
+#INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig)
+
+
+# INCLUDE LAYOUT DIRECTORY
+# ADD_SUBDIRECTORY(layout)
+#ADD_SUBDIRECTORY(res/locale)
diff --git a/fw-plugin/contact-plugIn/include/EXT_DataStore_Info_Contact.h b/fw-plugin/contact-plugIn/include/EXT_DataStore_Info_Contact.h
new file mode 100755
index 0000000..5b00e9a
--- /dev/null
+++ b/fw-plugin/contact-plugIn/include/EXT_DataStore_Info_Contact.h
@@ -0,0 +1,80 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef EXT_DATASTORE_INFO_CONTACT_H_
+#define EXT_DATASTORE_INFO_CONTACT_H_
+
+typedef enum {
+ CONTACT_FIELD_NAME = 1,
+ CONTACT_FIELD_TEL,
+ CONTACT_FIELD_EMAIL,
+ CONTACT_FIELD_URL,
+ CONTACT_FIELD_ADDR,
+ CONTACT_FIELD_NOTE,
+ CONTACT_FIELD_COMPANY,
+ CONTACT_FIELD_DEPARTMENT,
+ CONTACT_FIELD_TITLE,
+ CONTACT_FIELD_HOBBY,
+ CONTACT_FIELD_PHOTO,
+ CONTACT_FIELD_YEAR
+} CONTACT_FIELD;
+
+typedef enum {
+ CONTACT_CHILD_FIELD_FAMILY = 1,
+ CONTACT_CHILD_FIELD_GIVEN,
+ CONTACT_CHILD_FIELD_MIDDLE,
+ CONTACT_CHILD_FIELD_PREFIX,
+ CONTACT_CHILD_FIELD_SUFFIX,
+ CONTACT_CHILD_FIELD_FORMATTED,
+ CONTACT_CHILD_FIELD_NICKNAME,
+ CONTACT_CHILD_FIELD_READING_NAME,
+ CONTACT_CHILD_FIELD_READING_LAST_NAME,
+ CONTACT_CHILD_FIELD_TEL,
+ CONTACT_CHILD_FIELD_EMAIL,
+ CONTACT_CHILD_FIELD_URL,
+ CONTACT_CHILD_FIELD_POBOX,
+ CONTACT_CHILD_FIELD_EXT_ADDR,
+ CONTACT_CHILD_FIELD_STREET,
+ CONTACT_CHILD_FIELD_LOCALITY,
+ CONTACT_CHILD_FIELD_REGION,
+ CONTACT_CHILD_FIELD_POSTAL_CODE,
+ CONTACT_CHILD_FIELD_COUNTRY
+} CONTACT_CHILD_FIELD;
+
+typedef enum {
+ CONTACT_FEATURE_GENDER = 1
+} CONTACT_FEATURE;
+
+#endif /* EXT_DATASTORE_INFO_CONTACT_H_ */
diff --git a/fw-plugin/contact-plugIn/include/Extern_Info.h b/fw-plugin/contact-plugIn/include/Extern_Info.h
new file mode 100755
index 0000000..137503f
--- /dev/null
+++ b/fw-plugin/contact-plugIn/include/Extern_Info.h
@@ -0,0 +1,44 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef EXTERN_INFO_H_
+#define EXTERN_INFO_H_
+
+typedef enum {
+ DEFAULT_CONTACT_FOLDER = 0,
+ USER_DEFINED_FOLDER
+} CONTACT_FOLDER_TYPE;
+
+#endif /* EXTERN_INFO_H_ */
diff --git a/fw-plugin/contact-plugIn/include/IN_DataStore_Info_Contact.h b/fw-plugin/contact-plugIn/include/IN_DataStore_Info_Contact.h
new file mode 100755
index 0000000..be108ec
--- /dev/null
+++ b/fw-plugin/contact-plugIn/include/IN_DataStore_Info_Contact.h
@@ -0,0 +1,99 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef IN_DATASTORE_INFO_CONTACT_H_
+#define IN_DATASTORE_INFO_CONTACT_H_
+
+/* ITEM COUNT */
+#define MAX_ITEM_COUNT_CONTACT 65535
+
+/* FIELD COUNT */
+#define MAX_FIELD_COUNT_TEL 3
+#define MAX_FIELD_COUNT_EMAIL 2
+#define MAX_FIELD_COUNT_URL 1
+#define MAX_FIELD_COUNT_ADDR 2
+
+/* NAME FIELD */
+#define MAX_LEN_FAMILY 2000
+#define MAX_LEN_GIVEN 2000
+#define MAX_LEN_MIDDLE 2000
+#define MAX_LEN_PREFIX FALSE
+#define MAX_LEN_SUFFIX 2000
+#define MAX_LEN_FORMATTED FALSE
+#define MAX_LEN_NICKNAME 2000
+#define MAX_LEN_READING_NAME FALSE
+#define MAX_LEN_READING_LAST_NAME FALSE
+
+/* TEL FIELD */
+#define MAX_LEN_TEL 100
+
+/* EMAIL FIELD */
+#define MAX_LEN_EMAIL 100
+
+/* URL FIELD */
+#define MAX_LEN_URL 100
+
+/* ADDR FIELD */
+#define MAX_LEN_POBOX FALSE
+#define MAX_LEN_EXT_ADDR FALSE
+#define MAX_LEN_STREET 50
+#define MAX_LEN_LOCALITY 50
+#define MAX_LEN_REGION 50
+#define MAX_LEN_POSTAL_CODE 50
+#define MAX_LEN_COUNTRY 20
+
+/* DEVICE CONTACT */
+#define MAX_LEN_NOTE 100
+#define MAX_LEN_COMPANY 50
+#define MAX_LEN_DEPARTMENT FALSE
+#define MAX_LEN_TITLE FALSE
+#define MAX_LEN_HOBBY FALSE
+#define MIN_PERIOD_YEAR 1970
+#define MAX_PERIOD_YEAR 2037
+#define MAX_LEN_PHOTO 46
+
+/* FEATURE */
+#define IF_SUPPORT_GENDER FALSE
+
+/* SIM CONTACT */
+#define TYPE_SIM
+#define MAX_LEN_NAME
+#define MAX_LEN_NUMBER
+#define MAX_COUNT_ANR
+#define MAX_LEN_ANR
+#define MAX_LEN_SNE
+#define IF_USING_SIM
+
+#endif /* IN_DATASTORE_INFO_CONTACT_H_ */
diff --git a/fw-plugin/contact-plugIn/include/Item_Change_Info.h b/fw-plugin/contact-plugIn/include/Item_Change_Info.h
new file mode 100755
index 0000000..b21182e
--- /dev/null
+++ b/fw-plugin/contact-plugIn/include/Item_Change_Info.h
@@ -0,0 +1,43 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef ITEM_CHANGE_INFO_H_
+#define ITEM_CHANGE_INFO_H_
+
+int getContactVersion(int mode);
+
+int setContactVersion(int settingTime);
+
+#endif /* ITEM_CHANGE_INFO_H_ */
diff --git a/fw-plugin/contact-plugIn/src/Item_Change_Info.c b/fw-plugin/contact-plugIn/src/Item_Change_Info.c
new file mode 100755
index 0000000..a301c74
--- /dev/null
+++ b/fw-plugin/contact-plugIn/src/Item_Change_Info.c
@@ -0,0 +1,69 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include <contacts-svc.h>
+
+#include "Item_Change_Info.h"
+
+static int contactVersion = 0;
+
+int getContactVersion(int mode)
+{
+/* if (contactTimeStamp > 0)
+ return contactTimeStamp;
+
+ return ((int)time(0) - 1);*/
+
+ if (mode == 0) {
+ return contactVersion;
+ }
+
+/* if (contactVersion > 0)
+ return contactVersion;*/
+
+ contacts_svc_begin_trans();
+ contactVersion = contacts_svc_end_trans(1);
+
+ return contactVersion;
+}
+
+int setContactVersion(int settingTime)
+{
+ /* Critical Sectioin Start */
+ contactVersion = settingTime;
+ /* Critical Section End */
+
+ return settingTime;
+}
diff --git a/fw-plugin/contact-plugIn/src/PlugIn_Interface.c b/fw-plugin/contact-plugIn/src/PlugIn_Interface.c
new file mode 100755
index 0000000..c59df5c
--- /dev/null
+++ b/fw-plugin/contact-plugIn/src/PlugIn_Interface.c
@@ -0,0 +1,1328 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <glib.h>
+#include <pthread.h>
+
+#include <contacts-svc.h>
+#include <account.h>
+
+#include "Extern_Info.h"
+#include "Item_Change_Info.h"
+#include "EXT_DataStore_Info_Contact.h"
+#include "IN_DataStore_Info_Contact.h"
+
+/* for log */
+#include "agent-framework/Utility/fw_log.h"
+#include "agent-framework/Utility/fw_async_queue.h"
+
+#include "agent-framework/PlugIn/DataConnector_Interface.h"
+
+#define LOG_TAG "PLUGIN_DA_CONTACT"
+
+#define FW_CONTACT 0 /* plugIn-Id */
+
+static int latest_contact_version;
+
+static fw_async_queue_t *pQueue;
+
+static pthread_mutex_t lockx;
+
+static int isNotiFromMe = 0;
+
+static int isStorageChanged = 0;
+
+static CALLBACK_ADD_ITEM callback_add_item;
+
+static CALLBACK_DEL_ITEM callback_del_item;
+
+static CALLBACK_UPDATE_ITEM callback_update_item;
+
+static GET_ACCOUNTIDLIST callback_get_accountidlist;
+
+static void __set_IsNotiFromMe(int set_flag);
+
+static int __get_IsNotiFromMe();
+
+static void __process_Contact_Change(void *);
+
+static void *__rutine_Contact_Change(void *);
+
+static DACI_RETURN __convert_service_error_to_common_error(cts_error err);
+
+static bool __get_account_id(account_h account, void *user_data);
+
+static bool __is_Contact_ID(account_capability_type_e capability_type, account_capability_state_e capability_value, void *user_data);
+
+typedef struct Account_ID {
+ int account_id;
+ struct Account_ID *next;
+} Account_ID_t;
+
+DACI_RETURN Service_Open()
+{
+ FW_LOGV("[da_contact_plugIn] Start in Contact\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = contacts_svc_connect();
+ if (err < CTS_SUCCESS) {
+ FW_LOGV("[da_contact_plugIn] in contact Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ } else {
+ FW_LOGV("[da_contact_plugIn] in contact Success!\n");
+ }
+
+ FW_LOGV("[da_contact_plugIn] End in Contact\n");
+ return ret;
+}
+
+DACI_RETURN Service_Close()
+{
+ FW_LOGV("[da_contact_plugIn] Start in Contact\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = contacts_svc_disconnect();
+ if (err < CTS_SUCCESS) {
+ FW_LOGV("[da_contact_plugIn] in contact Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ } else {
+ FW_LOGV("[da_contact_plugIn] in contact Success!\n");
+ }
+
+ FW_LOGV("[da_contact_plugIn] End in Contact\n");
+ return ret;
+}
+
+DACI_RETURN Begin_Transaction()
+{
+ FW_LOGV("[da_contact_plugIn] Start Begin_Transaction\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = contacts_svc_begin_trans();
+ if (err < CTS_SUCCESS) {
+ FW_LOGV("[da_contact_plugIn] in contact Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ } else {
+ FW_LOGV("[da_contact_plugIn] in contact Success!\n");
+ __set_IsNotiFromMe(1);
+ }
+
+ FW_LOGV("[da_contact_plugIn] End Begin_Transaction\n");
+ return ret;
+}
+
+DACI_RETURN End_Transaction(int is_success)
+{
+ FW_LOGV("[da_contact_plugIn] Start End_Transaction\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = contacts_svc_end_trans(is_success);
+ if (err < CTS_SUCCESS) {
+ FW_LOGV("[da_contact_plugIn] in contact Fail!");
+ ret = __convert_service_error_to_common_error(err);
+ } else {
+ FW_LOGV("[da_contact_plugIn] in contact Success!");
+ if (isStorageChanged == 0) {
+ FW_LOGV("contact storaged was not Changed!!");
+ __set_IsNotiFromMe(0);
+ }
+ isStorageChanged = 0;
+ }
+
+ FW_LOGV("[da_contact_plugIn] End End_Transaction\n");
+ return ret;
+}
+
+DACI_RETURN Add_Item(int account_id, char *folder_id, void *data, char **item_id)
+{
+ FW_LOGV("[da_contact_plugIn] Start in Contact\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+ CTSstruct *item = (CTSstruct *)data;
+
+ /* parameter check */
+ if (folder_id == 0) {
+ FW_LOGV("[da_contact_plugIn] service id is null \n");
+
+ /* memory free */
+ if (item != 0)
+ contacts_svc_struct_free(item);
+
+ *item_id = 0;
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ /* add item */
+ err = contacts_svc_insert_contact(atoi(folder_id), (CTSstruct *)item);
+ if (err < CTS_SUCCESS) {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_insert_contact() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ *item_id = 0;
+ } else {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_insert_contact() Success!\n");
+ *item_id = g_strdup_printf("%d", err);
+ isStorageChanged = 1;
+ }
+
+ /* memory free */
+ if (item != 0)
+ contacts_svc_struct_free(item);
+
+ FW_LOGV("[da_contact_plugIn] End in Contact\n");
+ return ret;
+}
+
+DACI_RETURN Update_Item(int account_id, char *folder_id, char *item_id, void *data)
+{
+ FW_LOGV("[da_contact_plugIn] Start in Contact\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+ CTSstruct *item = (CTSstruct *)data;
+
+ /* parameter check */
+ if ((folder_id == 0) || (item_id == 0)) {
+ FW_LOGV("[da_contact_plugIn] service id is null \n");
+
+ /* memory free */
+ if (item != 0)
+ contacts_svc_struct_free(item);
+
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ /* update item */
+ err = contacts_svc_update_contact((CTSstruct *)item);
+ if (err < CTS_SUCCESS) {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_update_contact() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ } else {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_update_contact() Success!\n");
+ isStorageChanged = 1;
+ }
+
+ /* memory free */
+ if (item != 0)
+ contacts_svc_struct_free(item);
+
+ FW_LOGV("[da_contact_plugIn] End in Contact\n");
+ return ret;
+
+/*DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+ CTSstruct *item = (CTSstruct *)data;
+
+ err = contacts_svc_update_contact(item);
+ if (err < CTS_SUCCESS) {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_update_contact() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ } else {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_update_contact() Success!\n");
+ }
+
+ // memory free
+ if (item != 0)
+ contacts_svc_struct_free(item);
+
+ FW_LOGV("[da_contact_plugIn] End in Contact\n");
+ return ret;*/
+}
+
+DACI_RETURN Del_Item(int account_id, char *folder_id, char *item_id)
+{
+ FW_LOGV("[da_contact_plugIn] Start in Contact\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+
+ /* parameter check */
+ if (item_id == 0) {
+ FW_LOGV("[da_contact_plugIn] service id is null \n");
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ /* delete item */
+ err = contacts_svc_delete_contact(atoi(item_id));
+ if (err < CTS_SUCCESS) {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_delete_contact(%s) Fail!\n", item_id);
+ ret = __convert_service_error_to_common_error(err);
+ } else {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_delete_contact(%s) Success!\n", item_id);
+ isStorageChanged = 1;
+ }
+
+ FW_LOGV("[da_contact_plugIn] End in Contact\n");
+ return ret;
+}
+
+DACI_RETURN Del_All_Items(int account_id)
+{
+ FW_LOGV("[da_contact_plugIn] Start in Contact\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+ int folder_id_list_cnt = 0;
+ int *folder_type_list = 0;
+ char **folder_id_list = 0;
+ CTSiter *iter = 0;
+ CTSvalue *item = 0;
+ int item_id = 0;
+
+ /* get folder id list for account id */
+ folder_id_list = Get_Folder_ID_List(account_id, &folder_id_list_cnt, &folder_type_list);
+ if (folder_id_list == 0) {
+ FW_LOGV("[da_contact_plugIn] folder id list cnt : %d\n", folder_id_list_cnt);
+ return DACI_ERR_NO_DATA;
+ }
+
+ int cnt = 0;
+ for (; cnt < folder_id_list_cnt; cnt++) {
+ /* get item id list (iter) for each folder id */
+ err = contacts_svc_get_list_with_int(CTS_LIST_MEMBERS_OF_ADDRESSBOOK_ID, atoi(folder_id_list[cnt]), &iter);
+
+ if (err == CTS_SUCCESS) {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_get_list_with_int Success!! \n");
+
+ while (contacts_svc_iter_next(iter) == CTS_SUCCESS) {
+ /* get item */
+ item = contacts_svc_iter_get_info(iter);
+ if (item != 0) {
+ item_id = contacts_svc_value_get_int(item, CTS_LIST_CONTACT_ID_INT);
+ FW_LOGV("[da_contact_plugIn] item id : %d\n", item_id);
+
+ /* delete item */
+ err = contacts_svc_delete_contact(item_id);
+ if (err != CTS_SUCCESS) {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_delete_contact(%d) Fail!\n", item_id);
+ ret = __convert_service_error_to_common_error(err);
+ goto DACI_FINISH;
+ } else {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_delete_contact(%d) Success!\n", item_id);
+ isStorageChanged = 1;
+ }
+
+ /* memory free */
+ contacts_svc_value_free(item);
+ item = 0;
+ item_id = 0;
+ }
+ } /* end while */
+
+ /* memory free */
+ if (iter != 0) {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_iter_remove !! \n");
+ contacts_svc_iter_remove(iter);
+ iter = 0;
+ }
+
+ } else {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_get_list_with_int Fail !! \n");
+ ret = __convert_service_error_to_common_error(err);
+ goto DACI_FINISH;
+ }
+ }
+
+DACI_FINISH:
+
+ /* memory free */
+ if (item != 0)
+ contacts_svc_value_free(item);
+
+ if (iter != 0) {
+ contacts_svc_iter_remove(iter);
+ FW_LOGV("[da_contact_plugIn] contacts_svc_iter_remove !! \n");
+ }
+ if (folder_id_list != 0) {
+ /*
+ for (cnt = 0; cnt < folder_id_list_cnt; cnt++) {
+ if (folder_id_list[cnt] != NULL) {
+ FW_LOGV("folder_id_list[%d] : %s\n", cnt, folder_id_list[cnt]);
+ free(folder_id_list[cnt]);
+ FW_LOGV("[da_calendar_plugIn] folder id free !! \n");
+ }
+ }
+ */
+ free(folder_id_list);
+ FW_LOGV("[da_contact_plugIn] folder id list free !! \n");
+ }
+ if (folder_type_list != 0) {
+ free(folder_type_list);
+ FW_LOGV("[da_contact_plugIn] folder type list free !! \n");
+ }
+
+ FW_LOGV("[da_contact_plugIn] End in Contact\n");
+ return ret;
+}
+
+DACI_RETURN Get_Item(int account_id, char *folder_id, char *item_id, void **data)
+{
+ FW_LOGV("[da_contact_plugIn] Start in Contact\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+ CTSstruct *item = 0;
+
+ /* parameter check */
+ if (item_id == 0) {
+ FW_LOGV("[da_contact_plugIn] service id is null \n");
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ /* get item */
+ int contact_id = atoi(item_id);
+ FW_LOGV("[da_contact_plugIn] contact_id : %d\n", contact_id);
+ err = contacts_svc_get_contact(contact_id, &item);
+ if (err < CTS_SUCCESS) {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_get_contact() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ *data = 0;
+ } else {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_get_contact() Success!\n");
+ *data = (void *)item;
+ }
+
+ FW_LOGV("[da_contact_plugIn] End in Contact\n");
+ return ret;
+}
+
+DACI_RETURN Add_Folder(int account_id, char *folder_name, int folder_type, char **folder_id)
+{
+ FW_LOGV("[da_contact_plugIn] Start in Contact\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+ CTSvalue *folder = 0;
+
+ /* parameter check */
+ if (folder_name == 0) {
+ FW_LOGV("[da_contact_plugIn] service id is null \n");
+ *folder_id = 0;
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ /* new service struct */
+ folder = contacts_svc_value_new(CTS_VALUE_ADDRESSBOOK);
+
+ /* setting folder data */
+ contacts_svc_value_set_int(folder, CTS_ADDRESSBOOK_VAL_ACC_ID_INT, account_id);
+ /* change value in contacts service : CTS_ADDRESSBOOK_TYPE_NONE --> CTS_ADDRESSBOOK_TYPE_OTHER
+ *
+ contacts_svc_value_set_int(folder, CTS_ADDRESSBOOK_VAL_ACC_TYPE_INT, CTS_ADDRESSBOOK_TYPE_NONE);
+ */
+ contacts_svc_value_set_int(folder, CTS_ADDRESSBOOK_VAL_ACC_TYPE_INT, CTS_ADDRESSBOOK_TYPE_OTHER);
+ contacts_svc_value_set_int(folder, CTS_ADDRESSBOOK_VAL_MODE_INT, CTS_ADDRESSBOOK_MODE_NONE);
+ contacts_svc_value_set_str(folder, CTS_ADDRESSBOOK_VAL_NAME_STR, folder_name);
+
+ /* add folder */
+ err = contacts_svc_insert_addressbook(folder);
+ if (err < CTS_SUCCESS) {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_insert_addressbook() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ *folder_id = 0;
+ } else {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_insert_addressbook() Success!\n");
+ *folder_id = g_strdup_printf("%d", err);
+ isStorageChanged = 1;
+ }
+
+ /* memory free */
+ if (folder != 0)
+ contacts_svc_value_free(folder);
+
+ FW_LOGV("[da_contact_plugIn] End in Contact\n");
+ return ret;
+}
+
+DACI_RETURN Del_Folder(int account_id, char *folder_id)
+{
+ FW_LOGV("[da_contact_plugIn] Start in Contact\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+
+ /* parameter check */
+ if (folder_id == 0) {
+ FW_LOGV("[da_contact_plugIn] service id is null \n");
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ /* delete folder */
+ err = contacts_svc_delete_addressbook(atoi(folder_id));
+ if (err < CTS_SUCCESS) {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_delete_addressbook(%s) Fail!\n", folder_id);
+ ret = __convert_service_error_to_common_error(err);
+ } else {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_delete_addressbook(%s) Success!\n", folder_id);
+ isStorageChanged = 1;
+ }
+
+ FW_LOGV("[da_contact_plugIn] End in Contact\n");
+ return ret;
+}
+
+DACI_RETURN Get_Folder(int account_id, char *folder_id, char **out_folder_name, int *out_folder_type)
+{
+ FW_LOGV("[da_contact_plugIn] Start in Contact\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+ CTSvalue *folder = 0;
+
+ /* parameter check */
+ if (folder_id == 0) {
+ FW_LOGV("[da_contact_plugIn] service id is null \n");
+ *out_folder_name = 0;
+ *out_folder_type = -1;
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ /* get item */
+ int contact_folder_id = atoi(folder_id);
+ FW_LOGV("[da_contact_plugIn] contact_folder_id : %d\n", contact_folder_id);
+ err = contacts_svc_get_addressbook(contact_folder_id, &folder);
+ if (err < CTS_SUCCESS) {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_get_addressbook() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ *out_folder_name = 0;
+ *out_folder_type = -1;
+ } else {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_get_addressbook() Success!\n");
+ const char *folder_name = contacts_svc_value_get_str(folder, CTS_ADDRESSBOOK_VAL_NAME_STR);
+ FW_LOGV("out_folder_name : %s", folder_name);
+ *out_folder_name = strdup(folder_name);
+ *out_folder_type = DEFAULT_CONTACT_FOLDER;
+ }
+
+ /* memory free */
+ if (folder != 0)
+ contacts_svc_value_free(folder);
+
+ FW_LOGV("[da_contact_plugIn] End in Contact\n");
+ return ret;
+}
+
+DACI_RETURN Execute(int account_ID, const char *execute_key, void *execute_values, void **result)
+{
+ FW_LOGV("[da_contact_plugIn] Start in Contact\n");
+ FW_LOGV("[da_contact_plugIn] service is not supported execute. \n");
+ *result = 0;
+ FW_LOGV("[da_contact_plugIn] End in Contact\n");
+ return DACI_SUCCESS;
+}
+
+int Get_Used_Item_Count()
+{
+ FW_LOGV("[da_contact_plugIn] Start\n");
+
+ int ret = DACI_SUCCESS;
+ int used_cnt = contacts_svc_count(CTS_GET_ALL_CONTACT);
+ if (used_cnt < 0) {
+ FW_LOGV("[da_contact_plugIn] contact_svc_count() Fail\n");
+ ret = __convert_service_error_to_common_error(used_cnt);
+ } else {
+ FW_LOGV("[da_contact_plugIn] contact_svc_count() Success\n");
+ FW_LOGV("[da_contact_plugIn] used_count = %d\n", used_cnt);
+ ret = used_cnt;
+ }
+
+ FW_LOGV("[da_contact_plugIn] End in Contact\n");
+ return ret;
+}
+
+int Get_Used_Item_Count_For_Folder(int account_id, char *folder_id)
+{
+ FW_LOGV("[da_contact_plugIn] Start\n");
+
+ /* parameter check */
+ if (folder_id == 0) {
+ FW_LOGV("[da_contact_plugIn] service id is null \n");
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ int ret = DACI_SUCCESS;
+ int used_cnt = contacts_svc_count_with_int(CTS_GET_COUNT_CONTACTS_IN_ADDRESSBOOK, atoi(folder_id));
+ if (used_cnt < 0) {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_count_with_int(%s) Fail\n", folder_id);
+ ret = __convert_service_error_to_common_error(used_cnt);
+ } else {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_count_with_int(%s) Success\n", folder_id);
+ FW_LOGV("[da_contact_plugIn] used_count = %d\n", used_cnt);
+ ret = used_cnt;
+ }
+
+ FW_LOGV("[da_contact_plugIn] End in Contact\n");
+ return ret;
+}
+
+char **Get_Folder_ID_List(int account_id, int *folder_count, int **folder_type_list)
+{
+ char **folder_id_list = 0;
+ *folder_count = 0;
+ CTSiter *iter_addressbook = 0;
+ CTSvalue *addressbook = 0;
+
+ if (account_id == -1) {
+ folder_id_list = (char **)calloc(1, sizeof(char *));
+ *folder_type_list = (int *)calloc(1, sizeof(int));
+
+ folder_id_list[0] = "0";
+ *folder_count = 1;
+ (*folder_type_list)[0] = DEFAULT_CONTACT_FOLDER;
+
+ return folder_id_list;
+ }
+
+ folder_id_list = (char **)calloc(50, sizeof(char *));
+ *folder_type_list = (int *)calloc(50, sizeof(int));
+
+ int err = contacts_svc_get_list_with_int(CTS_LIST_ADDRESSBOOKS_OF_ACCOUNT_ID, account_id, &iter_addressbook);
+ err = contacts_svc_iter_next(iter_addressbook);
+ while (err == CTS_SUCCESS) {
+ addressbook = contacts_svc_iter_get_info(iter_addressbook);
+ if (addressbook != 0) {
+ int addressbook_id = 0;
+ addressbook_id = contacts_svc_value_get_int(addressbook, CTS_LIST_ADDRESSBOOK_ID_INT);
+ char *str_addressbook_id = g_strdup_printf("%d", addressbook_id);
+ FW_LOGV("[da_contact_plugIn] addressbook_id : %d\n", addressbook_id);
+
+ folder_id_list[*folder_count] = str_addressbook_id;
+ (*folder_type_list)[*folder_count] = DEFAULT_CONTACT_FOLDER;
+ *folder_count = *folder_count + 1;
+
+ if (addressbook != 0)
+ contacts_svc_value_free(addressbook);
+
+ err = contacts_svc_iter_next(iter_addressbook);
+ } else {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_iter_get_info() Fail!\n");
+ break;
+ }
+ }
+
+ /* memory free */
+ if (iter_addressbook != 0) {
+ contacts_svc_iter_remove(iter_addressbook);
+ FW_LOGV("[da_contact_plugIn] contacts_svc_iter_remove !! \n");
+ }
+
+ return folder_id_list;
+}
+
+int *Get_Account_ID_List(int *count)
+{
+ FW_LOGV("[da_contact_plugIn] start!!\n");
+
+ int error_code = account_connect();
+
+ Account_ID_t *account_info_list = (Account_ID_t *) calloc(1, sizeof(Account_ID_t));
+ account_info_list->account_id = -1;
+ account_info_list->next = 0;
+
+ account_foreach_account_from_db(__get_account_id, account_info_list);
+
+ *count = 0;
+ Account_ID_t *cursor_ptr = account_info_list;
+ while (cursor_ptr != 0) {
+ cursor_ptr = cursor_ptr->next;
+ (*count)++;
+ }
+
+ int *id_list = 0;
+ if ((*count) > 0) {
+ id_list = (int *)calloc(*count, sizeof(int));
+ cursor_ptr = account_info_list;
+ int i = 0;
+ while (cursor_ptr != 0) {
+ id_list[i] = cursor_ptr->account_id;
+ cursor_ptr = cursor_ptr->next;
+ i++;
+ }
+ }
+
+ free(account_info_list);
+
+ error_code = account_disconnect();
+
+ FW_LOGV("[da_calendar_plugIn] end!!\n");
+
+ return id_list;
+}
+
+Item_Node *Get_Changed_ITEM_For_Folder_Add(int account_id, const char *folder_id, int changepoint, int *changeCount)
+{
+ FW_LOGV("\n[da_contact_plugIn] account_id : %d\n", account_id);
+ FW_LOGV("[da_contact_plugIn] folder_id : %s\n", folder_id);
+ FW_LOGV("[da_contact_plugIn] changepoint : %d\n", changepoint);
+
+ Item_Node *root_ptr = 0;
+ Item_Node *cursor_ptr = 0;
+ int chagned_count = 0;
+
+ int contactVersion = changepoint;
+
+ int addressbook_id = atoi(folder_id);
+ CTSiter *iter = 0;
+ contacts_svc_get_updated_contacts(addressbook_id, contactVersion, &iter);
+
+ int contact_ret = contacts_svc_iter_next(iter);
+ while (CTS_SUCCESS == contact_ret) {
+ CTSvalue *row_info = 0;
+
+ if ((row_info = contacts_svc_iter_get_info(iter)) == CTS_SUCCESS) {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_iter_get_info() failed.\n");
+ } else {
+ int type = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_TYPE_INT);
+
+ switch (type) {
+ case CTS_OPERATION_INSERTED:
+ {
+ int contact_id = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_ID_INT);
+ char *contact_id_str = (char *)calloc(5, sizeof(char));
+ sprintf(contact_id_str, "%d", contact_id);
+
+ FW_LOGV("[da_contact_plugIn] CTS_OPERATION_INSERTED : [%s]\n", contact_id_str);
+
+ if (root_ptr == 0) {
+ root_ptr = (Item_Node *) calloc(1, sizeof(Item_Node));
+ root_ptr->item_id = contact_id_str;
+ root_ptr->next = 0;
+ cursor_ptr = root_ptr;
+ } else {
+ cursor_ptr->next = (Item_Node *) calloc(1, sizeof(Item_Node));
+ cursor_ptr->next->item_id = contact_id_str;
+ cursor_ptr->next->next = 0;
+ cursor_ptr = cursor_ptr->next;
+ }
+
+ chagned_count++;
+ }
+ break;
+ default:
+/* FW_LOGV("[da_contact_plugIn] Another Contact Change Noti");*/
+ break;
+ }
+ }
+
+ contacts_svc_value_free(row_info); /* next changing */
+ row_info = 0;
+ contact_ret = contacts_svc_iter_next(iter);
+ }
+
+ /* memory free */
+ if (iter != 0) {
+ contacts_svc_iter_remove(iter);
+ iter = 0;
+ FW_LOGV("[da_contact_plugIn] contacts_svc_iter_remove !! \n");
+ }
+ *changeCount = chagned_count;
+ return root_ptr;
+}
+
+Item_Node *Get_Changed_ITEM_For_Folder_Del(int account_id, const char *folder_id, int changepoint, int *changeCount)
+{
+ FW_LOGV("\n[da_contact_plugIn] account_id : %d\n", account_id);
+ FW_LOGV("[da_contact_plugIn] folder_id : %s\n", folder_id);
+ FW_LOGV("[da_contact_plugIn] changepoint : %d\n", changepoint);
+
+ Item_Node *root_ptr = 0;
+ Item_Node *cursor_ptr = 0;
+ int chagned_count = 0;
+
+ int contactVersion = changepoint;
+
+ int addressbook_id = atoi(folder_id);
+ CTSiter *iter = 0;
+ contacts_svc_get_updated_contacts(addressbook_id, contactVersion, &iter);
+
+ int contact_ret = contacts_svc_iter_next(iter);
+ while (CTS_SUCCESS == contact_ret) {
+ CTSvalue *row_info = 0;
+
+ if ((row_info = contacts_svc_iter_get_info(iter)) == CTS_SUCCESS) {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_iter_get_info() failed.\n");
+ } else {
+ int type = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_TYPE_INT);
+
+ switch (type) {
+ case CTS_OPERATION_DELETED:
+ {
+ int contact_id = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_ID_INT);
+ char *contact_id_str = (char *)calloc(5, sizeof(char));
+ sprintf(contact_id_str, "%d", contact_id);
+ FW_LOGV("[da_contact_plugIn] CTS_OPERATION_DELETED : [%s]\n", contact_id_str);
+
+ if (root_ptr == 0) {
+ root_ptr = (Item_Node *) calloc(1, sizeof(Item_Node));
+ root_ptr->item_id = contact_id_str;
+ root_ptr->next = 0;
+ cursor_ptr = root_ptr;
+ } else {
+ cursor_ptr->next = (Item_Node *) calloc(1, sizeof(Item_Node));
+ cursor_ptr->next->item_id = contact_id_str;
+ cursor_ptr->next->next = 0;
+ cursor_ptr = cursor_ptr->next;
+ }
+
+ chagned_count++;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ contacts_svc_value_free(row_info); /* next changing */
+ row_info = 0;
+ contact_ret = contacts_svc_iter_next(iter);
+ }
+
+ /* memory free */
+ if (iter != 0) {
+ contacts_svc_iter_remove(iter);
+ iter = 0;
+ FW_LOGV("[da_contact_plugIn] contacts_svc_iter_remove !! \n");
+ }
+
+ *changeCount = chagned_count;
+ return root_ptr;
+}
+
+Item_Node *Get_Changed_ITEM_For_Folder_Update(int account_id, const char *folder_id, int changepoint, int *changeCount)
+{
+ FW_LOGV("\n[da_contact_plugIn] account_id : %d\n", account_id);
+ FW_LOGV("[da_contact_plugIn] folder_id : %s\n", folder_id);
+ FW_LOGV("[da_contact_plugIn] changepoint : %d\n", changepoint);
+
+ Item_Node *root_ptr = 0;
+ Item_Node *cursor_ptr = 0;
+ int chagned_count = 0;
+
+ int contactVersion = changepoint;
+
+ int addressbook_id = atoi(folder_id);
+ CTSiter *iter = 0;
+ contacts_svc_get_updated_contacts(addressbook_id, contactVersion, &iter);
+
+ int contact_ret = contacts_svc_iter_next(iter);
+ while (CTS_SUCCESS == contact_ret) {
+ CTSvalue *row_info = 0;
+
+ if ((row_info = contacts_svc_iter_get_info(iter)) == CTS_SUCCESS) {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_iter_get_info() failed.\n");
+ } else {
+ int type = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_TYPE_INT);
+
+ switch (type) {
+ case CTS_OPERATION_UPDATED:
+ {
+ int contact_id = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_ID_INT);
+ char *contact_id_str = (char *)calloc(5, sizeof(char));
+ sprintf(contact_id_str, "%d", contact_id);
+ FW_LOGV("[da_contact_plugIn] CTS_OPERATION_UPDATED : [%s]\n", contact_id_str);
+
+ if (root_ptr == 0) {
+ root_ptr = (Item_Node *) calloc(1, sizeof(Item_Node));
+ root_ptr->item_id = contact_id_str;
+ root_ptr->next = 0;
+ cursor_ptr = root_ptr;
+ } else {
+ cursor_ptr->next = (Item_Node *) calloc(1, sizeof(Item_Node));
+ cursor_ptr->next->item_id = contact_id_str;
+ cursor_ptr->next->next = 0;
+ cursor_ptr = cursor_ptr->next;
+ }
+
+ chagned_count++;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ contacts_svc_value_free(row_info); /* next changing */
+ row_info = 0;
+ contact_ret = contacts_svc_iter_next(iter);
+ }
+
+ /* memory free */
+ if (iter != 0) {
+ contacts_svc_iter_remove(iter);
+ iter = 0;
+ FW_LOGV("[da_contact_plugIn] contacts_svc_iter_remove !! \n");
+ }
+
+ *changeCount = chagned_count;
+ return root_ptr;
+}
+
+int Get_Last_ChangePoint()
+{
+ contacts_svc_begin_trans();
+ int contactVersion = contacts_svc_end_trans(1);
+
+ return contactVersion;
+}
+
+void StartListening_ChangeNoti(void *data)
+{
+ contacts_svc_subscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE, __process_Contact_Change, 0);
+
+ latest_contact_version = getContactVersion(1);
+ FW_LOGV("Current Latest Contact Version : %d", latest_contact_version);
+
+ pthread_t thread_process_change_id;
+ if (pthread_create(&thread_process_change_id, 0, __rutine_Contact_Change, 0) < 0) {
+ FW_LOGE("Contact Change Noti Handling Thread Create Error");
+ }
+}
+
+void SetCallBack_AddItem(CALLBACK_ADD_ITEM callback)
+{
+ callback_add_item = callback;
+}
+
+void SetCallBack_DeleteItem(CALLBACK_DEL_ITEM callback)
+{
+ callback_del_item = callback;
+}
+
+void SetCallBack_UpdateItem(CALLBACK_UPDATE_ITEM callback)
+{
+ callback_update_item = callback;
+}
+
+void SetCallBack_GetAccountIDList(GET_ACCOUNTIDLIST callback)
+{
+ callback_get_accountidlist = callback;
+}
+
+int Get_MAX_Item_Count(int folder_type)
+{
+ return MAX_ITEM_COUNT_CONTACT;
+}
+
+int Get_MAX_Field_Length(int field_name, int child_field_name)
+{
+ switch (field_name) {
+ case CONTACT_FIELD_NAME:
+ switch (child_field_name) {
+ case CONTACT_CHILD_FIELD_FAMILY:
+ return MAX_LEN_FAMILY;
+ case CONTACT_CHILD_FIELD_GIVEN:
+ return MAX_LEN_GIVEN;
+ case CONTACT_CHILD_FIELD_MIDDLE:
+ return MAX_LEN_MIDDLE;
+ case CONTACT_CHILD_FIELD_PREFIX:
+ return MAX_LEN_PREFIX;
+ case CONTACT_CHILD_FIELD_SUFFIX:
+ return MAX_LEN_SUFFIX;
+ case CONTACT_CHILD_FIELD_FORMATTED:
+ return MAX_LEN_FORMATTED;
+ case CONTACT_CHILD_FIELD_NICKNAME:
+ return MAX_LEN_NICKNAME;
+ case CONTACT_CHILD_FIELD_READING_NAME:
+ return MAX_LEN_READING_NAME;
+ case CONTACT_CHILD_FIELD_READING_LAST_NAME:
+ return MAX_LEN_READING_LAST_NAME;
+ default:
+ return -1;
+ }
+ case CONTACT_FIELD_TEL:
+ switch (child_field_name) {
+ case CONTACT_CHILD_FIELD_TEL:
+ return MAX_LEN_TEL;
+ default:
+ return -1;
+ }
+ case CONTACT_FIELD_EMAIL:
+ switch (child_field_name) {
+ case CONTACT_CHILD_FIELD_EMAIL:
+ return MAX_LEN_EMAIL;
+ default:
+ return -1;
+ }
+ case CONTACT_FIELD_URL:
+ switch (child_field_name) {
+ case CONTACT_CHILD_FIELD_URL:
+ return MAX_LEN_URL;
+ default:
+ return -1;
+ }
+ case CONTACT_FIELD_ADDR:
+ switch (child_field_name) {
+ case CONTACT_CHILD_FIELD_POBOX:
+ return MAX_LEN_POBOX;
+ case CONTACT_CHILD_FIELD_EXT_ADDR:
+ return MAX_LEN_EXT_ADDR;
+ case CONTACT_CHILD_FIELD_STREET:
+ return MAX_LEN_STREET;
+ case CONTACT_CHILD_FIELD_LOCALITY:
+ return MAX_LEN_LOCALITY;
+ case CONTACT_CHILD_FIELD_REGION:
+ return MAX_LEN_REGION;
+ case CONTACT_CHILD_FIELD_POSTAL_CODE:
+ return MAX_LEN_POSTAL_CODE;
+ case CONTACT_CHILD_FIELD_COUNTRY:
+ return MAX_LEN_COUNTRY;
+ default:
+ return -1;
+ }
+ case CONTACT_FIELD_NOTE:
+ return MAX_LEN_NOTE;
+ case CONTACT_FIELD_COMPANY:
+ return MAX_LEN_COMPANY;
+ case CONTACT_FIELD_DEPARTMENT:
+ return MAX_LEN_DEPARTMENT;
+ case CONTACT_FIELD_TITLE:
+ return MAX_LEN_TITLE;
+ case CONTACT_FIELD_HOBBY:
+ return MAX_LEN_HOBBY;
+ case CONTACT_FIELD_PHOTO:
+ return MAX_LEN_PHOTO;
+ default:
+ return -1;
+ }
+}
+
+int Get_MAX_Field_Count(int field_name, int child_field_name)
+{
+ switch (field_name) {
+ case CONTACT_FIELD_TEL:
+ return MAX_FIELD_COUNT_TEL;
+ case CONTACT_FIELD_EMAIL:
+ return MAX_FIELD_COUNT_EMAIL;
+ case CONTACT_FIELD_URL:
+ return MAX_FIELD_COUNT_URL;
+ case CONTACT_FIELD_ADDR:
+ return MAX_FIELD_COUNT_ADDR;
+ default:
+ return -1;
+ }
+}
+
+int Get_Field_Value(int field_name, int child_field_name, char **str_val, int *num_val1, int *num_val2)
+{
+ switch (field_name) {
+ case CONTACT_FIELD_YEAR:
+ *num_val1 = MIN_PERIOD_YEAR;
+ *num_val2 = MAX_PERIOD_YEAR;
+ return 1;
+ default:
+ return -1;
+ }
+}
+
+int Get_Is_Support_Feature(int feature)
+{
+ switch (feature) {
+ case CONTACT_FEATURE_GENDER:
+ return IF_SUPPORT_GENDER;
+ default:
+ return -1;
+ }
+}
+
+/********************************** static function *******************************************/
+
+static void __set_IsNotiFromMe(int set_flag)
+{
+ if (pthread_mutex_lock(&lockx)) {
+ FW_LOGV("[da_contact_plugIn] pthread_mutex_lock error\n");
+ }
+
+ isNotiFromMe = set_flag;
+
+ if (pthread_mutex_unlock(&lockx)) {
+ FW_LOGV("[da_contact_plugIn] pthread_mutex_unlock error\n");
+ }
+}
+
+static int __get_IsNotiFromMe()
+{
+ return isNotiFromMe;
+}
+
+static void __process_Contact_Change(void *data)
+{
+ FW_LOGV("[da_contact_plugIn] detected contact storage changed!!\n");
+
+ int from_Me = __get_IsNotiFromMe();
+
+ if (from_Me == 1) {
+ FW_LOGV("[da_contact_plugIn] This noti has been sended from Me!! so will be ignored!!\n");
+ __set_IsNotiFromMe(0);
+ return;
+ }
+
+ int *contactVersion = (int *)calloc(1, sizeof(int));
+ *contactVersion = latest_contact_version;
+ latest_contact_version++;
+
+ fw_async_queue_send_msg(pQueue, (void *)contactVersion);
+}
+
+static void *__rutine_Contact_Change(void *data)
+{
+ FW_LOGV("[da_contact_plugIn] Start __rutine_Contact_Change (create thread)\n");
+
+ /*
+ * Create Queue
+ */
+ pQueue = fw_async_queue_alloc();
+ if (pQueue == 0) {
+ FW_LOGE("Failed to call fw_async_quecontacts_svc_get_updated_contactsue_alloc()");
+ return 0;
+ }
+
+ while (1) {
+ int *contact_version = fw_async_queue_receive_msg(pQueue);
+ int contactVersion = *contact_version;
+ free(contact_version);
+
+ FW_LOGV("Detected Change ContactVersion : %d", contactVersion);
+
+ int count;
+ int *accountList = callback_get_accountidlist(FW_CONTACT, &count);
+ if (accountList == 0)
+ continue;
+
+ int i = 0;
+ for (; i < count; i++) {
+ int contact_account_id = accountList[i];
+
+ FW_LOGV("[da_contact_plugIn] contact_account_id : %d, count : %d\n", contact_account_id, count);
+ FW_LOGV("[da_contact_plugIn] Before contacts_svc_get_updated_contacts : %d\n", contactVersion);
+
+ CTSiter *iter_addressbook = 0;
+ CTSvalue *addressbook = 0;
+
+ int err = contacts_svc_get_list_with_int(CTS_LIST_ADDRESSBOOKS_OF_ACCOUNT_ID, contact_account_id, &iter_addressbook);
+ err = contacts_svc_iter_next(iter_addressbook);
+ FW_LOGV("[da_contact_plugIn] err : %d\n", err);
+
+ if (err != CTS_SUCCESS && contact_account_id == -1) {
+ err = CTS_SUCCESS;
+ }
+
+ while (err == CTS_SUCCESS) {
+ if (contact_account_id != -1)
+ addressbook = contacts_svc_iter_get_info(iter_addressbook);
+
+ if (addressbook != 0 || contact_account_id == -1) {
+ int addressbook_id = 0;
+ if (contact_account_id != -1)
+ addressbook_id = contacts_svc_value_get_int(addressbook, CTS_LIST_ADDRESSBOOK_ID_INT);
+
+ char *str_addressbook_id = g_strdup_printf("%d", addressbook_id);
+ FW_LOGV("[da_contact_plugIn] addressbook_id : %d\n", addressbook_id);
+
+ CTSiter *iter = 0;
+ contacts_svc_get_updated_contacts(addressbook_id, contactVersion, &iter);
+
+ int contact_ret = contacts_svc_iter_next(iter);
+ while (CTS_SUCCESS == contact_ret) {
+ CTSvalue *row_info = 0;
+
+ if ((row_info = contacts_svc_iter_get_info(iter)) == CTS_SUCCESS) {
+ FW_LOGV("[da_contact_plugIn] contacts_svc_iter_get_info() failed.\n");
+ } else {
+ int contact_id = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_ID_INT);
+ char contact_id_str[12];
+ sprintf(contact_id_str, "%d", contact_id);
+ int type = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_TYPE_INT);
+ FW_LOGV("[da_contact_plugIn] $$$$$$$ contact_id :%d\n", contact_id);
+
+ switch (type) {
+ case CTS_OPERATION_INSERTED:
+ {
+ FW_LOGV("[da_contact_plugIn] CTS_OPERATION_INSERTED\n");
+
+ int result = callback_add_item(accountList[i], i, contact_id_str, FW_CONTACT, str_addressbook_id, 0);
+ FW_LOGV("[da_contact_plugIn] ===1\n");
+ if (!result)
+ FW_LOGV("[da_contact_plugIn] Failed to call callback_add_item() \n");
+ }
+ break;
+ case CTS_OPERATION_UPDATED:
+ {
+ FW_LOGV("[da_contact_plugIn] CTS_OPERATION_UPDATED\n");
+ FW_LOGV("[da_contact_plugIn] contact_id : %s\n", contact_id_str);
+
+ int result = callback_update_item(accountList[i], i, contact_id_str, FW_CONTACT);
+ if (!result)
+ FW_LOGV("[da_contact_plugIn] Failed to call callback_update_item() \n");
+ }
+ break;
+ case CTS_OPERATION_DELETED:
+ {
+ FW_LOGV("[da_contact_plugIn] CTS_OPERATION_DELETED\n");
+ int result = callback_del_item(accountList[i], i, contact_id_str, FW_CONTACT);
+ if (!result)
+ FW_LOGV("[da_contact_plugIn] Failed to call callback_del_item() \n");
+ }
+ break;
+ default:
+ FW_LOGV("[da_contact_plugIn] Another Contact Change Noti\n");
+ break;
+ }
+ }
+
+ contacts_svc_value_free(row_info); /* next changing */
+ row_info = NULL;
+ contact_ret = contacts_svc_iter_next(iter);
+ }
+
+ if (contact_account_id == -1)
+ err = CTS_ERR_FINISH_ITER;
+ else
+ err = contacts_svc_iter_next(iter_addressbook);
+
+ if (addressbook != 0)
+ contacts_svc_value_free(addressbook);
+
+ if (iter != 0)
+ contacts_svc_iter_remove(iter);
+
+ if (str_addressbook_id != 0) {
+ free(str_addressbook_id);
+ }
+
+ } else {
+ FW_LOGV("[da_contact_plugIn] account : %d, contact folder does not exist \n", contact_account_id);
+ break;
+ }
+ }
+
+ if (contact_account_id != -1) {
+ contacts_svc_iter_remove(iter_addressbook);
+ }
+ }
+
+ /* memory free */
+ if (accountList != 0)
+ free(accountList);
+ }
+
+ FW_LOGV("[da_contact_plugIn] End __rutine_Contact_Change (create thread)\n");
+
+ return 0;
+}
+
+static DACI_RETURN __convert_service_error_to_common_error(cts_error err)
+{
+ DACI_RETURN ret = DACI_SUCCESS;
+ FW_LOGV("[da_contact_plugIn] Error Code : %d\n", err);
+
+ switch (err) {
+ case CTS_ERR_DB_LOCK: /* -204 */
+ ret = DACI_ERR_LOCKED;
+ break;
+ case CTS_ERR_DB_RECORD_NOT_FOUND: /* -203 */
+ case CTS_ERR_NO_DATA: /* -3 */
+ ret = DACI_ERR_NO_DATA;
+ break;
+ case CTS_ERR_DB_NOT_OPENED: /* -201 */
+ ret = DACI_ERR_OPEN_FAILED;
+ break;
+ case CTS_ERR_NO_SPACE: /* -13 */
+ case CTS_ERR_OUT_OF_MEMORY: /* -8 */
+ ret = DACI_ERR_MEMORY_FULL;
+ break;
+ case CTS_ERR_ALREADY_EXIST: /* -7 */
+ ret = DACI_ERR_ALREADY_EXIST;
+ break;
+ case CTS_ERR_ARG_NULL: /* -5 */
+ case CTS_ERR_ARG_INVALID: /* -4 */
+ ret = DACI_ERR_INVALID_CONTENT;
+ break;
+ case CTS_ERR_FINISH_ITER: /* -2 */
+ case CTS_SUCCESS: /* 0 */
+ case CTS_TRUE: /* 1 */
+ ret = DACI_SUCCESS;
+ break;
+ /*
+ * CTS_ERR_DB_FAILED: -202, CTS_ERR_VCONF_FAILED: -102,
+ * CTS_ERR_VOBJECT_FAILED: -101, CTS_ERR_IO_ERR: -12,
+ * CTS_ERR_ALREADY_RUNNING: -10, CTS_ERR_EXCEEDED_LIMIT: -9,
+ * CTS_ERR_ENV_INVALID: -6, CTS_ERR_FAIL: -1,
+ */
+ default:
+ ret = DACI_ERRORS;
+ break;
+ }
+
+ return ret;
+}
+
+static bool __get_account_id(account_h account, void *user_data)
+{
+ Account_ID_t *account_info_list = user_data;
+
+ bool has_contact = FALSE;
+
+ account_get_capability(account, __is_Contact_ID, &has_contact);
+
+ if (has_contact == FALSE) {
+ /* DO Nothing */
+ } else {
+ Account_ID_t *account_info = (Account_ID_t *) calloc(1, sizeof(Account_ID_t));
+ account_get_account_id(account, &(account_info->account_id));
+ FW_LOGV("Getted accont id : %d", account_info->account_id);
+ account_info->next = 0;
+
+ Account_ID_t *cursor_ptr = account_info_list;
+ while (cursor_ptr->next != 0) {
+ cursor_ptr = cursor_ptr->next;
+ }
+
+ cursor_ptr->next = account_info;
+ }
+
+ return has_contact;
+}
+
+static bool __is_Contact_ID(account_capability_type_e capability_type, account_capability_state_e capability_value, void *user_data)
+{
+ bool *has_contact = user_data;
+ if (capability_type == ACCOUNT_CAPABILITY_CONTACT) {
+ *has_contact = TRUE;
+ return FALSE;
+ }
+ return TRUE;
+}
diff --git a/fw-plugin/http-plugIn/.cproject b/fw-plugin/http-plugIn/.cproject
new file mode 100755
index 0000000..416c6e2
--- /dev/null
+++ b/fw-plugin/http-plugIn/.cproject
@@ -0,0 +1,293 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?>
+
+<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="0.2065504086">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.2065504086" moduleId="org.eclipse.cdt.core.settings" name="Default">
+ <externalSettings/>
+ <extensions>
+ <extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration buildProperties="" description="" id="0.2065504086" name="Default" parent="org.eclipse.cdt.build.core.prefbase.cfg">
+ <folderInfo id="0.2065504086." name="/" resourcePath="">
+ <toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.238681826" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
+ <targetPlatform id="org.eclipse.cdt.build.core.prefbase.toolchain.238681826.106902732" name=""/>
+ <builder id="org.eclipse.cdt.build.core.settings.default.builder.127171291" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
+ <tool id="org.eclipse.cdt.build.core.settings.holder.libs.569075878" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
+ <tool id="org.eclipse.cdt.build.core.settings.holder.748471845" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
+ <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.2861205" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
+ </tool>
+ <tool id="org.eclipse.cdt.build.core.settings.holder.1395063964" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
+ <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1609509888" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
+ </tool>
+ <tool id="org.eclipse.cdt.build.core.settings.holder.163556033" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
+ <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1632894964" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
+ </tool>
+ </toolChain>
+ </folderInfo>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <scannerConfigBuildInfo instanceId="0.2065504086">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ <scannerConfigBuildInfo instanceId="0.297934327">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ </cconfiguration>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <project id="http-plugIn.null.854469853" name="http-plugIn"/>
+ </storageModule>
+</cproject>
diff --git a/fw-plugin/http-plugIn/.project b/fw-plugin/http-plugIn/.project
new file mode 100755
index 0000000..dd521ff
--- /dev/null
+++ b/fw-plugin/http-plugIn/.project
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>http-plugIn</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+ <triggers>clean,full,incremental,</triggers>
+ <arguments>
+ <dictionary>
+ <key>?name?</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.append_environment</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildArguments</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.contents</key>
+ <value>org.eclipse.cdt.make.core.activeConfigSettings</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.samsung.slp2.SboxBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>com.samsung.slp2.SboxBuilder.needConfigure</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;com.samsung.limo.SboxGCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.append_environment</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.arguments</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.command</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.auto</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.clean</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.inc</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.environment</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>com.samsung.slp2.cnature</nature>
+ <nature>org.eclipse.cdt.core.ccnature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/fw-plugin/http-plugIn/CMakeLists.src b/fw-plugin/http-plugIn/CMakeLists.src
new file mode 100755
index 0000000..04ce4aa
--- /dev/null
+++ b/fw-plugin/http-plugIn/CMakeLists.src
@@ -0,0 +1 @@
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRCS)
diff --git a/fw-plugin/http-plugIn/CMakeLists.sub b/fw-plugin/http-plugIn/CMakeLists.sub
new file mode 100755
index 0000000..a1c395c
--- /dev/null
+++ b/fw-plugin/http-plugIn/CMakeLists.sub
@@ -0,0 +1,37 @@
+#################################################################################
+# THIS FILE IS CREATED AUTOMATICALLY. DO NOT DELETE OR MODIFY THIS FILE.
+#################################################################################
+
+INCLUDE(CMakeLists.src)
+
+## PROJECT NAME
+PROJECT(plugin-na-http C)
+
+## PACKAGE CONFIG
+SET(SLP_PKGCONFIG_LIST "libsoup-2.4 dlog")
+
+## INCLUDES
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../framework/include)
+
+## DEFINITIONS
+ADD_DEFINITIONS("-DAPP_DIR=\"${CMAKE_INSTALL_PREFIX}\"")
+
+## LIBRARY PATH
+SET(SLP_LD_PATH_FLAGS "")
+
+## LIBRARY
+SET(SLP_LD_FLAGS "")
+
+## DEBUG
+SET(SLP_DEBUG_FLAGS "-g")
+
+## OPTIMIZATION
+SET(SLP_OPT_FLAGS "-O0")
+
+## COMPILER FLAGS
+SET(SLP_COMPILER_FLAGS "-lpthread")
+
+## LINKER FLAGS
+SET(SLP_LINKER_FLAGS "-lpthread")
+
diff --git a/fw-plugin/http-plugIn/CMakeLists.txt b/fw-plugin/http-plugIn/CMakeLists.txt
new file mode 100755
index 0000000..811d8f0
--- /dev/null
+++ b/fw-plugin/http-plugIn/CMakeLists.txt
@@ -0,0 +1,33 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+
+# INCLUDE SUB CMAKELIST FILE
+INCLUDE(CMakeLists.sub)
+
+SET(RESOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/res")
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs_plugin_http REQUIRED ${SLP_PKGCONFIG_LIST})
+
+FOREACH(flag ${pkgs_plugin_http_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+SET(CMAKE_CXX_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+
+ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS})
+
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_plugin_http_LDFLAGS} ${SLP_LD_PATH_FLAGS} ${SLP_LD_FLAGS} ${SLP_LINKER_FLAGS} sync-agent-framework)
+
+# INSTALL
+INSTALL(TARGETS ${PROJECT_NAME} DESTINATION lib)
+#INSTALL(DIRECTORY ${RESOURCE_DIR}/data DESTINATION share)
+
+#added by KTS for install to the system
+#CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY)
+#INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig)
+
+
+# INCLUDE LAYOUT DIRECTORY
+# ADD_SUBDIRECTORY(layout)
+#ADD_SUBDIRECTORY(res/locale)
diff --git a/fw-plugin/http-plugIn/include/NA_External.h b/fw-plugin/http-plugIn/include/NA_External.h
new file mode 100755
index 0000000..820a047
--- /dev/null
+++ b/fw-plugin/http-plugIn/include/NA_External.h
@@ -0,0 +1,44 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef NA_EXTERNALL_H_
+#define NA_EXTERNAL_H_
+
+typedef struct {
+ char *key;
+ char *value;
+} common_header_info;
+
+#endif /* NA_EXTERNAL_H_ */
diff --git a/fw-plugin/http-plugIn/include/http_status.h b/fw-plugin/http-plugIn/include/http_status.h
new file mode 100755
index 0000000..a4902cb
--- /dev/null
+++ b/fw-plugin/http-plugIn/include/http_status.h
@@ -0,0 +1,135 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef HTTP_STATUS_H_
+#define HTTP_STATUS_H_
+
+typedef enum {
+ /*
+ * Transport Error
+ */
+ SOUP_CANCELED = 1,
+ SOUP_CANT_RESOLVE,
+ SOUP_CANT_RESOLVE_PROXY,
+ SOUP_CANT_CONNECT,
+ SOUP_CANT_CONNECT_PROXY,
+ SOUP_SSL_FAILED,
+ SOUP_MALFORMED,
+ SOUP_TRY_AGAIN,
+ SOUP_TOO_MANY_REDIRECTS,
+
+ /*
+ * Informational
+ */
+ CONTINUE = 100,
+ SWITCHING_PROTOCOLS = 101,
+ PROCESSING = 102, /* WebDAV */
+ CHECKPOINT = 103,
+
+ /*
+ * Successful
+ */
+ OK = 200,
+ CREATED = 201,
+ ACCEPTED = 202,
+ NON_AUTHORITATIVE_INFORMATION = 203,
+ NO_CONTENT = 204,
+ RESET_CONTENT = 205,
+ PARTIAL_CONTENT = 206,
+ MULTI_STATUS = 207, /* WebDAV */
+ IM_USED = 208,
+
+ /*
+ * Redirection
+ */
+ MULTIPLE_CHOICES = 300,
+ MOVED_PERMANENTLY = 301,
+ FOUND = 302,
+ SEE_OTHER = 303,
+ NOT_MODIFIED = 304,
+ USE_PROXY = 305,
+ /* SWITCH_PROXY = 306, *//* Unused */
+ TEMPORARY_REDIRECT = 307,
+ RESUME_INCOMPLETE = 308,
+
+ /*
+ * Client Error
+ */
+ BAD_REQUEST = 400,
+ UNAUTHORIZED = 401,
+ PAYMENT_REQUIRED = 402,
+ FORBIDDEN = 403,
+ NOT_FOUND = 404,
+ METHOD_NOT_ALLOWED = 405,
+ NOT_ACCEPTABLE = 406,
+ PROXY_AUTHENTICATION_REQUIRED = 407,
+ REQUEST_TIMEOUT = 408,
+ CONFLICT = 409,
+ GONE = 410,
+ LENGTH_REQUIRED = 411,
+ PRECONDITION_FAILED = 412,
+ REQUEST_ENTITY_TOO_LARGE = 413,
+ REQUEST_URI_TOO_LONG = 414,
+ UNSUPPORTED_MEDIA_TYPE = 415,
+ REQUESTED_RANGE_NOT_SATISFIABLE = 416,
+ EXPECTATION_FAILED = 417,
+ IM_A_TEAPOT = 418,
+ UNPROCESSABLE_ENTITY = 422, /* WebDAV */
+ LOCKED = 423, /* WebDAV */
+ FAILED_DEPENDENCY = 424, /* WebDAV */
+ UNORDERED_COLLECTION = 425,
+ UPGRADE_REQUIRED = 426,
+ NO_RESPONSE = 444,
+ RETRY_WITH = 449,
+ BLOCKED_BY_WINDOWS_PARENTAL_CONTROLS = 450,
+ CLIENT_CLOSED_REQUEST = 499,
+
+ /*
+ * Server Error
+ */
+ INTERNAL_SERVER_ERROR = 500,
+ NOT_IMPLEMENTED = 501,
+ BAD_GATEWAY = 502,
+ SERVICE_UNAVAILABLE = 503,
+ GATEWAY_TIMEOUT = 504,
+ HTTP_VERSION_NOT_SUPPORTED = 505,
+ VARIANT_ALSO_NEGOTIATES = 506,
+ INSUFFICIENT_STORAGE = 507, /* WebDAV */
+ BANDWIDTH_LIMIT_EXCEEDED = 509, /* Apache bw / timited extension */
+ NOT_EXTENDED = 510,
+
+} HTTP_STATUS;
+
+#endif /* HTTP_STATUS_H_ */
diff --git a/fw-plugin/http-plugIn/src/PlugIn_Interface.c b/fw-plugin/http-plugIn/src/PlugIn_Interface.c
new file mode 100755
index 0000000..a7d83ec
--- /dev/null
+++ b/fw-plugin/http-plugIn/src/PlugIn_Interface.c
@@ -0,0 +1,859 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <libsoup/soup-uri.h>
+#include <libsoup/soup.h>
+
+#include <time.h>
+
+#include <dlog.h>
+
+#include "NA_External.h"
+#include "http_status.h"
+
+/* for log */
+#include "agent-framework/Utility/fw_log.h"
+
+#include "agent-framework/PlugIn/NetworkAccess_Interface.h"
+
+#define SEMI_COLON_LEN 1
+#define NULL_LEN 1
+
+
+#if !defined(LOG_TAG)
+#define LOG_TAG "PLUGIN_NA_HTTP"
+#else
+#undef LOG_TAG
+#define LOG_TAG "PLUGIN_NA_HTTP"
+#endif
+
+
+typedef struct {
+ SoupSession *session;
+ char *id;
+ char *password;
+} Auth_Info;
+
+static int add_auth_info(SoupSession *session, char *user_id, char *user_pw);
+/*static int remove_auth_info(SoupSession *session);*/ /* not used */
+static int find_auth_info(SoupSession *session, Auth_Info **auth_info);
+static void authenticate_cb(SoupSession *session, SoupMessage *msg, SoupAuth *auth, gboolean retrying, gpointer user_data);
+
+static GList *auth_info_list = NULL;
+
+int Open_Connection(void **session, char *proxy, int timeout)
+{
+ FW_LOGV("[na_http_plugIn] Start !! \n");
+
+#ifdef time_check
+ /* function Start Time */
+ clock_t start_t, end_t;
+ double proc_t = 0.0;
+ start_t = clock();
+#endif
+
+ int res = 1;
+
+ /*
+ * create session
+ */
+ SoupSession *ss = (SoupSession *)(*session);
+ SoupURI *proxy_uri = NULL;
+
+ FW_LOGV("proxy : %s", proxy);
+
+ /*
+ * proxy setting
+ */
+ if (proxy != NULL) {
+ proxy_uri = soup_uri_new(proxy);
+ ss = soup_session_sync_new_with_options(SOUP_SESSION_PROXY_URI, proxy_uri, NULL);
+ } else {
+ ss = soup_session_sync_new();
+ }
+
+ g_object_set(ss, SOUP_SESSION_TIMEOUT, timeout, NULL);
+ FW_LOGV("[na_http_plugIn] set timeout : %d", timeout);
+
+ FW_LOGV("[na_http_plugIn] session : %d\n", ss);
+
+ if (ss != NULL) {
+ FW_LOGV("[na_http_plugIn] success !! \n");
+ } else {
+ FW_LOGE("[na_http_plugIn] fail !! \n");
+ res = 0;
+ }
+
+ *session = ss;
+
+#ifdef time_check
+ /* function End Time */
+ end_t = clock();
+ proc_t = ((double)(end_t - start_t)) / CLOCKS_PER_SEC;
+ FW_LOGV("[na_http_plugIn] execute time : %0.2f\n", proc_t);
+#endif
+
+ FW_LOGV("[na_http_plugIn] End !! \n");
+
+ return res;
+}
+
+int Header_Binding(GList *header_info, void **header_binding)
+{
+ FW_LOGV("[na_http_plugIn] Start !! \n");
+
+#ifdef time_check
+ /* function Start Time */
+ clock_t start_t, end_t;
+ double proc_t = 0.0;
+ start_t = clock();
+#endif
+
+ int res = 1;
+ GList *iter = NULL;
+ char *method = NULL;
+ char *uri = NULL;
+ common_header_info *iter_data = NULL;
+
+ if (header_info == NULL) {
+ FW_LOGE("[na_http_plugIn] Error !! ( not exist header information )\n");
+ res = 0;
+ return res;
+ }
+
+ SoupMessage *msg = (SoupMessage *)(*header_binding);
+ FW_LOGV("[na_http_plugIn] msg : %d\n", msg);
+
+ for (iter = header_info; iter != NULL; iter = g_list_next(iter)) {
+ if (((common_header_info *) (iter->data))->key != NULL) {
+ if (!strcmp(((common_header_info *) (iter->data))->key, "method")) {
+ method = ((common_header_info *) (iter->data))->value;
+ break;
+ }
+ }
+ }
+
+ if (iter == 0) {
+ FW_LOGE("[na_http_plugIn] Iteration is NULL\n");
+ res = 0;
+ return res;
+ }
+
+ iter_data = (common_header_info *) iter->data;
+ header_info = g_list_remove(header_info, iter_data);
+ free((common_header_info *) iter_data);
+ FW_LOGV("[na_http_plugIn] method : %s\n", method);
+
+ iter = NULL;
+ iter_data = NULL;
+ for (iter = header_info; iter != NULL; iter = g_list_next(iter)) {
+ if (((common_header_info *) (iter->data))->key != NULL) {
+ if (!strcmp(((common_header_info *) (iter->data))->key, "uri")) {
+ uri = ((common_header_info *) (iter->data))->value;
+ break;
+ }
+ }
+ }
+
+ if (iter == 0) {
+ FW_LOGE("[na_http_plugIn] Iteration is NULL\n");
+ res = 0;
+ return res;
+ }
+
+ iter_data = (common_header_info *) iter->data;
+ header_info = g_list_remove(header_info, iter_data);
+ free((common_header_info *) iter_data);
+ FW_LOGV("[na_http_plugIn] uri : %s\n", uri);
+
+ if (!strcmp(method, "options")) {
+ msg = soup_message_new(SOUP_METHOD_OPTIONS, uri);
+ } else if (!strcmp(method, "get")) {
+ msg = soup_message_new(SOUP_METHOD_GET, uri);
+ } else if (!strcmp(method, "head")) {
+ msg = soup_message_new(SOUP_METHOD_HEAD, uri);
+ } else if (!strcmp(method, "post")) {
+ msg = soup_message_new(SOUP_METHOD_POST, uri);
+ } else if (!strcmp(method, "put")) {
+ msg = soup_message_new(SOUP_METHOD_PUT, uri);
+ } else if (!strcmp(method, "delete")) {
+ msg = soup_message_new(SOUP_METHOD_DELETE, uri);
+ } else if (!strcmp(method, "trace")) {
+ msg = soup_message_new(SOUP_METHOD_TRACE, uri);
+ } else if (!strcmp(method, "connect")) {
+ msg = soup_message_new(SOUP_METHOD_CONNECT, uri);
+ }
+
+ if (msg == NULL) {
+ FW_LOGE("[na_http_plugIn] Error !! ( wrong uri : %s )\n", uri);
+ res = 0;
+ return res;
+ }
+
+ /*
+ * perform soup_message_headers_append() using key-value in header_info
+ */
+ iter = NULL;
+ iter_data = NULL;
+ for (iter = header_info; iter != NULL;) {
+ iter_data = ((common_header_info *) (iter->data));
+ if (iter_data->key != NULL) {
+ soup_message_headers_append(msg->request_headers, iter_data->key, iter_data->value);
+ FW_LOGV("[na_http_plugIn] header append\n\t key : %s, value : %s\n", iter_data->key, iter_data->value);
+ iter = g_list_next(iter);
+ header_info = g_list_remove(header_info, iter_data);
+ free((common_header_info *) (iter_data));
+ }
+ }
+
+ *header_binding = msg;
+ FW_LOGV("[na_http_plugIn] msg : %d\n", msg);
+
+ if (header_info != NULL)
+ g_list_free(header_info);
+
+#ifdef time_check
+ /* function End Time */
+ end_t = clock();
+ proc_t = ((double)(end_t - start_t)) / CLOCKS_PER_SEC;
+ FW_LOGV("[na_http_plugIn] execute time : %0.2f\n", proc_t);
+#endif
+
+ FW_LOGV("[na_http_plugIn] End !! \n");
+
+ return res;
+}
+
+int Send_Message(void *session, void **header_binding, char *send_msg, unsigned int send_msg_length, unsigned int *recv_msg_size)
+{
+ FW_LOGV("[na_http_plugIn] Start !! \n");
+
+#ifdef time_check
+ /* function Start Time */
+ clock_t start_t, end_t;
+ double proc_t = 0.0;
+ start_t = clock();
+#endif
+
+ int res = 1;
+
+ SoupSession *ss = (SoupSession *)session;
+ FW_LOGV("[na_http_plugIn] session : %d\n", ss);
+ SoupMessage *msg = (SoupMessage *)(*header_binding);
+ FW_LOGV("[na_http_plugIn] msg : %d\n", msg);
+
+/* for test
+ SoupMessageHeadersIter iter;
+ const char *name, *value;
+
+ soup_message_headers_iter_init (&iter, msg->request_headers);
+ FW_LOGV(stdout, "1\n");
+ while (soup_message_headers_iter_next (&iter, &name, &value)) {
+ FW_LOGV(stdout, "header - name : %s value : %s", name, value);
+ FW_LOGV(stdout, "2\n");
+ }
+ */
+
+ /*
+ * add message body to message header
+ */
+ FW_LOGV("[na_http_plugIn] create whole msg (header + body)\n");
+ soup_message_body_append(msg->request_body, SOUP_MEMORY_TEMPORARY, send_msg, send_msg_length);
+
+ /*
+ * send & receive message
+ */
+ FW_LOGV("[na_http_plugIn] send message & receive message to server \n");
+ int http_status = soup_session_send_message(ss, msg);
+
+ switch (http_status) { /* todo : Send Message return type must be defined */
+ case REQUEST_TIMEOUT:
+ res = -408;
+ break;
+ case OK:
+ res = 1;
+ break;
+ case SOUP_CANCELED:
+ res = -1;
+ break;
+ case SOUP_TRY_AGAIN:
+ res = -8;
+ break;
+ default:
+ res = 0;
+ break;
+ }
+
+ FW_LOGV("[na_http_plugIn] http status : %d\n", http_status);
+
+#ifdef time_check
+ /* function End Time */
+ end_t = clock();
+ proc_t = ((double)(end_t - start_t)) / CLOCKS_PER_SEC;
+ FW_LOGV("[na_http_plugIn] execute time : %0.2f\n", proc_t);
+#endif
+
+ FW_LOGV("[na_http_plugIn] End !! \n");
+
+ return res;
+}
+
+int Header_Unbinding(void *msg, unsigned int msg_size, GList **recv_header, unsigned char **recv_msg, unsigned int *recv_msg_length)
+{
+ FW_LOGV("[na_http_plugIn] Start !! \n");
+
+#ifdef time_check
+ /* function Start Time */
+ clock_t start_t, end_t;
+ double proc_t = 0.0;
+ start_t = clock();
+#endif
+
+ int res = 1;
+ SoupMessage *whole_msg = (SoupMessage *)msg;
+ FW_LOGV("[na_http_plugIn] msg : %d\n", whole_msg);
+
+ SoupMessageHeadersIter iter;
+ const char *name, *value;
+
+ *recv_header = NULL;
+
+ /*
+ * separate header
+ */
+ soup_message_headers_iter_init(&iter, whole_msg->response_headers);
+ common_header_info *header_info = NULL;
+ while (soup_message_headers_iter_next(&iter, &name, &value)) {
+ header_info = (common_header_info *) malloc(sizeof(common_header_info));
+ if (header_info == NULL) {
+ FW_LOGE("[na_http_plugIn] header_info malloc fail !!");
+
+ if (*recv_header != NULL)
+ g_list_free(*recv_header);
+
+ res = 0;
+ return res;
+ }
+ memset(header_info, 0x00, sizeof(common_header_info));
+
+ header_info->key = strdup(name);
+ header_info->value = strdup(value);
+
+ *recv_header = g_list_append(*recv_header, header_info);
+ }
+
+ /* for test */
+ GList *g_iter = NULL;
+ for (g_iter = *recv_header; g_iter != NULL; g_iter = g_list_next(g_iter)) {
+ FW_LOGV("[na_http_plugIn] key : %s, value : %s", ((common_header_info *) (g_iter->data))->key, ((common_header_info *) (g_iter->data))->value);
+ }
+
+ /*
+ * separate body
+ */
+ if (whole_msg->response_body != NULL) {
+ if ((whole_msg->response_body->length > 0) && (whole_msg->response_body->data != NULL)) {
+ FW_LOGV("[na_http_plugIn] recv body length : %d\n", whole_msg->response_body->length);
+ *recv_msg = (unsigned char *)malloc(whole_msg->response_body->length + 1);
+ if (*recv_msg == 0) {
+ res = 0;
+ return res;
+ }
+ memset(*recv_msg, 0x00, whole_msg->response_body->length + 1);
+ memcpy(*recv_msg, whole_msg->response_body->data, whole_msg->response_body->length);
+
+ *recv_msg_length = whole_msg->response_body->length;
+ FW_LOGV("[na_http_plugIn] recv_body : %s\n", *recv_msg);
+ }
+ }
+
+ FW_LOGV("[na_http_plugIn] msg : %d\n", msg);
+
+#ifdef time_check
+ /* function End Time */
+ end_t = clock();
+ proc_t = ((double)(end_t - start_t)) / CLOCKS_PER_SEC;
+ FW_LOGV("[na_http_plugIn] execute time : %0.2f\n", proc_t);
+#endif
+
+ g_object_unref(G_OBJECT(msg));
+
+ FW_LOGV("[na_http_plugIn] End !! \n");
+
+ return res;
+}
+
+int Close_Connection(void *session)
+{
+ FW_LOGV("[na_http_plugIn] Start !! \n");
+
+#ifdef time_check
+ /* function Start Time */
+ clock_t start_t, end_t;
+ double proc_t = 0.0;
+ start_t = clock();
+#endif
+
+ int res = 1;
+
+ SoupSession *ss = (SoupSession *)session;
+
+ FW_LOGV("[na_http_plugIn] session : %d", session);
+
+ Auth_Info *auth_info = NULL;
+ res = find_auth_info(ss, &auth_info);
+ if (res == 0) {
+ FW_LOGV("[na_http_plugIn] auth_info is NULL !!");
+
+ /*soup_session_cleanup_connections(ss, TRUE);*/
+ soup_session_abort(ss);
+ FW_LOGV("[na_http_plugIn] session cleanup connections !!");
+
+ res = 1;
+ } else if (res == 1) {
+ FW_LOGV("[na_http_plugIn] fine_auth_info() is success !!");
+
+ /*soup_session_cleanup_connections(ss, TRUE);*/
+ soup_session_abort(ss);
+
+ FW_LOGV("[na_http_plugIn] session cleanup connections !!");
+
+ if (auth_info != NULL) {
+ auth_info_list = g_list_remove(auth_info_list, auth_info);
+
+ if (auth_info->id != NULL)
+ free(auth_info->id);
+ if (auth_info->password != NULL)
+ free(auth_info->password);
+ free(auth_info);
+
+ FW_LOGV("[na_http_plugIn] remove auth_info success !!");
+ }
+ } else { /* res == -1 */
+ FW_LOGV("[na_http_plugIn] auth_info_list is NULL !!");
+
+ /*soup_session_cleanup_connections(ss, TRUE);*/
+ soup_session_abort(ss);
+ FW_LOGV("[na_http_plugIn] session cleanup connections !!");
+
+ res = 1;
+ }
+
+#ifdef time_check
+ /* function End Time */
+ end_t = clock();
+ proc_t = ((double)(end_t - start_t)) / CLOCKS_PER_SEC;
+ FW_LOGV("[na_http_plugIn] execute time : %0.2f\n", proc_t);
+#endif
+
+ FW_LOGV("[na_http_plugIn] End !! \n");
+
+ return res;
+}
+
+int Cancel_Message(void *session)
+{
+ FW_LOGV("[na_http_plugIn] Start !! \n");
+
+#ifdef time_check
+ /* function Start Time */
+ clock_t start_t, end_t;
+ double proc_t = 0.0;
+ start_t = clock();
+#endif
+
+ int res = 1;
+
+ SoupSession *ss = (SoupSession *)session;
+
+ FW_LOGV("[na_http_plugIn] session : %d", session);
+
+ Auth_Info *auth_info = NULL;
+ res = find_auth_info(ss, &auth_info);
+ if (res == 0) {
+ FW_LOGV("[na_http_plugIn] auth_info is NULL !!");
+
+ soup_session_abort(ss);
+ FW_LOGV("[na_http_plugIn] session abort !! \n");
+
+ res = 1;
+ } else if (res == 1) {
+ FW_LOGV("[na_http_plugIn] fine_auth_info() is success !!");
+
+ /* cancel all pending requests & disconnect connection */
+ soup_session_abort(ss);
+ FW_LOGV("[na_http_plugIn] session abort !! \n");
+
+ if (auth_info != NULL) {
+ auth_info_list = g_list_remove(auth_info_list, auth_info);
+
+ if (auth_info->id != NULL)
+ free(auth_info->id);
+ if (auth_info->password != NULL)
+ free(auth_info->password);
+ free(auth_info);
+
+ FW_LOGV("[na_http_plugIn] remove auth_info success !!");
+ }
+ } else { /* res == -1 */
+ FW_LOGV("[na_http_plugIn] auth_info_list is NULL !!");
+
+ /* cancel all pending requests & disconnect connection */
+ soup_session_abort(ss);
+ FW_LOGV("[na_http_plugIn] session abort !! \n");
+
+ res = 1;
+ }
+
+#ifdef time_check
+ /* function End Time */
+ end_t = clock();
+ proc_t = ((double)(end_t - start_t)) / CLOCKS_PER_SEC;
+ FW_LOGV("[na_http_plugIn] execute time : %0.2f\n", proc_t);
+#endif
+
+ FW_LOGV("[na_http_plugIn] End !! \n");
+
+ return res;
+}
+
+int Get_Header_Info(GList *header_info, char *key, char **value)
+{
+ FW_LOGV("[na_http_plugIn] Start !! \n");
+
+ int res = 1;
+
+ GList *iter = NULL;
+ common_header_info *iter_data;
+ *value = NULL;
+ int value_len = 0;
+
+ if (header_info == NULL) {
+ FW_LOGE("[na_http_plugIn] Error !! ( not exist header information )\n");
+ res = 0;
+ return res;
+ }
+
+ for (iter = header_info; iter != NULL; iter = g_list_next(iter)) {
+ iter_data = NULL;
+ iter_data = (common_header_info *) (iter->data);
+ if (iter_data->key != NULL) {
+ if (!strcmp(iter_data->key, key)) {
+ if (iter_data->value != NULL) {
+ /* if (*value == NULL) { *//* first 'key - value' pair */
+ if (value_len == 0) { /* first 'key - value' pair */
+ *value = (char *)malloc(strlen(iter_data->value) + NULL_LEN + SEMI_COLON_LEN);
+ if (*value == NULL) {
+ FW_LOGE("[na_http_plugIn] malloc error !!");
+ res = 0;
+ return res;
+ }
+
+ memset(*value, 0x00, strlen(iter_data->value) + NULL_LEN + SEMI_COLON_LEN);
+ memcpy(*value, iter_data->value, strlen(iter_data->value));
+ FW_LOGV("[na_http_plugIn] key : %s, value : %s ( %d )", iter_data->key, *value, strlen(*value));
+
+ value_len += strlen(*value);
+ } else { /* after first 'key - value' pair */
+ (*value)[value_len] = ';';
+ value_len++;
+ value_len += (strlen(iter_data->value) + NULL_LEN + SEMI_COLON_LEN);
+ *value = (char *)realloc(*value, value_len);
+ if (*value == NULL) {
+ FW_LOGE("[na_http_plugIn] realloc error !!");
+ res = 0;
+ return res;
+ }
+
+ strcat(*value, iter_data->value);
+ FW_LOGV("[na_http_plugIn] key : %s, value : %s ( %d )", iter_data->key, *value, strlen(*value));
+ }
+ } else {
+ FW_LOGE("[na_http_plugIn] value is NULL !! \n");
+ res = 0;
+ return res;
+ }
+ }
+ } else {
+ FW_LOGE("[na_http_plugIn] key is NULL !! \n");
+ res = 0;
+ return res;
+ }
+ }
+
+ FW_LOGV("[na_http_plugIn] End !! \n");
+
+ return res;
+}
+
+int Set_Data_Download_Info(void *http_info, char *current_download_range)
+{
+ FW_LOGV("[na_http_plugIn] start");
+ int ret = 1;
+
+ GList *iter = 0;
+ for (iter = (GList *)http_info; iter != NULL; iter = g_list_next(iter)) {
+
+ if (((common_header_info *) (iter->data))->key != 0 && !strcmp(((common_header_info *) (iter->data))->key, "Range")) {
+
+ char *value = ((common_header_info *) (iter->data))->value;
+ if (value != 0) {
+ free(value);
+
+ ((common_header_info *) (iter->data))->value = g_strdup_printf("bytes=%s", current_download_range);
+ FW_LOGV("[After] key : %s, value : %s\n", ((common_header_info *) (iter->data))->key, ((common_header_info *) (iter->data))->value);
+ break;
+ } else {
+ FW_LOGE("[na_http_plugIn] value is NULL !! \n");
+ ret = 0;
+ return ret;
+ }
+ }
+ }
+
+ FW_LOGV("[na_http_plugIn] end");
+ return ret;
+}
+
+int Get_Data_Download_Info(void *http_info, int *total_doanload_size, char **current_download_range, char **download_file_name)
+{
+ FW_LOGV("[na_http_plugIn] start");
+ int ret = 1;
+
+ /* pasing file name */
+ char *temp_file_name = 0;
+ Get_Header_Info((GList *)http_info, "Content-Disposition", &temp_file_name);
+ FW_LOGV("temp_file_name = %s\n", temp_file_name);
+
+ char *ptr1 = strstr(temp_file_name, "attachment;");
+ if (ptr1 != 0) {
+ ptr1 = strstr(ptr1, "fileName=");
+ if (ptr1 != 0) {
+
+ char *temp = strdup(ptr1);
+
+ char *del = "\"";
+ char *temp_ptr = strtok(temp, del);
+ temp_ptr = strtok(NULL, del);
+
+ *download_file_name = strdup(temp_ptr);
+ FW_LOGV("*download_file_name = %s\n", *download_file_name);
+
+ if (temp != 0)
+ free(temp);
+ }
+ }
+
+ /* parsing data range info */
+ char *temp_range_value = 0;
+ Get_Header_Info((GList *)http_info, "Content-Range", &temp_range_value);
+ char *temp = strdup(temp_range_value + strlen("bytes "));
+ FW_LOGV("temp_range = %s\n", temp);
+
+ char *del2 = "/";
+ char *ptr2 = strtok(temp, del2);
+ if (ptr2 != 0) {
+ FW_LOGV("[na_http_plugIn] range = %s\n", ptr2);
+ *current_download_range = strdup(ptr2);
+
+ ptr2 = strtok(NULL, del2);
+ FW_LOGV("[na_http_plugIn] total = %s\n", ptr2);
+ *total_doanload_size = atoi(ptr2);
+ }
+
+ FW_LOGV("[na_http_plugIn] end");
+ return ret;
+}
+
+int Add_Authentication_Info(void *session, char *id, char *password)
+{
+ FW_LOGV("[na_http_plugIn] Start !! \n");
+
+ int res = 1;
+
+ SoupSession *ss = (SoupSession *)session;
+
+ res = add_auth_info(ss, id, password);
+ if (res != 1) {
+ FW_LOGE("[na_http_plugIn] add_auth_info() is fail !!");
+ return res;
+ } else {
+ FW_LOGV("[na_http_plugIn] add_auth_info() is success !!");
+ /* register user authentication callback (for EAS) */
+ g_signal_connect(ss, "authenticate", G_CALLBACK(authenticate_cb), NULL);
+ }
+
+ FW_LOGV("[na_http_plugIn] End !! \n");
+
+ return res;
+}
+
+static int add_auth_info(SoupSession *session, char *user_id, char *user_pw)
+{
+ FW_LOGV("[na_http_plugIn] Start !!");
+
+ int res = 1;
+
+ Auth_Info *auth_info;
+
+ /* memory alloc - auth_info */
+ auth_info = (Auth_Info *)calloc(1, sizeof(Auth_Info));
+ if (auth_info == NULL) {
+ FW_LOGE("[na_http_plugIn] auth_info calloc fail !!");
+ return 0;
+ }
+ FW_LOGV("[na_http_plugIn] auth_info calloc success !!");
+
+ auth_info->session = (void *)calloc(1, sizeof(auth_info->session));
+ auth_info->session = session;
+ FW_LOGV("[na_http_plugIn] auth_info : sessoin ( %d )", auth_info->session);
+ auth_info->id = strdup(user_id);
+ FW_LOGV("[na_http_plugIn] auth_info : id ( %s )", auth_info->id);
+ auth_info->password = strdup(user_pw);
+ FW_LOGV("[na_http_plugIn] auth_info : password ( %s )", auth_info->password);
+
+ /* append auth_info to auth_info_list */
+ auth_info_list = g_list_append(auth_info_list, auth_info);
+ FW_LOGV("[na_http_plugIn] append auth_info");
+
+ FW_LOGV("[na_http_plugIn] End !!");
+
+ return res;
+}
+
+/*static int remove_auth_info(SoupSession *session)
+{
+ FW_LOGV("[na_http_plugIn] Start !!");
+
+ int res = 1;
+ Auth_Info *auth_info = NULL;
+
+ res = find_auth_info(session, &auth_info);
+ if (res == 0) {
+ FW_LOGE("[na_http_plugIn] find_auth_info() is fail !!");
+ res = 0;
+ return res;
+ } else if (res == 1) {
+ FW_LOGV("[na_http_plugIn] fine_auth_info() is success !!");
+
+ if (auth_info->id != NULL)
+ free(auth_info->id);
+
+ if (auth_info->password != NULL)
+ free(auth_info->password);
+
+ if (auth_info != NULL)
+ free(auth_info);
+ }
+
+ FW_LOGV("[na_http_plugIn] End !!");
+
+ return res;
+}*/
+
+static int find_auth_info(SoupSession *session, Auth_Info **auth_info)
+{
+ FW_LOGV("[na_http_plugIn] Start !!");
+
+ GList *iter = NULL;
+ Auth_Info *iter_data;
+
+ int res = 1;
+
+ if (auth_info_list != NULL) {
+ /* find auth_info for session */
+ for (iter = auth_info_list; iter != NULL; iter = g_list_next(iter)) {
+ iter_data = NULL;
+ if (((Auth_Info *)(iter->data))->session != NULL) {
+ if (((Auth_Info *)(iter->data))->session == session) {
+ iter_data = (Auth_Info *)(iter->data);
+ FW_LOGV("[na_http_plugIn] find session : %d", session);
+ break;
+ }
+ }
+ }
+ } else {
+ FW_LOGE("[na_http_plugIn] auth_info_list is NULL !!");
+ res = -1;
+ return res;
+ }
+
+ if (iter_data != NULL) {
+ *auth_info = (Auth_Info *)iter_data;
+ } else {
+ FW_LOGE("[na_http_plugIn] iter_data is NULL !!");
+ res = 0;
+ return res;
+ }
+
+ FW_LOGV("[na_http_plugIn] End !!");
+
+ return res;
+}
+
+static void authenticate_cb(SoupSession *session, SoupMessage *msg, SoupAuth *auth, gboolean retrying, gpointer user_data)
+{
+ FW_LOGV("[na_http_plugIn] Start !!");
+
+ int err = 1;
+ Auth_Info *auth_info = NULL;
+
+ if (!retrying) {
+ err = find_auth_info(session, &auth_info);
+ if (err == 0) {
+ FW_LOGE("[na_http_plugIn] find_auth_info() is fail !!");
+ /* todo : error handling */
+ } else if (err == 1) {
+ FW_LOGV("[na_http_plugIn] find_auth_info() is success !!");
+ /* first authentication */
+ if (msg->status_code == SOUP_STATUS_UNAUTHORIZED) {
+ if (auth_info->id && auth_info->password)
+ soup_auth_authenticate(auth, auth_info->id, auth_info->password);
+ }
+ /* not implement - proxy authentication */
+ } else { /* err == -1 */
+ FW_LOGV("[na_http_plugIn] auth_info_list is NULL !!");
+ }
+ } else {
+ /*retry */
+ FW_LOGV("[na_http_plugIn] authentication Retry !!");
+ }
+
+ FW_LOGV("[na_http_plugIn] End !!");
+}
diff --git a/fw-plugin/memo-plugIn/.cproject b/fw-plugin/memo-plugIn/.cproject
new file mode 100755
index 0000000..3c36d31
--- /dev/null
+++ b/fw-plugin/memo-plugIn/.cproject
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?>
+
+<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="org.eclipse.cdt.core.default.config.2033120496">
+ <storageModule buildSystemId="org.eclipse.cdt.core.defaultConfigDataProvider" id="org.eclipse.cdt.core.default.config.2033120496" moduleId="org.eclipse.cdt.core.settings" name="Configuration">
+ <externalSettings/>
+ <extensions>
+ <extension id="com.samsung.limo.SboxELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="com.samsung.limo.SboxGCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="com.samsung.limo.SboxMakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ <storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
+ <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
+ <storageModule moduleId="org.eclipse.cdt.core.pathentry">
+ <pathentry kind="src" path="include"/>
+ <pathentry kind="src" path="src"/>
+ <pathentry excluding="include|src" kind="src" path=""/>
+ <pathentry kind="out" path=""/>
+ </storageModule>
+ </cconfiguration>
+ </storageModule>
+</cproject>
diff --git a/fw-plugin/memo-plugIn/.project b/fw-plugin/memo-plugIn/.project
new file mode 100755
index 0000000..9e88597
--- /dev/null
+++ b/fw-plugin/memo-plugIn/.project
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>memo-plugIn</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>com.samsung.slp2.SboxBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>com.samsung.slp2.SboxBuilder.needConfigure</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;com.samsung.limo.SboxGCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.append_environment</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.arguments</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.command</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.auto</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.clean</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.inc</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.environment</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>com.samsung.slp2.cnature</nature>
+ </natures>
+</projectDescription>
diff --git a/fw-plugin/memo-plugIn/CMakeLists.src b/fw-plugin/memo-plugIn/CMakeLists.src
new file mode 100755
index 0000000..04ce4aa
--- /dev/null
+++ b/fw-plugin/memo-plugIn/CMakeLists.src
@@ -0,0 +1 @@
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRCS)
diff --git a/fw-plugin/memo-plugIn/CMakeLists.sub b/fw-plugin/memo-plugIn/CMakeLists.sub
new file mode 100755
index 0000000..1a4fa07
--- /dev/null
+++ b/fw-plugin/memo-plugIn/CMakeLists.sub
@@ -0,0 +1,37 @@
+#################################################################################
+# THIS FILE IS CREATED AUTOMATICALLY. DO NOT DELETE OR MODIFY THIS FILE.
+#################################################################################
+
+INCLUDE(CMakeLists.src)
+
+## PROJECT NAME
+PROJECT(plugin-da-memo C)
+
+## PACKAGE CONFIG
+SET(SLP_PKGCONFIG_LIST "memo glib-2.0 accounts-svc")
+
+## INCLUDES
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../framework/include)
+
+## DEFINITIONS
+ADD_DEFINITIONS("-DAPP_DIR=\"${CMAKE_INSTALL_PREFIX}\"")
+
+## LIBRARY PATH
+SET(SLP_LD_PATH_FLAGS "")
+
+## LIBRARY
+SET(SLP_LD_FLAGS "")
+
+## DEBUG
+SET(SLP_DEBUG_FLAGS "-g")
+
+## OPTIMIZATION
+SET(SLP_OPT_FLAGS "-O0")
+
+## COMPILER FLAGS
+SET(SLP_COMPILER_FLAGS "-lpthread")
+
+## LINKER FLAGS
+SET(SLP_LINKER_FLAGS "-lpthread")
+
diff --git a/fw-plugin/memo-plugIn/CMakeLists.txt b/fw-plugin/memo-plugIn/CMakeLists.txt
new file mode 100755
index 0000000..286ee30
--- /dev/null
+++ b/fw-plugin/memo-plugIn/CMakeLists.txt
@@ -0,0 +1,33 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+
+# INCLUDE SUB CMAKELIST FILE
+INCLUDE(CMakeLists.sub)
+
+SET(RESOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/res")
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs_plugin_memo REQUIRED ${SLP_PKGCONFIG_LIST})
+
+FOREACH(flag ${pkgs_plugin_memo_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+SET(CMAKE_CXX_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+
+ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS})
+
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_plugin_memo_LDFLAGS} ${SLP_LD_PATH_FLAGS} ${SLP_LD_FLAGS} ${SLP_LINKER_FLAGS} sync-agent-framework)
+
+# INSTALL
+INSTALL(TARGETS ${PROJECT_NAME} DESTINATION lib)
+#INSTALL(DIRECTORY ${RESOURCE_DIR}/data DESTINATION share)
+
+#added by KTS for install to the system
+#CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY)
+#INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig)
+
+
+# INCLUDE LAYOUT DIRECTORY
+# ADD_SUBDIRECTORY(layout)
+#ADD_SUBDIRECTORY(res/locale)
diff --git a/fw-plugin/memo-plugIn/include/Extern_Info.h b/fw-plugin/memo-plugIn/include/Extern_Info.h
new file mode 100755
index 0000000..6a462ef
--- /dev/null
+++ b/fw-plugin/memo-plugIn/include/Extern_Info.h
@@ -0,0 +1,44 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef EXTERN_INFO_H_
+#define EXTERN_INFO_H_
+
+typedef enum {
+ DEFAULT_MEMO_FOLDER = 0,
+ USER_DEFINED_FOLDER
+} MEMO_FOLDER_TYPE;
+
+#endif /* EXTERN_INFO_H_ */
diff --git a/fw-plugin/memo-plugIn/include/Item_Change_Info.h b/fw-plugin/memo-plugIn/include/Item_Change_Info.h
new file mode 100755
index 0000000..c078584
--- /dev/null
+++ b/fw-plugin/memo-plugIn/include/Item_Change_Info.h
@@ -0,0 +1,43 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef ITEM_CHANGE_INFO_H_
+#define ITEM_CHANGE_INFO_H_
+
+int getMemoTimeStamp();
+
+int setMemoTimeStamp(int settingTime);
+
+#endif /* ITEM_CHANGE_INFO_H_ */
diff --git a/fw-plugin/memo-plugIn/src/Item_Change_Info.c b/fw-plugin/memo-plugIn/src/Item_Change_Info.c
new file mode 100755
index 0000000..f4970e6
--- /dev/null
+++ b/fw-plugin/memo-plugIn/src/Item_Change_Info.c
@@ -0,0 +1,54 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include <time.h>
+
+#include "Item_Change_Info.h"
+
+static int memoTimeStamp = 0;
+
+int getMemoTimeStamp()
+{
+ return ((int)time(0) - 3);
+}
+
+int setMemoTimeStamp(int settingTime)
+{
+ /* Critical Sectioin Start */
+ memoTimeStamp = settingTime;
+ /* Critical Section End */
+
+ return settingTime;
+}
diff --git a/fw-plugin/memo-plugIn/src/PlugIn_Interface.c b/fw-plugin/memo-plugIn/src/PlugIn_Interface.c
new file mode 100755
index 0000000..38cb31f
--- /dev/null
+++ b/fw-plugin/memo-plugIn/src/PlugIn_Interface.c
@@ -0,0 +1,744 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include <stdlib.h>
+#include <glib.h>
+#include <pthread.h>
+#include <string.h>
+#include <malloc.h>
+
+#include <memo-db.h>
+
+#include "Extern_Info.h"
+#include "Item_Change_Info.h"
+
+/* for log */
+#include "agent-framework/Utility/fw_log.h"
+
+#include "agent-framework/PlugIn/DataConnector_Interface.h"
+
+#define LOG_TAG "PLUGIN_DA_MEMO"
+
+#define FW_MEMO 2 /* plugIn-Id */
+
+static pthread_mutex_t lockx;
+
+static int isNotiFromMe = 0;
+
+static int isStorageChanged = 0;
+
+static CALLBACK_ADD_ITEM callback_add_item;
+
+static CALLBACK_DEL_ITEM callback_del_item;
+
+static CALLBACK_UPDATE_ITEM callback_update_item;
+
+static GET_ACCOUNTIDLIST callback_get_accountidlist;
+
+static void __set_IsNotiFromMe(int set_flag);
+
+static int __get_IsNotiFromMe();
+
+static void __process_Memo_Change(void *);
+
+static void *__rutine_Memo_Change(void *);
+
+static DACI_RETURN __convert_service_error_to_common_error(int err);
+
+DACI_RETURN Service_Open()
+{
+ FW_LOGV("[da_memo_plugIn] Start in Memo\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = memo_init(0);
+ if (err < 0) {
+ FW_LOGV("[da_memo_plugIn] in memo Fail!\n");
+ ret = DACI_ERR_OPEN_FAILED;
+ } else {
+ FW_LOGV("[da_memo_plugIn] in memo Success!");
+ }
+
+ FW_LOGV("[da_memo_plugIn] End in Memo\n");
+ return ret;
+}
+
+DACI_RETURN Service_Close()
+{
+ FW_LOGV("[da_memo_plugIn] Start in Memo\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+
+ /* memo service api does not return value */
+ memo_fini();
+
+ FW_LOGV("[da_memo_plugIn] End in Memo\n");
+ return ret;
+}
+
+DACI_RETURN Begin_Transaction()
+{
+ FW_LOGV("[da_memo_plugIn] Start in Memo\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+
+ /* memo service api does not return value */
+ /* real transaction is not for event notification */
+ memo_begin_trans();
+ __set_IsNotiFromMe(1);
+
+ FW_LOGV("[da_memo_plugIn] End in Memo\n");
+ return ret;
+}
+
+DACI_RETURN End_Transaction(int is_success)
+{
+ FW_LOGV("[da_memo_plugIn] Start in Memo\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+
+ /* memo service api does not return value */
+ /* real transaction is not for event notification */
+ /* memo service is not supported rollback operation */
+ memo_end_trans();
+/* __set_IsNotiFromMe(1);*/
+
+ if (isStorageChanged == 0) {
+ FW_LOGV("memo storaged was not Changed!!");
+ __set_IsNotiFromMe(0);
+ }
+ isStorageChanged = 0;
+
+ FW_LOGV("[da_memo_plugIn] End in Memo\n");
+ return ret;
+}
+
+DACI_RETURN Add_Item(int account_id, char *folder_id, void *data, char **item_id)
+{
+ FW_LOGV("[da_memo_plugIn] Start in Memo\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+ struct memo_data *item = (struct memo_data *)data;
+
+ /* parameter check */
+ if (item == 0) {
+ *item_id = 0;
+ FW_LOGV("[da_memo_plugIn] service data is null \n");
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ /* configuration item */
+ item->id = -1;
+ item->modi_time = time((time_t *)0);
+ item->font_size = 32;
+ item->font_color = 0xff000000;
+
+ /* add item */
+ err = memo_add_data(item);
+ if (err < 0) {
+ FW_LOGV("[da_memo_plugIn] memo_add_data() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ *item_id = 0;
+ } else {
+ FW_LOGV("[da_memo_plugIn] memo_add_data() Success!\n");
+ *item_id = g_strdup_printf("%d", err);
+ isStorageChanged = 1;
+ }
+
+ /* memory free */
+ if (item != 0)
+ memo_free_data(item);
+
+ FW_LOGV("[da_memo_plugIn] End in Memo\n");
+ return ret;
+}
+
+DACI_RETURN Update_Item(int account_id, char *folder_id, char *item_id, void *data)
+{
+ FW_LOGV("[da_memo_plugIn] Start in Memo\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+ struct memo_data *item = (struct memo_data *)data;
+
+ /* parameter check */
+ if (item == 0) {
+ FW_LOGV("[da_memo_plugIn] service id is null \n");
+
+ /* memory free */
+ if (item != 0)
+ memo_free_data(item);
+
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ /* update item */
+ err = memo_mod_data(item);
+ if (err < 0) {
+ FW_LOGV("[da_memo_plugIn] memo_mod_data() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ } else {
+ FW_LOGV("[da_memo_plugIn] memo_mod_data() Success!\n");
+ isStorageChanged = 1;
+ }
+
+ /* memory free */
+ if (item != 0)
+ memo_free_data(item);
+
+ FW_LOGV("[da_memo_plugIn] End in Memo\n");
+ return ret;
+}
+
+DACI_RETURN Del_Item(int account_id, char *folder_id, char *item_id)
+{
+ FW_LOGV("[da_memo_plugIn] Start in Memo\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+
+ /* parameter check */
+ if (item_id == 0) {
+ FW_LOGV("[da_memo_plugIn] service id is null \n");
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ /* delete item */
+ err = memo_del_data(atoi(item_id));
+ if (err < 0) {
+ FW_LOGV("[da_memo_plugIn] memo_del_data(%s) Fail!\n", item_id);
+ ret = __convert_service_error_to_common_error(err);
+ } else {
+ FW_LOGV("[da_memo_plugIn] memo_del_data(%s) Success!\n", item_id);
+ isStorageChanged = 1;
+ }
+
+ FW_LOGV("[da_memo_plugIn] End in Memo\n");
+ return ret;
+}
+
+DACI_RETURN Del_All_Items(int account_id)
+{
+ FW_LOGV("[da_memo_plugIn] Start in Memo\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 1;
+ struct memo_data_list *item_list = NULL;
+ struct memo_data_list *first_item_list = NULL;
+
+ /* get all data in memo db */
+ item_list = memo_get_all_data_list();
+ first_item_list = item_list;
+
+ while (item_list != NULL) {
+ err = memo_del_data(item_list->md.id);
+ if (err < 0) {
+ FW_LOGV("[da_memo_plugIn] memo_del_data(%d) Fail!\n", item_list->md.id);
+ ret = __convert_service_error_to_common_error(err);
+ break;
+ } else {
+ FW_LOGV("[da_memo_plugIn] memo_del_data(%d) Success!\n", item_list->md.id);
+ isStorageChanged = 1;
+ }
+
+ /* memory free */
+ if (item_list->md.comment != 0) {
+ free(item_list->md.comment);
+ item_list->md.comment = 0;
+ }
+
+ if (item_list->md.doodle_path != 0) {
+ free(item_list->md.doodle_path);
+ item_list->md.doodle_path = 0;
+ }
+
+ item_list = item_list->next;
+ }
+
+ /* memory free */
+ if (first_item_list != NULL) {
+ memo_free_data_list(first_item_list);
+ FW_LOGV("[da_memo_plugIn] memo_free_data_list \n");
+ }
+
+ FW_LOGV("[da_memo_plugIn] End in Memo\n");
+ return ret;
+}
+
+DACI_RETURN Get_Item(int account_id, char *folder_id, char *item_id, void **data)
+{
+ FW_LOGV("[da_memo_plugIn] Start in Memo\n");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ struct memo_data *item = 0;
+
+ /* parameter check */
+ if (item_id == 0) {
+ FW_LOGV("[da_memo_plugIn] service id is null \n");
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ if (item_id == 0) {
+ FW_LOGV("[da_memo_plugIn] service id is null \n");
+ return DACI_ERR_INVALID_CONTENT;
+ }
+
+ /* get item */
+ item = memo_get_data(atoi(item_id));
+ if (item == 0) {
+ FW_LOGV("[da_memo_plugIn] memo_get_data() Fail!\n");
+ ret = DACI_ERRORS;
+ *data = 0;
+ } else {
+ FW_LOGV("[da_memo_plugIn] memo_get_data() Success!");
+ *data = (void *)item;
+ }
+
+ FW_LOGV("[da_memo_plugIn] End in Memo\n");
+ return ret;
+}
+
+DACI_RETURN Add_Folder(int account_id, char *folder_name, int folder_type, char **folder_id)
+{
+ FW_LOGV("[da_memo_plugIn] Start in Memo\n");
+ FW_LOGV("[da_memo_plugIn] memo service is not supported folder\n");
+ FW_LOGV("[da_memo_plugIn] End in Memo\n");
+ return DACI_SUCCESS;
+}
+
+DACI_RETURN Del_Folder(int account_id, char *folder_id)
+{
+ FW_LOGV("[da_memo_plugIn] Start in Memo\n");
+ FW_LOGV("[da_memo_plugIn] memo service is not supported folder\n");
+ FW_LOGV("[da_memo_plugIn] End in Memo\n");
+ return DACI_SUCCESS;
+}
+
+DACI_RETURN Get_Folder(int account_id, char *folder_id, char **out_folder_name, int *out_folder_type)
+{
+ FW_LOGV("[da_memo_plugIn] Start in Memo\n");
+ FW_LOGV("[da_memo_plugIn] memo service is not supported folder\n");
+ FW_LOGV("[da_memo_plugIn] End in Memo\n");
+ return DACI_SUCCESS;
+}
+
+DACI_RETURN Execute(int account_ID, const char *execute_key, void *execute_values, void **result)
+{
+ FW_LOGV("[da_memo_plugIn] Start in Memo\n");
+ FW_LOGV("[da_memo_plugIn] memo service is not supported execute. \n");
+ *result = 0;
+ FW_LOGV("[da_memo_plugIn] End in Memo\n");
+ return DACI_SUCCESS;
+}
+
+int Get_Used_Item_Count()
+{
+ FW_LOGV("[da_memo_plugIn] Start in Memo\n");
+
+ int ret = DACI_SUCCESS;
+ int used_cnt = 0;
+ int err = memo_get_count(&used_cnt);
+ if (err == -1) {
+ FW_LOGV("[da_memo_plugIn] memo_get_count() Fail\n");
+ ret = __convert_service_error_to_common_error(err);
+ } else {
+ FW_LOGV("[da_memo_plugIn] memo_get_count() Success\n");
+ FW_LOGV("[da_memo_plugIn] used_count = %d\n", used_cnt);
+ ret = used_cnt;
+ }
+
+ FW_LOGV("[da_memo_plugIn] End in Memo\n");
+ return ret;
+}
+
+int Get_Used_Item_Count_For_Folder(int account_id, char *folder_id)
+{
+ FW_LOGV("[da_memo_plugIn] Memo plugIn is not supported this function\n");
+ FW_LOGV("[da_memo_plugIn] Return all memo count \n");
+
+ return Get_Used_Item_Count();
+}
+
+char **Get_Folder_ID_List(int account_id, int *folder_count, int **folder_type_list)
+{
+ char **folder_id_list = (char **)calloc(1, sizeof(char *));
+ *folder_type_list = (int *)calloc(1, sizeof(int));
+
+ folder_id_list[0] = "0";
+ *folder_count = 1;
+ (*folder_type_list)[0] = DEFAULT_MEMO_FOLDER;
+
+ return folder_id_list;
+}
+
+int *Get_Account_ID_List(int *count)
+{
+ FW_LOGV("[da_memo_plugIn] start!!\n");
+
+ int *account_id_list = (int *)calloc(1, sizeof(int));
+
+ *count = 1;
+ account_id_list[0] = -1;
+
+ return account_id_list;
+}
+
+Item_Node *Get_Changed_ITEM_For_Folder_Add(int account_id, const char *folder_id, int changepoint, int *changeCount)
+{
+ FW_LOGV("\n[da_memo_plugIn] account_id : %d\n", account_id);
+ FW_LOGV("[da_memo_plugIn] folder_id : %s\n", folder_id);
+ FW_LOGV("[da_memo_plugIn] changepoint : %d\n", changepoint);
+
+ int memoTimeStamp = changepoint;
+ struct memo_operation_list *item_list = 0;
+
+ Item_Node *root_ptr = 0;
+ Item_Node *cursor_ptr = 0;
+ int chagned_count = 0;
+
+ item_list = memo_get_operation_list(memoTimeStamp);
+ if (item_list == 0)
+ goto DACI_FINISH;
+
+ while ((item_list != 0) && (item_list->id > -1)) {
+ if (item_list->operation == MEMO_OPERATION_ADD) {
+ char *str_item_id = (char *)calloc(5, sizeof(char));
+ sprintf(str_item_id, "%d", item_list->id);
+ FW_LOGV("[da_memo_plugIn] MEMO_OPERATION_ADD : [%s]\n", str_item_id);
+
+ if (root_ptr == 0) {
+ root_ptr = (Item_Node *) calloc(1, sizeof(Item_Node));
+ root_ptr->item_id = str_item_id;
+ root_ptr->next = 0;
+ cursor_ptr = root_ptr;
+ } else {
+ cursor_ptr->next = (Item_Node *) calloc(1, sizeof(Item_Node));
+ cursor_ptr->next->item_id = str_item_id;
+ cursor_ptr->next->next = 0;
+ cursor_ptr = cursor_ptr->next;
+ }
+
+ chagned_count++;
+ }
+ item_list = item_list->next;
+ }
+
+DACI_FINISH:
+
+ /* memory free */
+ if (item_list != 0) {
+ memo_free_operation_list(item_list);
+ item_list = 0;
+ }
+
+ *changeCount = chagned_count;
+ return root_ptr;
+}
+
+Item_Node *Get_Changed_ITEM_For_Folder_Del(int account_id, const char *folder_id, int changepoint, int *changeCount)
+{
+ FW_LOGV("\n[da_memo_plugIn] account_id : %d\n", account_id);
+ FW_LOGV("[da_memo_plugIn] folder_id : %s\n", folder_id);
+ FW_LOGV("[da_memo_plugIn] changepoint : %d\n", changepoint);
+
+ int memoTimeStamp = changepoint;
+ struct memo_operation_list *item_list = 0;
+
+ Item_Node *root_ptr = 0;
+ Item_Node *cursor_ptr = 0;
+ int chagned_count = 0;
+
+ item_list = memo_get_operation_list(memoTimeStamp);
+ if (item_list == 0)
+ goto DACI_FINISH;
+
+ while ((item_list != 0) && (item_list->id > -1)) {
+ if (item_list->operation == MEMO_OPERATION_DELETE) {
+ char *str_item_id = (char *)calloc(5, sizeof(char));
+ sprintf(str_item_id, "%d", item_list->id);
+ FW_LOGV("[da_memo_plugIn] MEMO_OPERATION_DELETE : [%s]\n", str_item_id);
+
+ if (root_ptr == 0) {
+ root_ptr = (Item_Node *) calloc(1, sizeof(Item_Node));
+ root_ptr->item_id = str_item_id;
+ root_ptr->next = 0;
+ cursor_ptr = root_ptr;
+ } else {
+ cursor_ptr->next = (Item_Node *) calloc(1, sizeof(Item_Node));
+ cursor_ptr->next->item_id = str_item_id;
+ cursor_ptr->next->next = 0;
+ cursor_ptr = cursor_ptr->next;
+ }
+
+ chagned_count++;
+ }
+ item_list = item_list->next;
+ }
+
+DACI_FINISH:
+
+ /* memory free */
+ if (item_list != 0) {
+ memo_free_operation_list(item_list);
+ item_list = 0;
+ }
+
+ *changeCount = chagned_count;
+ return root_ptr;
+}
+
+Item_Node *Get_Changed_ITEM_For_Folder_Update(int account_id, const char *folder_id, int changepoint, int *changeCount)
+{
+ FW_LOGV("\n[da_memo_plugIn] account_id : %d\n", account_id);
+ FW_LOGV("[da_memo_plugIn] folder_id : %s\n", folder_id);
+ FW_LOGV("[da_memo_plugIn] changepoint : %d\n", changepoint);
+
+ int memoTimeStamp = changepoint;
+ struct memo_operation_list *item_list = 0;
+
+ Item_Node *root_ptr = 0;
+ Item_Node *cursor_ptr = 0;
+ int chagned_count = 0;
+
+ item_list = memo_get_operation_list(memoTimeStamp);
+ if (item_list == 0)
+ goto DACI_FINISH;
+
+ while ((item_list != 0) && (item_list->id > -1)) {
+ if (item_list->operation == MEMO_OPERATION_UPDATE) {
+ char *str_item_id = (char *)calloc(5, sizeof(char));
+ sprintf(str_item_id, "%d", item_list->id);
+ FW_LOGV("[da_memo_plugIn] MEMO_OPERATION_UPDATE : [%s]\n", str_item_id);
+
+ if (root_ptr == 0) {
+ root_ptr = (Item_Node *) calloc(1, sizeof(Item_Node));
+ root_ptr->item_id = str_item_id;
+ root_ptr->next = 0;
+ cursor_ptr = root_ptr;
+ } else {
+ cursor_ptr->next = (Item_Node *) calloc(1, sizeof(Item_Node));
+ cursor_ptr->next->item_id = str_item_id;
+ cursor_ptr->next->next = 0;
+ cursor_ptr = cursor_ptr->next;
+ }
+
+ chagned_count++;
+ }
+ item_list = item_list->next;
+ }
+
+DACI_FINISH:
+
+ /* memory free */
+ if (item_list != 0) {
+ memo_free_operation_list(item_list);
+ item_list = 0;
+ }
+
+ *changeCount = chagned_count;
+ return root_ptr;
+}
+
+int Get_Last_ChangePoint()
+{
+ return (int)time(0);
+}
+
+void StartListening_ChangeNoti(void *data)
+{
+ memo_subscribe_change(__process_Memo_Change, 0);
+}
+
+void SetCallBack_AddItem(CALLBACK_ADD_ITEM callback)
+{
+ callback_add_item = callback;
+}
+
+void SetCallBack_DeleteItem(CALLBACK_DEL_ITEM callback)
+{
+ callback_del_item = callback;
+}
+
+void SetCallBack_UpdateItem(CALLBACK_UPDATE_ITEM callback)
+{
+ callback_update_item = callback;
+}
+
+void SetCallBack_GetAccountIDList(GET_ACCOUNTIDLIST callback)
+{
+ callback_get_accountidlist = callback;
+}
+
+/********************************** static function *******************************************/
+
+static void __set_IsNotiFromMe(int set_flag)
+{
+ if (pthread_mutex_lock(&lockx)) {
+ FW_LOGV("[da_memo_plugIn] pthread_mutex_lock error");
+ }
+
+ isNotiFromMe = set_flag;
+
+ if (pthread_mutex_unlock(&lockx)) {
+ FW_LOGV("[da_memo_plugIn] pthread_mutex_unlock error");
+ }
+}
+
+static int __get_IsNotiFromMe()
+{
+ return isNotiFromMe;
+}
+
+void __process_Memo_Change(void *data)
+{
+ FW_LOGV("[da_memo_plugIn] detected memo storage changed!!\n");
+
+ int from_Me = __get_IsNotiFromMe();
+ if (from_Me == 1) {
+ __set_IsNotiFromMe(0);
+ FW_LOGV("[da_memo_plugIn] This noti is from Me!! so will be ignored!!\n");
+ return;
+ }
+
+ pthread_t thread_process_change_id;
+ pthread_create(&thread_process_change_id, 0, __rutine_Memo_Change, 0);
+}
+
+static void *__rutine_Memo_Change(void *data)
+{
+ FW_LOGV("[da_memo_plugIn] Start __rutine_Memo_Change (create thread)\n");
+
+ int memoTimeStamp = getMemoTimeStamp();
+
+ int i = 0;
+ int count = 0;
+ int result = 0;
+ char *str_item_id = 0;
+ int *accountList = 0;
+ struct memo_operation_list *item_list = 0;
+
+ accountList = callback_get_accountidlist(FW_MEMO, &count);
+ if (accountList == 0)
+ goto DACI_FINISH;
+
+ item_list = memo_get_operation_list(memoTimeStamp);
+ if (item_list == 0)
+ goto DACI_FINISH;
+
+ while ((item_list != 0) && (item_list->id > -1)) {
+ str_item_id = g_strdup_printf("%d", item_list->id);
+
+ for (i = 0; i < count; i++) {
+ FW_LOGV("[da_memo_plugIn] memo_account_id : %d, count : %d\n", accountList[i], count);
+ FW_LOGV("[da_memo_plugIn] memo_get_operation_list : %d\n", memoTimeStamp);
+
+ switch (item_list->operation) {
+ case MEMO_OPERATION_ADD:
+ {
+ /* memo service is not supported folder */
+ FW_LOGV("[da_memo_plugIn] MEMO_OPERATION_ADD\n");
+ result = callback_add_item(accountList[i], i, str_item_id, FW_MEMO, "0", 0);
+ if (!result) {
+ FW_LOGV("[da_memo_plugIn] Failed to call callback_add_item() \n");
+ goto DACI_FINISH;
+ }
+ }
+ break;
+ case MEMO_OPERATION_UPDATE:
+ {
+ FW_LOGV("[da_memo_plugIn] MEMO_OPERATION_UPDATE\n");
+ result = callback_update_item(accountList[i], i, str_item_id, FW_MEMO);
+ if (!result) {
+ FW_LOGV("[da_memo_plugIn] Failed to call callback_update_item() \n");
+ goto DACI_FINISH;
+ }
+ }
+ break;
+ case MEMO_OPERATION_DELETE:
+ {
+ FW_LOGV("[da_memo_plugIn] MEMO_OPERATION_DELETE\n");
+ result = callback_del_item(accountList[i], i, str_item_id, FW_MEMO);
+ if (!result) {
+ FW_LOGV("[da_memo_plugIn] Failed to call callback_del_item() \n");
+ goto DACI_FINISH;
+ }
+ }
+ break;
+ default:
+ FW_LOGV("[da_memo_plugIn] Another Memo Change Noti\n");
+ break;
+ }
+ }
+ item_list = item_list->next;
+ free(str_item_id);
+ str_item_id = 0;
+ }
+
+DACI_FINISH:
+
+ /* memory free */
+ if (item_list != 0) {
+ memo_free_operation_list(item_list);
+ item_list = 0;
+ }
+
+ if (accountList != 0) {
+ free(accountList);
+ accountList = 0;
+ }
+
+ if (str_item_id != 0) {
+ free(str_item_id);
+ str_item_id = 0;
+ }
+
+ FW_LOGV("[da_memo_plugIn] End __rutine_Memo_Change (create thread)\n");
+
+ return 0;
+}
+
+static DACI_RETURN __convert_service_error_to_common_error(int err)
+{
+ DACI_RETURN ret = DACI_SUCCESS;
+ FW_LOGV("[da_memo_plugIn] Error Code : %d\n", err);
+
+ switch (err) {
+ default:
+ ret = DACI_ERRORS;
+ break;
+ }
+
+ return ret;
+}
diff --git a/fw-plugin/plain-text-plugIn/.cproject b/fw-plugin/plain-text-plugIn/.cproject
new file mode 100755
index 0000000..3c36d31
--- /dev/null
+++ b/fw-plugin/plain-text-plugIn/.cproject
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?>
+
+<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="org.eclipse.cdt.core.default.config.2033120496">
+ <storageModule buildSystemId="org.eclipse.cdt.core.defaultConfigDataProvider" id="org.eclipse.cdt.core.default.config.2033120496" moduleId="org.eclipse.cdt.core.settings" name="Configuration">
+ <externalSettings/>
+ <extensions>
+ <extension id="com.samsung.limo.SboxELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="com.samsung.limo.SboxGCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="com.samsung.limo.SboxMakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ <storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
+ <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
+ <storageModule moduleId="org.eclipse.cdt.core.pathentry">
+ <pathentry kind="src" path="include"/>
+ <pathentry kind="src" path="src"/>
+ <pathentry excluding="include|src" kind="src" path=""/>
+ <pathentry kind="out" path=""/>
+ </storageModule>
+ </cconfiguration>
+ </storageModule>
+</cproject>
diff --git a/fw-plugin/plain-text-plugIn/.project b/fw-plugin/plain-text-plugIn/.project
new file mode 100755
index 0000000..6a6b392
--- /dev/null
+++ b/fw-plugin/plain-text-plugIn/.project
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>plain-text-plugIn</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>com.samsung.slp2.SboxBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>com.samsung.slp2.SboxBuilder.needConfigure</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;com.samsung.limo.SboxGCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.append_environment</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.arguments</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.command</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.auto</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.clean</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.inc</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.environment</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>com.samsung.slp2.cnature</nature>
+ </natures>
+</projectDescription>
diff --git a/fw-plugin/plain-text-plugIn/CMakeLists.src b/fw-plugin/plain-text-plugIn/CMakeLists.src
new file mode 100755
index 0000000..04ce4aa
--- /dev/null
+++ b/fw-plugin/plain-text-plugIn/CMakeLists.src
@@ -0,0 +1 @@
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRCS)
diff --git a/fw-plugin/plain-text-plugIn/CMakeLists.sub b/fw-plugin/plain-text-plugIn/CMakeLists.sub
new file mode 100755
index 0000000..286276c
--- /dev/null
+++ b/fw-plugin/plain-text-plugIn/CMakeLists.sub
@@ -0,0 +1,37 @@
+#################################################################################
+# THIS FILE IS CREATED AUTOMATICALLY. DO NOT DELETE OR MODIFY THIS FILE.
+#################################################################################
+
+INCLUDE(CMakeLists.src)
+
+## PROJECT NAME
+PROJECT(plugin-dc-plain-text C)
+
+## PACKAGE CONFIG
+SET(SLP_PKGCONFIG_LIST "memo glib-2.0")
+
+## INCLUDES
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../framework/include)
+
+## DEFINITIONS
+ADD_DEFINITIONS("-DAPP_DIR=\"${CMAKE_INSTALL_PREFIX}\"")
+
+## LIBRARY PATH
+SET(SLP_LD_PATH_FLAGS "")
+
+## LIBRARY
+SET(SLP_LD_FLAGS "")
+
+## DEBUG
+SET(SLP_DEBUG_FLAGS "-g")
+
+## OPTIMIZATION
+SET(SLP_OPT_FLAGS "-O0")
+
+## COMPILER FLAGS
+SET(SLP_COMPILER_FLAGS "")
+
+## LINKER FLAGS
+SET(SLP_LINKER_FLAGS "")
+
diff --git a/fw-plugin/plain-text-plugIn/CMakeLists.txt b/fw-plugin/plain-text-plugIn/CMakeLists.txt
new file mode 100755
index 0000000..567bbf0
--- /dev/null
+++ b/fw-plugin/plain-text-plugIn/CMakeLists.txt
@@ -0,0 +1,33 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+
+# INCLUDE SUB CMAKELIST FILE
+INCLUDE(CMakeLists.sub)
+
+SET(RESOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/res")
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs_plugin_plain_text REQUIRED ${SLP_PKGCONFIG_LIST})
+
+FOREACH(flag ${pkgs_plugin_plain_text_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+SET(CMAKE_CXX_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+
+ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS})
+
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_plugin_plain_text_LDFLAGS} ${SLP_LD_PATH_FLAGS} ${SLP_LD_FLAGS} ${SLP_LINKER_FLAGS} sync-agent-framework)
+
+# INSTALL
+INSTALL(TARGETS ${PROJECT_NAME} DESTINATION lib)
+#INSTALL(DIRECTORY ${RESOURCE_DIR}/data DESTINATION share)
+
+#added by KTS for install to the system
+#CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY)
+#INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig)
+
+
+# INCLUDE LAYOUT DIRECTORY
+# ADD_SUBDIRECTORY(layout)
+#ADD_SUBDIRECTORY(res/locale)
diff --git a/fw-plugin/plain-text-plugIn/include/IN_DataStore_Info_Plain_Text.h b/fw-plugin/plain-text-plugIn/include/IN_DataStore_Info_Plain_Text.h
new file mode 100755
index 0000000..2624692
--- /dev/null
+++ b/fw-plugin/plain-text-plugIn/include/IN_DataStore_Info_Plain_Text.h
@@ -0,0 +1,50 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef IN_DATASTORE_INFO_PLAIN_TEXT_H_
+#define IN_DATASTORE_INFO_PLAIN_TEXT_H_
+
+#define PLAIN_TEXT_TYPE "text/plain"
+#define PLAIN_TEXT_VERSION "1.0"
+
+typedef struct PLAIN_TEXT_FIELD_LIST PLAIN_TEXT_FIELD_LIST;
+struct PLAIN_TEXT_FIELD_LIST {
+ int field_enum;
+ char *field_name;
+};
+
+static PLAIN_TEXT_FIELD_LIST plain_text_field_list[] = { };
+
+#endif /* IN_DATASTORE_INFO_PLAIN_TEXT_H_ */
diff --git a/fw-plugin/plain-text-plugIn/src/PlugIn_Interface.c b/fw-plugin/plain-text-plugIn/src/PlugIn_Interface.c
new file mode 100755
index 0000000..19cafed
--- /dev/null
+++ b/fw-plugin/plain-text-plugIn/src/PlugIn_Interface.c
@@ -0,0 +1,244 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <memo-db.h>
+
+#include "IN_DataStore_Info_Plain_Text.h"
+
+/* for log */
+#include "agent-framework/Utility/fw_log.h"
+
+#include "agent-framework/PlugIn/DataConverter_Interface.h"
+
+#define LOG_TAG "PLUGIN_DC_PLAIN_TEXT"
+
+static int __free_obj_field_info(Field_Info *field_list, int count);
+static int __set_obj_field_info(Field_Info **field_list, int count, PLAIN_TEXT_FIELD_LIST * input_list);
+/*
+static void __print_obj_field_info(Field_Info *info, int count);
+static DACI_RETURN __convert_service_error_to_common_error(int err);
+*/
+
+DACI_RETURN Converter(const void *agent_data, void **service_data)
+{
+ FW_LOGV("[dc_plain_text_plugIn] Start !!");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ struct memo_data *temp_service_data = 0;
+ char *temp_agent_data = (char *)agent_data;
+
+ /* create item */
+ temp_service_data = memo_create_data();
+ if (temp_service_data == 0) {
+ FW_LOGV("[dc_plain_text_plugIn] memo_create_data() Fail!\n");
+ ret = DACI_ERRORS;
+ *service_data = 0;
+ } else {
+ FW_LOGV("[dc_plain_text_plugIn] memo_create_data() Success!\n");
+ temp_service_data->content = strdup(temp_agent_data); /* configuration item */
+ *service_data = (void *)temp_service_data;
+ }
+
+ FW_LOGV("[dc_plain_text_plugIn] End !!");
+ return ret;
+}
+
+DACI_RETURN Replace_Converter(void *old_service_data, const void *agent_data, void **new_service_data)
+{
+ FW_LOGV("[dc_plain_text_plugIn] Start !!");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ struct memo_data *temp_service_data = (struct memo_data *)old_service_data;
+ char *temp_agent_data = (char *)agent_data;
+
+ /* set item */
+ if (temp_service_data->has_doodle == 0) {
+ free(temp_service_data->content);
+ temp_service_data->content = strdup(temp_agent_data);
+ } else if (temp_service_data->comment != 0) {
+ free(temp_service_data->comment);
+ temp_service_data->comment = strdup(temp_agent_data);
+ }
+ *new_service_data = (void *)temp_service_data;
+
+ FW_LOGV("[dc_plain_text_plugIn] End !!");
+ return ret;
+}
+
+DACI_RETURN Reverse_Converter(void *service_data, void **agent_data)
+{
+ FW_LOGV("[dc_plain_text_plugIn] Start !!");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ char *temp_agent_data = 0;
+ struct memo_data *temp_service_data = (struct memo_data *)service_data;
+
+ /* deep copy */
+ if (temp_service_data == 0) {
+ FW_LOGV("[dc_plain_text_plugIn] Fail : no data !\n");
+ ret = DACI_ERRORS;
+ *agent_data = 0;
+ } else if (temp_service_data->has_doodle == 0) {
+ FW_LOGV("[dc_plain_text_plugIn] Success!\n");
+ temp_agent_data = strdup(temp_service_data->content);
+ *agent_data = (void *)temp_agent_data;
+ } else if (temp_service_data->comment != 0) {
+ FW_LOGV("[dc_plain_text_plugIn] Success!\n");
+ temp_agent_data = strdup(temp_service_data->comment);
+ *agent_data = (void *)temp_agent_data;
+ }
+
+ /* memory free */
+ if (temp_service_data != 0)
+ memo_free_data(temp_service_data);
+
+ FW_LOGV("[dc_plain_text_plugIn] End !!");
+ return ret;
+}
+
+void *Alloc_Object()
+{
+ FW_LOGV("[da_memo_plugIn] not implement !!");
+ return 0;
+}
+
+int Free_Object(void *in_object)
+{
+ FW_LOGV("[da_memo_plugIn] not implement !!");
+ return 0;
+}
+
+void *Set_Value_To_Object(void *in_object, int key, char *extension_key, void *value)
+{
+ FW_LOGV("[da_memo_plugIn] not implement !!");
+ return 0;
+}
+
+void *Get_Value_To_Object(void *in_object, int key, char *extension_key)
+{
+ FW_LOGV("[da_memo_plugIn] not implement !!");
+ return 0;
+}
+
+Object_Info *Get_Obj_Info()
+{
+ Object_Info *obj_info = (Object_Info *)calloc(1, sizeof(Object_Info));
+
+ obj_info->type = PLAIN_TEXT_TYPE;
+ obj_info->version = PLAIN_TEXT_VERSION;
+ obj_info->field_cnt = sizeof(plain_text_field_list) / sizeof(PLAIN_TEXT_FIELD_LIST);
+
+ if (obj_info->field_cnt > 0)
+ __set_obj_field_info(&(obj_info->field_list), obj_info->field_cnt, plain_text_field_list);
+
+ return obj_info;
+}
+
+int Free_Obj_Info(Object_Info *obj_info)
+{
+ if (obj_info) {
+ if (obj_info->field_cnt > 0)
+ if (__free_obj_field_info(obj_info->field_list, obj_info->field_cnt) == 0)
+ return 0;
+
+ free(obj_info);
+ }
+
+ return 1;
+}
+
+static int __free_obj_field_info(Field_Info *field_list, int count)
+{
+ int field_count = 0;
+ Field_Info *child = NULL;
+
+ if (field_list) {
+ for (field_count = 0; field_count < count; field_count++) {
+ child = field_list + field_count;
+ if (child->field_child_cnt > 0)
+ if (__free_obj_field_info(child->field_child_list, child->field_child_cnt) == 0)
+ return 0;
+ }
+ free(field_list);
+ }
+
+ return 1;
+}
+
+static int __set_obj_field_info(Field_Info **field_list, int count, PLAIN_TEXT_FIELD_LIST * input_list)
+{
+ int field_count = 0;
+ Field_Info *child = NULL;
+
+ *field_list = (Field_Info *)calloc(count, sizeof(Field_Info));
+
+ for (field_count = 0; field_count < count; field_count++) {
+ child = (*field_list) + field_count;
+ child->field_name = input_list[field_count].field_name;
+ FW_LOGI("[%s]", child->field_name);
+ }
+
+ return 1;
+}
+
+/*
+static void __print_obj_field_info(Field_Info *info, int count)
+{
+ int i = 0;
+ if (info)
+ for (i = 0; i < count; i++) {
+ printf("[%s]\n", info[i].field_name);
+ if (info[i].field_child_list)
+ print(info[i].field_child_list, info[i].field_child_cnt);
+ }
+}
+
+static DACI_RETURN __convert_service_error_to_common_error(int err)
+{
+ DACI_RETURN ret = DACI_SUCCESS;
+ FW_LOGV("[da_memo_plugIn] Error Code : %d\n", err);
+
+ switch (err) {
+ default:
+ ret = DACI_ERRORS;
+ break;
+ }
+
+ return ret;
+}
+*/
diff --git a/fw-plugin/slp-device-plugIn/.cproject b/fw-plugin/slp-device-plugIn/.cproject
new file mode 100755
index 0000000..a09bf93
--- /dev/null
+++ b/fw-plugin/slp-device-plugIn/.cproject
@@ -0,0 +1,376 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?>
+
+<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="0.1083190628">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1083190628" moduleId="org.eclipse.cdt.core.settings" name="Default">
+ <externalSettings/>
+ <extensions>
+ <extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration buildProperties="" description="" id="0.1083190628" name="Default" parent="org.eclipse.cdt.build.core.prefbase.cfg">
+ <folderInfo id="0.1083190628." name="/" resourcePath="">
+ <toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.298632068" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
+ <targetPlatform id="org.eclipse.cdt.build.core.prefbase.toolchain.298632068.2049107026" name=""/>
+ <builder id="org.eclipse.cdt.build.core.settings.default.builder.1807698244" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
+ <tool id="org.eclipse.cdt.build.core.settings.holder.libs.2086725825" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
+ <tool id="org.eclipse.cdt.build.core.settings.holder.1557904096" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
+ <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1383545675" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
+ </tool>
+ <tool id="org.eclipse.cdt.build.core.settings.holder.1489576981" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
+ <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.130965659" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
+ </tool>
+ <tool id="org.eclipse.cdt.build.core.settings.holder.1140718257" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
+ <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.871705930" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
+ </tool>
+ </toolChain>
+ </folderInfo>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <scannerConfigBuildInfo instanceId="0.1083190628">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ <scannerConfigBuildInfo instanceId="0.297934327">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ <scannerConfigBuildInfo instanceId="0.2065504086">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ </cconfiguration>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <project id="slp-device-plugIn.null.1885516103" name="slp-device-plugIn"/>
+ </storageModule>
+</cproject>
diff --git a/fw-plugin/slp-device-plugIn/.project b/fw-plugin/slp-device-plugIn/.project
new file mode 100755
index 0000000..eb56211
--- /dev/null
+++ b/fw-plugin/slp-device-plugIn/.project
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>slp-device-plugIn</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+ <triggers>clean,full,incremental,</triggers>
+ <arguments>
+ <dictionary>
+ <key>?name?</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.append_environment</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildArguments</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.contents</key>
+ <value>org.eclipse.cdt.make.core.activeConfigSettings</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.samsung.slp2.SboxBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>com.samsung.slp2.SboxBuilder.needConfigure</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;com.samsung.limo.SboxGCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.append_environment</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.arguments</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.command</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.auto</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.clean</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.inc</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.environment</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>com.samsung.slp2.cnature</nature>
+ <nature>org.eclipse.cdt.core.ccnature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/fw-plugin/slp-device-plugIn/CMakeLists.src b/fw-plugin/slp-device-plugIn/CMakeLists.src
new file mode 100755
index 0000000..04ce4aa
--- /dev/null
+++ b/fw-plugin/slp-device-plugIn/CMakeLists.src
@@ -0,0 +1 @@
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRCS)
diff --git a/fw-plugin/slp-device-plugIn/CMakeLists.sub b/fw-plugin/slp-device-plugIn/CMakeLists.sub
new file mode 100755
index 0000000..d7426f2
--- /dev/null
+++ b/fw-plugin/slp-device-plugIn/CMakeLists.sub
@@ -0,0 +1,37 @@
+#################################################################################
+# THIS FILE IS CREATED AUTOMATICALLY. DO NOT DELETE OR MODIFY THIS FILE.
+#################################################################################
+
+INCLUDE(CMakeLists.src)
+
+## PROJECT NAME
+PROJECT(plugin-di-slp-device C)
+
+## PACKAGE CONFIG
+SET(SLP_PKGCONFIG_LIST "glib-2.0 vconf tapi")
+
+## INCLUDES
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../framework/include)
+
+## DEFINITIONS
+ADD_DEFINITIONS("-DAPP_DIR=\"${CMAKE_INSTALL_PREFIX}\"")
+
+## LIBRARY PATH
+SET(SLP_LD_PATH_FLAGS "")
+
+## LIBRARY
+SET(SLP_LD_FLAGS "")
+
+## DEBUG
+SET(SLP_DEBUG_FLAGS "-g")
+
+## OPTIMIZATION
+SET(SLP_OPT_FLAGS "-O0")
+
+## COMPILER FLAGS
+SET(SLP_COMPILER_FLAGS "-lpthread")
+
+## LINKER FLAGS
+SET(SLP_LINKER_FLAGS "-lpthread")
+
diff --git a/fw-plugin/slp-device-plugIn/CMakeLists.txt b/fw-plugin/slp-device-plugIn/CMakeLists.txt
new file mode 100755
index 0000000..e8541a6
--- /dev/null
+++ b/fw-plugin/slp-device-plugIn/CMakeLists.txt
@@ -0,0 +1,32 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+
+# INCLUDE SUB CMAKELIST FILE
+INCLUDE(CMakeLists.sub)
+
+SET(RESOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/res")
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs_plugin_slp_device REQUIRED ${SLP_PKGCONFIG_LIST})
+
+FOREACH(flag ${pkgs_plugin_slp_device_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+SET(CMAKE_CXX_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+
+ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS})
+
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_plugin_slp_device_LDFLAGS} ${SLP_LD_PATH_FLAGS} ${SLP_LD_FLAGS} ${SLP_LINKER_FLAGS} sync-agent-framework)
+
+# INSTALL
+INSTALL(TARGETS ${PROJECT_NAME} DESTINATION lib)
+#INSTALL(DIRECTORY ${RESOURCE_DIR}/data DESTINATION share)
+
+#added by KTS for install to the system
+#CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY)
+#INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig)
+
+# INCLUDE LAYOUT DIRECTORY
+# ADD_SUBDIRECTORY(layout)
+#ADD_SUBDIRECTORY(res/locale)
diff --git a/fw-plugin/slp-device-plugIn/include/PlugIn_DevExe_Error.h b/fw-plugin/slp-device-plugIn/include/PlugIn_DevExe_Error.h
new file mode 100755
index 0000000..d0e2741
--- /dev/null
+++ b/fw-plugin/slp-device-plugIn/include/PlugIn_DevExe_Error.h
@@ -0,0 +1,66 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ * Sooyi Kim <sooyi.kim@samsung.com>
+ */
+
+#ifndef PLUGIN_DEVEXE_ERROR_H_
+#define PLUGIN_DEVEXE_ERROR_H_
+
+typedef enum {
+
+ EXE_SUCCESS = 1,
+ EXE_DEV_FAIL = -1,
+
+ /* standard error */
+ EXE_DEV_DATA_FAIL = -2,
+ EXE_DEV_OPER_NOT_PERFORMED = -3,
+
+ /* vender specific error */
+
+ /*common */
+ EXE_DEV_AMT_STATUS_OFF = -4,
+ EXEC_DEV_SCREEN_OFF = -5,
+
+ /*wipe */
+ EXE_DEV_WIPE_ALL_FAILED = -10,
+ EXE_DEV_EXTERNAL_MEMORY_FAILED = -11,
+ EXE_DEV_SIM_MEMORY_FAILED = -12,
+
+ /*forwarding */
+ EXE_DEV_FORWORDING_ALL_FAILED = -20,
+ EXE_DEV_FORWORDING_CALL_FAILED = -21,
+ EXE_DEV_FORWORDING_SMS_FAILED = -22
+} SLP_EXE_DEV_ERROR;
+
+#endif /* PLUGIN_DEVEXE_ERROR_H_ */
diff --git a/fw-plugin/slp-device-plugIn/include/slp_device_info.h b/fw-plugin/slp-device-plugIn/include/slp_device_info.h
new file mode 100755
index 0000000..96b2918
--- /dev/null
+++ b/fw-plugin/slp-device-plugIn/include/slp_device_info.h
@@ -0,0 +1,57 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ * Sooyi Kim <sooyi.kim@samsung.com>
+ */
+
+#ifndef SAMSUNG_DEVICE_INFO_H_
+#define SAMSUNG_DEVICE_INFO_H_
+
+char *slp_device_info_get_software_version();
+char *slp_device_info_get_hardware_version();
+char *slp_device_info_get_DTD_version();
+char *slp_device_info_get_modem_version();
+char *slp_device_info_get_kernel_version();
+char *slp_device_info_get_PDA_version();
+char *slp_device_info_get_CSC_version();
+char *__slp_device_info_get_PDA_version_for_fw();
+char *__slp_device_info_get_CSC_version_for_fw();
+
+char *slp_device_info_get_deviceID();
+char *slp_device_info_get_device_type();
+char *slp_device_info_get_manufacturer_info();
+char *slp_device_info_get_Opco_info();
+char *slp_device_info_get_model_info();
+char *slp_device_info_get_OEM_info();
+
+#endif /* SAMSUNG_DEVICE_INFO_H_ */
diff --git a/fw-plugin/slp-device-plugIn/include/slp_ref.h b/fw-plugin/slp-device-plugIn/include/slp_ref.h
new file mode 100755
index 0000000..50c09db
--- /dev/null
+++ b/fw-plugin/slp-device-plugIn/include/slp_ref.h
@@ -0,0 +1,54 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef SLP_REF_H_
+#define SLP_REF_H_
+
+/*
+ * list of device information on SLP
+ */
+
+/*
+ * < OMA DS >
+ * - DevID : device id
+ * - Man : manufacture
+ * - Mod : model id or model number
+ * - SwV : software version
+ * - HwV : hardware version
+ * - OEM : original equipment manufacturer
+ * - DevTyp : device type
+ */
+
+#endif /* SLP_REF_H_ */
diff --git a/fw-plugin/slp-device-plugIn/src/PlugIn_Interface_DevExe.c b/fw-plugin/slp-device-plugIn/src/PlugIn_Interface_DevExe.c
new file mode 100755
index 0000000..572f689
--- /dev/null
+++ b/fw-plugin/slp-device-plugIn/src/PlugIn_Interface_DevExe.c
@@ -0,0 +1,130 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ * Sooyi Kim <sooyi.kim@samsung.com>
+ */
+
+#include "PlugIn_DevExe_Error.h"
+
+#include "agent-framework/Utility/fw_log.h"
+
+#include "agent-framework/Device/EXT_DCI_DevInfo.h"
+
+#include "pmapi.h"
+
+#include "agent-framework/PlugIn/DeviceInfo_Interface.h"
+
+#include "pmapi.h"
+
+#include "agent-framework/PlugIn/DeviceInfo_Interface.h"
+
+#define LOG_TAG "PLUGIN_DEVINFO_SLP"
+
+#define DELTA_FILE "delta_hash.txt"
+
+static unsigned int __convert_pm_state(int state);
+static unsigned int __convert_pm_lock_flag(int flag);
+static unsigned int __convert_pm_unlock_flag(int flag);
+
+int PM_Lock_State(PM_State state, PM_Lock_State_Flag flag, unsigned int timeout)
+{
+ return pm_lock_state(__convert_pm_state(state), __convert_pm_lock_flag(flag), timeout);
+}
+
+int PM_Unlock_State(PM_State state, PM_Unlock_State_Flag flag)
+{
+ return pm_unlock_state(__convert_pm_state(state), __convert_pm_unlock_flag(flag));
+}
+
+static unsigned int __convert_pm_state(int state)
+{
+ unsigned int pm_state = -1;
+
+ switch (state) {
+ case 0:
+ pm_state = LCD_NORMAL;
+ break;
+ case 1:
+ pm_state = LCD_DIM;
+ break;
+ case 2:
+ pm_state = LCD_OFF;
+ break;
+ case 3:
+ pm_state = SUSPEND;
+ break;
+ case 4:
+ pm_state = POWER_OFF;
+ break;
+ case 5:
+ pm_state = LCD_DIM | LCD_OFF | LCD_NORMAL;
+ break;
+ }
+
+ return pm_state;
+}
+
+static unsigned int __convert_pm_lock_flag(int flag)
+{
+ unsigned int pm_flag;
+
+ switch (flag) {
+ case 0:
+ pm_flag = GOTO_STATE_NOW;
+ break;
+ case 1:
+ pm_flag = STAY_CUR_STATE;
+ break;
+ }
+
+ return pm_flag;
+}
+
+static unsigned int __convert_pm_unlock_flag(int flag)
+{
+ unsigned int pm_flag;
+
+ switch (flag) {
+ case 0:
+ pm_flag = PM_SLEEP_MARGIN;
+ break;
+ case 1:
+ pm_flag = PM_RESET_TIMER;
+ break;
+ case 2:
+ pm_flag = PM_KEEP_TIMER;
+ break;
+ }
+
+ return pm_flag;
+}
diff --git a/fw-plugin/slp-device-plugIn/src/PlugIn_Interface_DevInfo.c b/fw-plugin/slp-device-plugIn/src/PlugIn_Interface_DevInfo.c
new file mode 100755
index 0000000..a210cef
--- /dev/null
+++ b/fw-plugin/slp-device-plugIn/src/PlugIn_Interface_DevInfo.c
@@ -0,0 +1,362 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <vconf.h>
+#include <vconf-keys.h>
+
+#include <TapiCommon.h>
+#include <ITapiMisc.h>
+
+#include "slp_device_info.h"
+
+/* for log */
+#include "agent-framework/Utility/fw_log.h"
+
+#include "agent-framework/PlugIn/DeviceInfo_Interface.h"
+
+#define LOG_TAG "PLUGIN_DEVINFO_SLP"
+
+#define IMEI_LEN 5
+#define FW_VERSION_LEN 20
+#define BUFF_SIZE 1000
+
+/* todo : temporary definition */
+#define MAN "Tizen"
+#define MOD "Tizen-v1.0"
+#define HW_VERSION "1.0"
+#define FW_VERSION "1.0"
+#define DTD_VERSION "1.2"
+#define OEM "Tizen"
+#define DEV_TYPE "phone"
+#define DS_DEFAULT_IMEI "000000000000001"
+
+
+typedef struct {
+ char *info_name;
+ char *vconf_key;
+} dici_name_key_map;
+
+dici_name_key_map dev_key_map[] = {
+ {"SwV", VCONFKEY_TELEPHONY_SWVERSION},
+ {"HwV", VCONFKEY_TELEPHONY_HWVERSION},
+ {"Lang", "db/menu_widget/language"},
+ {NULL, NULL},
+};
+
+/*static int find_key(const char *info_name, char *key);*/
+
+int Load_DevInfo(GList **devInfo)
+{
+ FW_LOGV("[devInfo_slp_plugIn] Start !! \n");
+
+ int res = 1;
+
+ *devInfo = NULL;
+
+ int idx = 0;
+ /* get SwV, HwV, Lang */
+ dici_dev_info *info = NULL;
+ while (dev_key_map[idx].info_name != NULL) {
+ info = (dici_dev_info *) malloc(sizeof(dici_dev_info));
+ if (info == 0)
+ return 0;
+
+ memset(info, 0x00, sizeof(dici_dev_info));
+ info->info_name = strdup(dev_key_map[idx].info_name);
+ if (info->info_name == 0)
+ return 0;
+ FW_LOGV("[devInfo_slp_plugIn] info_name : %s\n", info->info_name);
+
+ info->value = strdup(vconf_get_str(dev_key_map[idx].vconf_key));
+ if (info->value == 0)
+ return 0;
+
+ if (!strcmp(info->info_name, "HwV")) {
+ if ((info->value == NULL) || (!strcmp(info->value, "")) || (!strcmp(info->value, "REV__"))) {
+ free(info->value);
+ info->value = strdup(HW_VERSION);
+ }
+ }
+
+ FW_LOGV("[devInfo_slp_plugIn] value : %s\n", info->value);
+ *devInfo = g_list_append(*devInfo, info);
+
+ ++idx;
+ }
+
+ /* get DevID */
+ TelMiscSNIndexType_t type = TAPI_MISC_ME_IMEI;
+ TelMiscSNInformation sn = { 0, };
+ char imei_value[30] = { 0, };
+
+ if (tel_init() != TAPI_API_SUCCESS) {
+ FW_LOGE("tel_init() fail !!");
+ return 0;
+ } else {
+ FW_LOGV("tel_init() success !!");
+ }
+
+ int tapi_res = tel_get_misc_me_sn(type, &sn);
+ if (tapi_res != TAPI_API_SUCCESS) {
+ /* todo : for temporary */
+ FW_LOGE("tel_get_misc_me_sn() fail !!, tapi_res : %d", tapi_res);
+ snprintf(imei_value, sizeof(imei_value), "%s:%s", "IMEI", DS_DEFAULT_IMEI);
+ FW_LOGV("default IMEI : %s", imei_value);
+ } else {
+ FW_LOGV("tel_get_misc_me_sn() success !!");
+ snprintf(imei_value, sizeof(imei_value), "%s:%s", "IMEI", sn.szNumber);
+ FW_LOGV("IMEI length : %d, %s", sn.sn_len, imei_value);
+ }
+
+ dici_dev_info *devId = (dici_dev_info *) malloc(sizeof(dici_dev_info));
+ if (devId == 0)
+ return 0;
+ memset(devId, 0x00, sizeof(dici_dev_info));
+ devId->info_name = strdup("DevID");
+ devId->value = strdup(imei_value);
+ *devInfo = g_list_append(*devInfo, devId);
+
+ tel_deinit();
+
+ FW_LOGV("mdi ============= \n");
+
+ /* get Manufacture */
+ dici_dev_info *man = (dici_dev_info *) malloc(sizeof(dici_dev_info));
+ if (man == 0)
+ return 0;
+ memset(man, 0x00, sizeof(dici_dev_info));
+ man->info_name = strdup("Man");
+ man->value = slp_device_info_get_manufacturer_info();
+ *devInfo = g_list_append(*devInfo, man);
+
+ /* get Model info */
+ dici_dev_info *mod = (dici_dev_info *) malloc(sizeof(dici_dev_info));
+ if (mod == 0)
+ return 0;
+ memset(mod, 0x00, sizeof(dici_dev_info));
+ mod->info_name = strdup("Mod");
+ mod->value = slp_device_info_get_model_info();
+ *devInfo = g_list_append(*devInfo, mod);
+
+ /* get OEM */
+ dici_dev_info *oem = (dici_dev_info *) malloc(sizeof(dici_dev_info));
+ if (oem == 0)
+ return 0;
+ memset(oem, 0x00, sizeof(dici_dev_info));
+ oem->info_name = strdup("OEM");
+ oem->value = slp_device_info_get_OEM_info();
+ *devInfo = g_list_append(*devInfo, oem);
+
+ /* get DevTyp */
+ dici_dev_info *dev_type = (dici_dev_info *) malloc(sizeof(dici_dev_info));
+ if (dev_type == 0)
+ return 0;
+ memset(dev_type, 0x00, sizeof(dici_dev_info));
+ dev_type->info_name = strdup("DevTyp");
+ dev_type->value = slp_device_info_get_device_type();
+ *devInfo = g_list_append(*devInfo, dev_type);
+
+ /* get kernel version */
+ dici_dev_info *kernel_version = (dici_dev_info *) malloc(sizeof(dici_dev_info));
+ if (kernel_version == 0)
+ return 0;
+ memset(kernel_version, 0x00, sizeof(dici_dev_info));
+ kernel_version->info_name = strdup("KernelV");
+ kernel_version->value = slp_device_info_get_kernel_version();
+ *devInfo = g_list_append(*devInfo, kernel_version);
+
+ /* get Modem version */
+ dici_dev_info *modem_version = (dici_dev_info *) malloc(sizeof(dici_dev_info));
+ if (modem_version == 0)
+ return 0;
+ memset(modem_version, 0x00, sizeof(dici_dev_info));
+ modem_version->info_name = strdup("ModemV");
+ modem_version->value = slp_device_info_get_modem_version();
+ *devInfo = g_list_append(*devInfo, modem_version);
+
+ /* get PDA version */
+ dici_dev_info *pda_version = (dici_dev_info *) malloc(sizeof(dici_dev_info));
+ if (pda_version == 0)
+ return 0;
+ memset(pda_version, 0x00, sizeof(dici_dev_info));
+ pda_version->info_name = strdup("PDAV");
+ pda_version->value = slp_device_info_get_PDA_version();
+ *devInfo = g_list_append(*devInfo, pda_version);
+
+ /* get CSC version */
+ dici_dev_info *csc_version = (dici_dev_info *) malloc(sizeof(dici_dev_info));
+ if (csc_version == 0)
+ return 0;
+ memset(csc_version, 0x00, sizeof(dici_dev_info));
+ csc_version->info_name = strdup("CSCV");
+ csc_version->value = slp_device_info_get_CSC_version();
+ *devInfo = g_list_append(*devInfo, csc_version);
+
+ /* get DTD version */
+ dici_dev_info *dtd_version = (dici_dev_info *) malloc(sizeof(dici_dev_info));
+ if (dtd_version == 0)
+ return 0;
+ memset(dtd_version, 0x00, sizeof(dici_dev_info));
+ dtd_version->info_name = strdup("DTDV");
+ dtd_version->value = slp_device_info_get_DTD_version();
+ *devInfo = g_list_append(*devInfo, dtd_version);
+
+ /* get OPCO info */
+ dici_dev_info *opco_info = (dici_dev_info *) malloc(sizeof(dici_dev_info));
+ if (opco_info == 0)
+ return 0;
+ memset(opco_info, 0x00, sizeof(dici_dev_info));
+ opco_info->info_name = strdup("OPCO");
+ opco_info->value = slp_device_info_get_Opco_info();
+ *devInfo = g_list_append(*devInfo, opco_info);
+
+ /* for test */
+ int cnt = 0;
+ GList *iter = NULL;
+ for (iter = *devInfo; iter != NULL; iter = g_list_next(iter)) {
+ FW_LOGV("[devInfo_slp_plugIn] cnt : %d, info_name : %s, value : %s\n", cnt, ((dici_dev_info *) (iter->data))->info_name, ((dici_dev_info *) (iter->data))->value);
+ cnt++;
+ }
+
+ FW_LOGV("[devInfo_slp_plugIn] End !! \n");
+
+ return res;
+}
+
+int Get_DevInfo(GList *devInfo, char *info_name, char **value)
+{
+ FW_LOGV("[devInfo_slp_plugIn] Start !! \n");
+
+ int res = 1;
+ int is_exist = 0;
+ GList *iter = NULL;
+ dici_dev_info *iter_data;
+
+ for (iter = devInfo; iter != NULL; iter = g_list_next(iter)) {
+ iter_data = NULL;
+ iter_data = (dici_dev_info *) (iter->data);
+ if (iter_data->info_name != NULL) {
+ if (!strcmp(iter_data->info_name, info_name)) {
+ if (iter_data->value != NULL) {
+
+ *value = strdup(iter_data->value);
+
+ is_exist = 1;
+ break;
+ } else {
+ FW_LOGV("[devInfo_slp_plugIn] %s value is NULL !!\n", info_name);
+ res = 0;
+ return res;
+ }
+ }
+ }
+ }
+
+ if (is_exist != 1) {
+ FW_LOGV("[devInfo_slp_plugIn] not exist %s information !!\n", info_name);
+ res = -1;
+ return res;
+ }
+
+ FW_LOGV("[devInfo_slp_plugIn] End !! \n");
+
+ return res;
+}
+
+int Clear_DevInfo(GList **devInfo)
+{
+ FW_LOGV("[devInfo_slp_plugIn] Start !! \n");
+
+ int res = 1;
+
+ GList *iter = NULL;
+ dici_dev_info *iter_data;
+
+ if (*devInfo != NULL) {
+ for (iter = *devInfo; iter != NULL;) {
+ iter_data = NULL;
+ iter_data = ((dici_dev_info *) (iter->data));
+ iter = g_list_next(iter);
+ *devInfo = g_list_remove(*devInfo, iter_data);
+
+ if (iter_data != NULL) {
+ if (((dici_dev_info *) (iter_data))->info_name != NULL)
+ free(((dici_dev_info *) (iter_data))->info_name);
+ if (((dici_dev_info *) (iter_data))->value != NULL)
+ free(((dici_dev_info *) (iter_data))->value);
+ free((dici_dev_info *) (iter_data));
+ }
+ }
+
+ g_list_free(*devInfo);
+ }
+
+ FW_LOGV("[devInfo_slp_plugIn] End !! \n");
+
+ return res;
+}
+
+/*static int find_key(const char *info_name, char *key)
+{
+ FW_LOGV("[devInfo_slp_plugIn] Start !! \n");
+
+ int res = 1;
+ int idx = 0;
+
+ while (dev_key_map[idx].info_name != NULL) {
+ if (!strcmp(dev_key_map[idx].info_name, info_name)) {
+ if (dev_key_map[idx].vconf_key != NULL) {
+ key = dev_key_map[idx].vconf_key;
+ break;
+ } else {
+ FW_LOGV("[devInfo_slp_plugIn] vconf_key is NULL ( %s )\n", info_name);
+ res = 0;
+ return res;
+ }
+ }
+
+ ++idx;
+ }
+
+ FW_LOGV("[devInfo_slp_plugIn] vconf_key : %s\n", key);
+
+ FW_LOGV("[devInfo_slp_plugIn] End !! \n");
+
+ return res;
+}*/
diff --git a/fw-plugin/slp-device-plugIn/src/slp_device_info.c b/fw-plugin/slp-device-plugIn/src/slp_device_info.c
new file mode 100755
index 0000000..820e069
--- /dev/null
+++ b/fw-plugin/slp-device-plugIn/src/slp_device_info.c
@@ -0,0 +1,288 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ * Sooyi Kim <sooyi.kim@samsung.com>
+ */
+
+#include "slp_device_info.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/utsname.h>
+#include <vconf.h>
+#include <vconf-keys.h>
+
+/* for log */
+#include "agent-framework/Utility/fw_log.h"
+#define LOG_TAG "SLP_DEVICE_INFO"
+
+#define _D_MSC_FIRMWARE_MAXSTRING_ 40
+#define _D_SIZE_64_ 64
+#define _D_SIZE_128_ 128
+
+/* todo : temporary definition */
+#define SW_VERSION "Tizen-v1.0"
+#define HW_VERSION "Tizen-v1.0"
+#define FW_VERSION "1.0"
+#define DTD_VERSION "1.2"
+#define MODEM_VERSION "M.IXXUI"
+#define PDA_VERSION "P.IXXJI-"
+
+#define MANUFACTURE "Tizen"
+#define MODEL "Tizen-1.0"
+#define OPCO "UK"
+#define OEM "Tizen"
+#define DEV_TYPE "phone"
+
+#define PDA_BIN_VERSION "/usr/etc/info.ini"
+#define CSC_DB_VERSION "/mnt/csc/info.ini"
+#define _D_PDA_BUILD_INFO_MAJOR_ "Major="
+#define _D_PDA_BUILD_INFO_BUILD_ "Build="
+
+#define PDA_VERSION_INFO_FILE "/etc/info.ini"
+
+/* ========================================*/
+/* version information
+ * software version
+ * hardware version
+ * DTD version
+ * modem version
+ * kernel version
+ * PDA version
+ * CSC version
+ * firmware version
+ */
+/* ========================================*/
+char *slp_device_info_get_software_version()
+{
+ char *SW_version = (char *)calloc(_D_SIZE_128_, sizeof(char));
+ /*snprintf(SW_version, _D_SIZE_128_ - 1, SW_VERSION, strlen(SW_VERSION));*/
+ snprintf(SW_version, _D_SIZE_128_ - 1, "%s", SW_VERSION);
+ FW_LOGV("SW version = %s\n", SW_version);
+ return SW_version;
+}
+
+char *slp_device_info_get_hardware_version()
+{
+ char *HW_version = (char *)calloc(_D_SIZE_128_, sizeof(char));
+ /*snprintf(HW_version, _D_SIZE_128_ - 1, HW_VERSION, strlen(HW_VERSION));*/
+ snprintf(HW_version, _D_SIZE_128_ - 1, "%s", HW_VERSION);
+ FW_LOGV("HW version = %s\n", HW_version);
+ return HW_version;
+}
+
+char *slp_device_info_get_DTD_version()
+{
+ char *dtd_version = (char *)calloc(_D_SIZE_128_, sizeof(char));
+ /*snprintf(dtd_version, _D_SIZE_128_ - 1, DTD_VERSION, strlen(DTD_VERSION));*/
+ snprintf(dtd_version, _D_SIZE_128_ - 1, "%s", DTD_VERSION);
+ FW_LOGV("DTD version = %s\n", dtd_version);
+ return dtd_version;
+}
+
+char *slp_device_info_get_modem_version()
+{
+ char *get_str;
+ char str_key_name[_D_SIZE_128_ * 2] = { 0, };
+ snprintf(str_key_name, _D_SIZE_128_ * 2, "%s", VCONFKEY_TELEPHONY_SWVERSION);
+ get_str = vconf_get_str(str_key_name);
+ FW_LOGV("Modem version = %s\n", get_str);
+ return get_str;
+}
+
+char *slp_device_info_get_kernel_version()
+{
+ char *KernelVersion = (char *)calloc(_D_SIZE_128_, sizeof(char));
+
+ struct utsname buf;
+ uname(&buf);
+
+ snprintf(KernelVersion, _D_SIZE_128_ - 1, "%s.%s", "K", buf.release);
+
+ FW_LOGV("sysname[%s], nodename[%s], release[%s], version[%s], machine[%s] \n", buf.sysname, buf.nodename, buf.release, buf.version, buf.machine);
+ return KernelVersion;
+}
+
+char *slp_device_info_get_PDA_version()
+{
+ char *PDAVersion = (char *)calloc(_D_SIZE_128_, sizeof(char));
+ FILE *file_des;
+ file_des = fopen(PDA_BIN_VERSION, "rb");
+ int i = 0;
+
+ if (file_des == NULL) {
+ FW_LOGV("fopen fail - info.ini \n");
+ snprintf(PDAVersion, _D_SIZE_128_ / 2, "%s", PDA_VERSION);
+ return 0;
+ }
+
+ while (!feof(file_des)) {
+ char info_temp[20] = { 0, };
+ int result = 1;
+ fseek(file_des, i, SEEK_SET);
+ i++;
+
+ fread(info_temp, sizeof(char), strlen(_D_PDA_BUILD_INFO_BUILD_), file_des); /* 2011/10/05 SCM request _D_PDA_BUILD_INFO_MAJOR_ -> _D_PDA_BUILD_INFO_BUILD_ */
+ result = memcmp(info_temp, _D_PDA_BUILD_INFO_BUILD_, strlen(_D_PDA_BUILD_INFO_BUILD_));
+ if (!result) {
+ char PDAVersion_check[64] = { 0 };
+ int read_pos = 0;
+ while (!feof(file_des)) {
+ fread(PDAVersion_check + read_pos, sizeof(char), 1, file_des);
+ if (PDAVersion_check[read_pos] == '_')
+ PDAVersion_check[read_pos] = '-';
+ else if (PDAVersion_check[read_pos] == '\n')
+ break;
+ else if (PDAVersion_check[read_pos] == ';') {
+ /*PDAVersion_check[read_pos] = NULL;*/
+ PDAVersion_check[read_pos] = 0;
+ break;
+ }
+ read_pos++;
+ }
+
+ snprintf(PDAVersion, _D_SIZE_128_ / 2, "%s", PDAVersion_check);
+ FW_LOGV("fread PDAVersion - [%s]\n", PDAVersion);
+ break;
+ }
+ }
+
+ if (file_des != NULL)
+ fclose(file_des);
+
+ return PDAVersion;
+}
+
+char *slp_device_info_get_CSC_version()
+{
+ char *CSCVersion = (char *)calloc(_D_SIZE_128_, sizeof(char));
+
+ FILE *file_des;
+ file_des = fopen(CSC_DB_VERSION, "rb");
+ int i = 0;
+ if (file_des == NULL) {
+ FW_LOGV("fopen fail - info.ini \n");
+ snprintf(CSCVersion, _D_SIZE_128_ / 2, "%s", "C.");
+ return 0;
+ }
+ while (!feof(file_des)) {
+ char info_temp[20] = { 0, };
+ int result = 1;
+ fseek(file_des, i, SEEK_SET);
+ i++;
+
+ fread(info_temp, sizeof(char), strlen(_D_PDA_BUILD_INFO_BUILD_), file_des); /* 2011/10/05 SCM request _D_PDA_BUILD_INFO_MAJOR_ -> _D_PDA_BUILD_INFO_BUILD_ */
+ result = memcmp(info_temp, _D_PDA_BUILD_INFO_BUILD_, strlen(_D_PDA_BUILD_INFO_BUILD_));
+ if (!result) {
+ char CSCVersion_check[64] = { 0 };
+ int read_pos = 0;
+ while (!feof(file_des)) {
+ fread(CSCVersion_check + read_pos, sizeof(char), 1, file_des);
+ if (CSCVersion_check[read_pos] == '_')
+ CSCVersion_check[read_pos] = '-';
+ else if (CSCVersion_check[read_pos] == '\n')
+ break;
+ else if (CSCVersion_check[read_pos] == ';') {
+ /*CSCVersion_check[read_pos] = NULL;*/
+ CSCVersion_check[read_pos] = 0;
+ break;
+ }
+ read_pos++;
+ }
+
+ snprintf(CSCVersion, _D_SIZE_128_ / 2, "%s", CSCVersion_check);
+ FW_LOGV("fread CSCVersion - [%s]\n", CSCVersion);
+ break;
+ }
+ }
+
+ if (file_des != NULL)
+ fclose(file_des);
+
+ return CSCVersion;
+}
+
+/* ====================================
+ * device etc information
+ * =====================================*/
+char *slp_device_info_get_device_type()
+{
+ char *dev_type = (char *)calloc(_D_SIZE_128_, sizeof(char));
+ snprintf(dev_type, _D_SIZE_128_ - 1, "%s", DEV_TYPE);
+ FW_LOGV("Device Type = %s\n", DEV_TYPE);
+ return dev_type;
+}
+
+char *slp_device_info_get_deviceID()
+{
+ char *DeviceID = (char *)calloc(_D_SIZE_128_, sizeof(char));
+ if (vconf_get_str(VCONFKEY_TELEPHONY_IMEI) != NULL)
+ snprintf(DeviceID, _D_SIZE_128_ - 1, "IMEI:%s", vconf_get_str(VCONFKEY_TELEPHONY_IMEI));
+ else
+ snprintf(DeviceID, _D_SIZE_128_ - 1, "IMEI:%s", "355310046608752");
+ return DeviceID;
+}
+
+char *slp_device_info_get_Opco_info()
+{
+ char *OpcoInfo = (char *)calloc(_D_SIZE_128_, sizeof(char));
+ snprintf(OpcoInfo, _D_SIZE_128_ - 1, "%s", OPCO);
+ FW_LOGV("Opco Info = %s\n", OpcoInfo);
+ return OpcoInfo; /* prevent */
+}
+
+char *slp_device_info_get_model_info()
+{
+ char *ModelInfo = (char *)calloc(_D_SIZE_128_, sizeof(char));
+ snprintf(ModelInfo, _D_SIZE_128_ - 1, "%s", MODEL);
+ FW_LOGV("Model info = %s\n", ModelInfo);
+ return ModelInfo; /* prevent */
+}
+
+char *slp_device_info_get_manufacturer_info()
+{
+ char *ManufacturerInfo = (char *)calloc(_D_SIZE_128_, sizeof(char));
+ snprintf(ManufacturerInfo, _D_SIZE_128_ - 1, "%s", MANUFACTURE); /* prevent */
+
+ FW_LOGV("Manufacturer = %s\n", MANUFACTURE);
+ return ManufacturerInfo;
+}
+
+char *slp_device_info_get_OEM_info()
+{
+ char *oem_info = (char *)calloc(_D_SIZE_128_, sizeof(char));
+ snprintf(oem_info, _D_SIZE_128_ - 1, "%s", OEM);
+
+ FW_LOGV("OEM = %s\n", OEM);
+ return oem_info;
+}
diff --git a/fw-plugin/slp-sysnoti-plugIn/.cproject b/fw-plugin/slp-sysnoti-plugIn/.cproject
new file mode 100755
index 0000000..8801bdc
--- /dev/null
+++ b/fw-plugin/slp-sysnoti-plugIn/.cproject
@@ -0,0 +1,293 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?>
+
+<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="0.2065504086">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.2065504086" moduleId="org.eclipse.cdt.core.settings" name="Default">
+ <externalSettings/>
+ <extensions>
+ <extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration buildProperties="" description="" id="0.2065504086" name="Default" parent="org.eclipse.cdt.build.core.prefbase.cfg">
+ <folderInfo id="0.2065504086." name="/" resourcePath="">
+ <toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.238681826" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
+ <targetPlatform id="org.eclipse.cdt.build.core.prefbase.toolchain.238681826.106902732" name=""/>
+ <builder id="org.eclipse.cdt.build.core.settings.default.builder.127171291" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
+ <tool id="org.eclipse.cdt.build.core.settings.holder.libs.569075878" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
+ <tool id="org.eclipse.cdt.build.core.settings.holder.748471845" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
+ <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.2861205" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
+ </tool>
+ <tool id="org.eclipse.cdt.build.core.settings.holder.1395063964" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
+ <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1609509888" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
+ </tool>
+ <tool id="org.eclipse.cdt.build.core.settings.holder.163556033" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
+ <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1632894964" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
+ </tool>
+ </toolChain>
+ </folderInfo>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <scannerConfigBuildInfo instanceId="0.2065504086">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ <scannerConfigBuildInfo instanceId="0.297934327">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ </cconfiguration>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <project id="slp-sysnoti-plugIn.null.854469853" name="slp-sysnoti-plugIn"/>
+ </storageModule>
+</cproject>
diff --git a/fw-plugin/slp-sysnoti-plugIn/.project b/fw-plugin/slp-sysnoti-plugIn/.project
new file mode 100755
index 0000000..14bf91f
--- /dev/null
+++ b/fw-plugin/slp-sysnoti-plugIn/.project
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>slp-sysnoti-plugIn</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+ <triggers>clean,full,incremental,</triggers>
+ <arguments>
+ <dictionary>
+ <key>?name?</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.append_environment</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildArguments</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.contents</key>
+ <value>org.eclipse.cdt.make.core.activeConfigSettings</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>false</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.samsung.slp2.SboxBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>com.samsung.slp2.SboxBuilder.needConfigure</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;com.samsung.limo.SboxGCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.append_environment</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.arguments</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.command</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.auto</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.clean</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.inc</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.environment</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>com.samsung.slp2.cnature</nature>
+ <nature>org.eclipse.cdt.core.ccnature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
diff --git a/fw-plugin/slp-sysnoti-plugIn/CMakeLists.src b/fw-plugin/slp-sysnoti-plugIn/CMakeLists.src
new file mode 100755
index 0000000..04ce4aa
--- /dev/null
+++ b/fw-plugin/slp-sysnoti-plugIn/CMakeLists.src
@@ -0,0 +1 @@
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRCS)
diff --git a/fw-plugin/slp-sysnoti-plugIn/CMakeLists.sub b/fw-plugin/slp-sysnoti-plugIn/CMakeLists.sub
new file mode 100755
index 0000000..f0c145b
--- /dev/null
+++ b/fw-plugin/slp-sysnoti-plugIn/CMakeLists.sub
@@ -0,0 +1,37 @@
+#################################################################################
+# THIS FILE IS CREATED AUTOMATICALLY. DO NOT DELETE OR MODIFY THIS FILE.
+#################################################################################
+
+INCLUDE(CMakeLists.src)
+
+## PROJECT NAME
+PROJECT(plugin-pm-slp-sysnoti C)
+
+## PACKAGE CONFIG
+SET(SLP_PKGCONFIG_LIST "glib-2.0 vconf alarm-service msg-service")
+
+## INCLUDES
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../framework/include)
+
+## DEFINITIONS
+ADD_DEFINITIONS("-DAPP_DIR=\"${CMAKE_INSTALL_PREFIX}\"")
+
+## LIBRARY PATH
+SET(SLP_LD_PATH_FLAGS "")
+
+## LIBRARY
+SET(SLP_LD_FLAGS "")
+
+## DEBUG
+SET(SLP_DEBUG_FLAGS "-g")
+
+## OPTIMIZATION
+SET(SLP_OPT_FLAGS "-O0")
+
+## COMPILER FLAGS
+SET(SLP_COMPILER_FLAGS "-lpthread")
+
+## LINKER FLAGS
+SET(SLP_LINKER_FLAGS "-lpthread")
+
diff --git a/fw-plugin/slp-sysnoti-plugIn/CMakeLists.txt b/fw-plugin/slp-sysnoti-plugIn/CMakeLists.txt
new file mode 100755
index 0000000..3a2fc56
--- /dev/null
+++ b/fw-plugin/slp-sysnoti-plugIn/CMakeLists.txt
@@ -0,0 +1,32 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+
+# INCLUDE SUB CMAKELIST FILE
+INCLUDE(CMakeLists.sub)
+
+SET(RESOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/res")
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs_plugin_slp_sysnoti REQUIRED ${SLP_PKGCONFIG_LIST})
+
+FOREACH(flag ${pkgs_plugin_slp_sysnoti_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+SET(CMAKE_CXX_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+
+ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS})
+
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_plugin_slp_sysnoti_LDFLAGS} ${SLP_LD_PATH_FLAGS} ${SLP_LD_FLAGS} ${SLP_LINKER_FLAGS} sync-agent-framework)
+
+# INSTALL
+INSTALL(TARGETS ${PROJECT_NAME} DESTINATION lib)
+#INSTALL(DIRECTORY ${RESOURCE_DIR}/data DESTINATION share)
+
+#added by KTS for install to the system
+#CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY)
+#INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig)
+
+# INCLUDE LAYOUT DIRECTORY
+# ADD_SUBDIRECTORY(layout)
+#ADD_SUBDIRECTORY(res/locale)
diff --git a/fw-plugin/slp-sysnoti-plugIn/include/SLP_Alarm.h b/fw-plugin/slp-sysnoti-plugIn/include/SLP_Alarm.h
new file mode 100755
index 0000000..de3cccf
--- /dev/null
+++ b/fw-plugin/slp-sysnoti-plugIn/include/SLP_Alarm.h
@@ -0,0 +1,51 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef SLP_ALARM_H_
+#define SLP_ALARM_H_
+
+int init_alarm(const char *pkg_name);
+
+int set_alarm_callback(void *callback);
+
+int destory_alarm();
+
+int add_alarm(void *add_item, int *out_add_item_id);
+
+int remove_alarm(int remove_item_id);
+
+int get_alarm(int get_item_id, void **out_item);
+
+#endif /* SLP_ALARM_H_ */
diff --git a/fw-plugin/slp-sysnoti-plugIn/include/SLP_CallBack.h b/fw-plugin/slp-sysnoti-plugIn/include/SLP_CallBack.h
new file mode 100644
index 0000000..ccc76cb
--- /dev/null
+++ b/fw-plugin/slp-sysnoti-plugIn/include/SLP_CallBack.h
@@ -0,0 +1,70 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef SLP_CALLBACK_H_
+#define SLP_CALLBACK_H_
+
+#include "agent-framework/PlugIn/PlatformMonitor_Interface.h"
+
+void setCallBack_NetworkStatus(CALLBACK_NETWORK_STATUS callback);
+
+void setCallBack_NetworkAllCancel(CALLBACK_NETWORK_CANCEL callback);
+
+void setCallBack_Syncml_SAN_Incoming(CALLBACK_SYNCML_SAN_INCOMING callback);
+
+void setCallBack_Syncml_SAN_Operation(CALLBACK_SYNCML_SAN_OPERATION callback);
+
+void setCallBack_Alarm(CALLBACK_ALARM callback);
+
+void setCallBack_Network_On(CALLBACK_NETWORK_ON callback);
+
+void setCallBack_Network_Off(CALLBACK_NETWORK_OFF callback);
+
+/* for network */
+void network_status_callback_fn(int protocol_type);
+
+void network_cancel_callback_fn(int protocol_type);
+
+/* for syncml san */
+void syncml_san_incoming_callback_fn(int item_id, void *user_data);
+
+void syncml_san_operation_callback_fn(int item_id, void *user_data);
+
+/* for service-agent network */
+void network_on_callback_fn(int item_id, void *user_data);
+
+void network_off_callback_fn(int item_id, void *user_data);
+
+#endif /* SLP_CALLBACK_H_ */
diff --git a/fw-plugin/slp-sysnoti-plugIn/include/SLP_ConnManager.h b/fw-plugin/slp-sysnoti-plugIn/include/SLP_ConnManager.h
new file mode 100755
index 0000000..72b8f70
--- /dev/null
+++ b/fw-plugin/slp-sysnoti-plugIn/include/SLP_ConnManager.h
@@ -0,0 +1,61 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef SLP_CONNMANAGER_H_
+#define SLP_CONNMANAGER_H_
+
+#include <glib.h>
+#include "vconf-keys.h"
+#include "vconf.h"
+
+/*
+ * @brief check current network status
+ * @return operation result
+ * @retval 1 network is available
+ * @retval 0 network is unavailable
+ */
+int check_network();
+
+void network_connection_cb(keynode_t *node, void *data);
+void network_configuration_handler(keynode_t *node, void *data);
+void init_network();
+
+int get_net_status();
+int get_net_type();
+
+char *get_ConnMan_proxy();
+char *get_ConnMan_ip();
+
+#endif /* SLP_CONNMANAGER_H_ */
diff --git a/fw-plugin/slp-sysnoti-plugIn/include/SLP_SAN.h b/fw-plugin/slp-sysnoti-plugIn/include/SLP_SAN.h
new file mode 100755
index 0000000..39e7795
--- /dev/null
+++ b/fw-plugin/slp-sysnoti-plugIn/include/SLP_SAN.h
@@ -0,0 +1,52 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef SLP_SAN_H_
+#define SLP_SAN_H_
+
+typedef enum {
+ SAN_VERSION_11 = 11,
+ SAN_VERSION_12 = 12,
+} PM_SAN_VERSION;
+
+int start_san();
+
+int end_san();
+
+int add_san_message(void *add_item);
+
+int remove_san_message(int remove_item_id);
+
+#endif /* SLP_SAN_H_ */
diff --git a/fw-plugin/slp-sysnoti-plugIn/src/PlugIn_Interface.c b/fw-plugin/slp-sysnoti-plugIn/src/PlugIn_Interface.c
new file mode 100755
index 0000000..6db129a
--- /dev/null
+++ b/fw-plugin/slp-sysnoti-plugIn/src/PlugIn_Interface.c
@@ -0,0 +1,319 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#include <glib.h>
+#include <stdlib.h>
+#include <glib-object.h>
+#include "vconf-keys.h"
+#include "vconf.h"
+
+#include "agent-framework/PlugIn/PlatformMonitor_Interface.h"
+
+#include "SLP_CallBack.h"
+
+#include "SLP_ConnManager.h"
+
+/* for alarm service */
+#include "SLP_Alarm.h"
+
+/* for SAN noti */
+#include "SLP_SAN.h"
+
+/* for log */
+#include "agent-framework/Utility/fw_log.h"
+
+#define LOG_TAG "PLUGIN_PM_SLP"
+
+static int __register_network_fw_internal_callback();
+
+void Init_Network_Status_Noti_Handler(void *data)
+{
+ FW_LOGV("[pm_slp_sysnoti_plugIn] Start !!");
+
+ g_type_init();
+ g_thread_init(NULL);
+ init_network();
+
+ int res = 1;
+
+ network_status_callback_fn(1);
+
+ res = __register_network_fw_internal_callback();
+ if (res != 1) {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] __register_network_fw_callback() fail !!");
+ } else {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] __register_network_fw_callback() success !!");
+ }
+
+ FW_LOGV("[pm_slp_sysnoti_plugIn] End !!");
+}
+
+int Terminate_Network_Status_Noti_Handler()
+{
+ FW_LOGV("[pm_slp_sysnoti_plugIn] Start !!");
+
+ int res = 1;
+
+ res = vconf_ignore_key_changed(VCONFKEY_NETWORK_STATUS, network_connection_cb);
+ if (res < 0) {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] vconf_ignore_key_changed ( VCONFKEY_NETWORK_STATUS ) fail !!");
+ return res;
+ } else {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] vconf_ignore_key_changed ( VCONFKEY_NETWORK_STATUS ) success !!");
+ res = 1;
+ }
+
+ res = vconf_ignore_key_changed(VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND, network_configuration_handler);
+ if (res < 0) {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] vconf_ignore_key_changed ( VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND ) fail !!");
+ return res;
+ } else {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] vconf_ignore_key_changed ( VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND ) success !!");
+ res = 1;
+ }
+
+ FW_LOGV("[pm_slp_sysnoti_plugIn] End !!");
+
+ return res;
+}
+
+void Init_Syncml_SAN_Noti_Handler(void *data)
+{
+ FW_LOGV("[pm_slp_sysnoti_plugIn] Start !!");
+
+ int res = 0;
+
+ res = start_san();
+
+ if (res != 1) {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] start_san() fail !!");
+ } else {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] start_san() success !!");
+ }
+
+ FW_LOGV("[pm_slp_sysnoti_plugIn] End !!");
+}
+
+int Terminate_Syncml_SAN_Noti_Handler()
+{
+ FW_LOGV("[pm_slp_sysnoti_plugIn] Start !!");
+
+ int res = 0;
+
+ res = end_san();
+
+ if (res != 1) {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] end_san() fail !!");
+ return res;
+ } else {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] end_san() success !!");
+ }
+
+ FW_LOGV("[pm_slp_sysnoti_plugIn] End !!");
+
+ return res;
+}
+
+int Add_Message(void *add_item)
+{
+ FW_LOGV("[pm_slp_sysnoti_plugIn] Start!!");
+
+ int res = 0;
+
+ res = add_san_message(add_item);
+
+ if (res != 1) {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] add_san_message() fail !!");
+ return res;
+ } else {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] add_san_message() success !!");
+ }
+
+ FW_LOGV("[pm_slp_sysnoti_plugIn] End !!");
+
+ return res;
+}
+
+int Remove_Message(int remove_item_id)
+{
+ FW_LOGV("[pm_slp_sysnoti_plugIn] Start!!");
+
+ int res = 0;
+
+ res = remove_san_message(remove_item_id);
+
+ if (res != 1) {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] remove_san_message() fail !!");
+ return res;
+ } else {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] remove_san_message() success !!");
+ }
+
+ FW_LOGV("[pm_slp_sysnoti_plugIn] End !!");
+
+ return res;
+}
+
+void Init_Alarm_Noti_Handler(void *data)
+{
+ FW_LOGV("[pm_slp_sysnoti_plugIn] Start!!");
+
+ pm_register_data_t *reg_data = (pm_register_data_t *) data;
+ if (reg_data == NULL) {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] data is NULL !!");
+ goto free_part;
+ }
+
+ FW_LOGV("pkg_name : %s", reg_data->pkg_name);
+ int ret = init_alarm(reg_data->pkg_name);
+ if (ret != 1) {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] init_alarm() fail !!");
+ } else {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] init_alarm() success !!");
+ }
+
+free_part:
+ if (reg_data != NULL) {
+ if (reg_data->pkg_name != NULL)
+ free(reg_data->pkg_name);
+
+ free(reg_data);
+
+ FW_LOGV("free pm_register_data_t !!");
+ }
+
+ FW_LOGV("[pm_slp_sysnoti_plugIn] End!!");
+}
+
+int Terminate_Alarm_Noti_Handler()
+{
+ FW_LOGV("[pm_slp_sysnoti_plugIn] Start!!");
+ int ret = destory_alarm();
+ FW_LOGV("[pm_slp_sysnoti_plugIn] End!!");
+
+ return ret;
+}
+
+int Add_Alarm(void *add_item, int *out_add_item_id)
+{
+ FW_LOGV("[pm_slp_sysnoti_plugIn] Start!!");
+ int ret = add_alarm(add_item, out_add_item_id);
+ FW_LOGV("[pm_slp_sysnoti_plugIn] End!!");
+
+ return ret;
+}
+
+int Remove_Alarm(int remove_item_id)
+{
+ FW_LOGV("[pm_slp_sysnoti_plugIn] Start!!");
+ int ret = remove_alarm(remove_item_id);
+ FW_LOGV("[pm_slp_sysnoti_plugIn] End!!");
+
+ return ret;
+}
+
+int Get_Alarm(int get_item_id, void **out_get_item)
+{
+ FW_LOGV("[pm_slp_sysnoti_plugIn] Start!!");
+ int ret = get_alarm(get_item_id, out_get_item);
+ FW_LOGV("[pm_slp_sysnoti_plugIn] End!!");
+
+ return ret;
+}
+
+void SetCallBack_NetworkStatus(CALLBACK_NETWORK_STATUS callback)
+{
+ setCallBack_NetworkStatus(callback);
+}
+
+void SetCallBack_NetworkAllCancel(CALLBACK_NETWORK_CANCEL callback)
+{
+ setCallBack_NetworkAllCancel(callback);
+}
+
+void SetCallBack_Syncml_SAN_Incoming(CALLBACK_SYNCML_SAN_INCOMING callback)
+{
+ setCallBack_Syncml_SAN_Incoming(callback);
+}
+
+void SetCallBack_Syncml_SAN_Operation(CALLBACK_SYNCML_SAN_OPERATION callback)
+{
+ setCallBack_Syncml_SAN_Operation(callback);
+}
+
+void SetCallBack_Alarm(CALLBACK_ALARM callback)
+{
+ setCallBack_Alarm(callback);
+ set_alarm_callback(callback);
+}
+
+void SetCallBack_Network_On(CALLBACK_NETWORK_ON callback)
+{
+ setCallBack_Network_On(callback);
+}
+
+void SetCallBack_Network_Off(CALLBACK_NETWORK_OFF callback)
+{
+ setCallBack_Network_Off(callback);
+}
+
+static int __register_network_fw_internal_callback()
+{
+ FW_LOGV("[pm_slp_sysnoti_plugIn] Start !!");
+
+ int res = 1;
+
+ res = vconf_notify_key_changed(VCONFKEY_NETWORK_STATUS, network_connection_cb, NULL);
+ if (res < 0) {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] vconf_notify_key_changed ( VCONFKEY_NETWORK_STATUS ) fail !!");
+ return res;
+ } else {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] vconf_notify_key_changed ( VCONFKEY_NETWORK_STATUS ) success !!");
+ res = 1;
+ }
+
+ res = vconf_notify_key_changed(VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND, network_configuration_handler, NULL);
+ if (res < 0) {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] vconf_notify_key_changed ( VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND ) fail !!");
+ return res;
+ } else {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] vconf_notify_key_changed ( VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND ) success !!");
+ res = 1;
+ }
+
+ FW_LOGV("[pm_slp_sysnoti_plugIn] End !!");
+
+ return res;
+}
diff --git a/fw-plugin/slp-sysnoti-plugIn/src/SLP_Alarm.c b/fw-plugin/slp-sysnoti-plugIn/src/SLP_Alarm.c
new file mode 100755
index 0000000..898bb90
--- /dev/null
+++ b/fw-plugin/slp-sysnoti-plugIn/src/SLP_Alarm.c
@@ -0,0 +1,449 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+#include <glib.h>
+#include <glib/gprintf.h>
+#include <stdlib.h>
+#include <string.h>
+#include "SLP_Alarm.h"
+
+#include "SLP_CallBack.h"
+
+#include "agent-framework/PlatformMonitor/EXT_PMCI_Struct.h"
+#include <alarm.h>
+
+/* for log */
+#include "agent-framework/Utility/fw_log.h"
+#define LOG_TAG "PLUGIN_PM_SLP_ALARM"
+
+static int __convert_service_time(char *temp_time, alarm_date_t *out_time);
+static int __convert_fw_time(alarm_date_t *temp_time, char **out_time);
+
+int init_alarm(const char *pkg_name)
+{
+ int result = alarmmgr_init(pkg_name);
+ if (result != ALARMMGR_RESULT_SUCCESS) {
+ FW_LOGV("alarmmgr_init Fail: err_code = %d\n", result);
+ return 0;
+ } else {
+ FW_LOGV("alarmmgr_init Success\n");
+ return 1;
+ }
+
+ return 0;
+}
+
+int set_alarm_callback(void *callback)
+{
+ int result = alarmmgr_set_cb(callback, 0);
+ if (result != ALARMMGR_RESULT_SUCCESS) {
+ FW_LOGV("alarmmgr_set_cb Fail: err_code = %d\n", result);
+ return 0;
+ } else {
+ FW_LOGV("alarmmgr_set_cb Success\n");
+ return 1;
+ }
+
+ return 0;
+}
+
+int destory_alarm()
+{
+ /* not support destory alarm api */
+ FW_LOGV("not support destory alarm api");
+ return 0;
+}
+
+int add_alarm(void *add_item, int *out_add_item_id)
+{
+ FW_LOGV("Start!!");
+ int err = 0;
+ pmci_alarm_t *temp_add_item = (pmci_alarm_t *) add_item;
+ if (temp_add_item == 0)
+ goto return_part;
+
+ /* allocate service alarm struct */
+ alarm_entry_t *service_add_item = 0;
+ service_add_item = alarmmgr_create_alarm();
+ if (service_add_item == 0)
+ goto return_part;
+
+ /* convert fw struct to service struct */
+
+ /* setting start alarm time */
+ if (temp_add_item->start_alarm_time != 0) {
+
+ alarm_date_t expire_time;
+ memset(&expire_time, 0x00, sizeof(alarm_date_t));
+ err = __convert_service_time(temp_add_item->start_alarm_time, &expire_time);
+ if (err != 1)
+ FW_LOGE("__convert_alarm_time() Fail: %d", err);
+
+ err = alarmmgr_set_time(service_add_item, expire_time);
+ if (err != ALARMMGR_RESULT_SUCCESS)
+ FW_LOGE("alarmmgr_set_time() Fail: %d", err);
+ }
+
+ /* setting repeat mode and repeat value */
+ alarm_repeat_mode_t repeat_mode = 0;
+ if (temp_add_item->repeat_type != REPEAT_NO_TYPE) {
+ switch (temp_add_item->repeat_type) {
+ case ONCE:
+ repeat_mode = ALARM_REPEAT_MODE_ONCE;
+ break;
+ case REPEAT:
+ repeat_mode = ALARM_REPEAT_MODE_REPEAT;
+ break;
+ case REPEAT_WEEKLY:
+ repeat_mode = ALARM_REPEAT_MODE_WEEKLY;
+ break;
+ case REPEAT_MONTHLY:
+ repeat_mode = ALARM_REPEAT_MODE_MONTHLY;
+ break;
+ case REPEAT_ANNUALLY:
+ repeat_mode = ALARM_REPEAT_MODE_ANNUALLY;
+ break;
+ default:
+ break;
+ }
+ }
+
+ alarm_day_of_week_t repeat_value = 0;
+ if (temp_add_item->repeat_value != DAY_NO_TYPE) {
+ switch (temp_add_item->repeat_type) {
+ case ONCE:
+ case REPEAT:
+ {
+ repeat_value = temp_add_item->repeat_value;
+ }
+ break;
+ case REPEAT_ANNUALLY:
+ case REPEAT_MONTHLY:
+ case REPEAT_WEEKLY:
+ {
+ int tmp;
+ int num = 1;
+
+ int i;
+ for (i = 1; i <= DAY_CNT; i++) {
+ tmp = (temp_add_item->repeat_value >> i);
+ switch (tmp) {
+ case DAY_SUN:
+ repeat_value |= ALARM_WDAY_SUNDAY;
+ break;
+ case DAY_MON:
+ repeat_value |= ALARM_WDAY_MONDAY;
+ break;
+ case DAY_TUE:
+ repeat_value |= ALARM_WDAY_TUESDAY;
+ break;
+ case DAY_WED:
+ repeat_value |= ALARM_WDAY_WEDNESDAY;
+ break;
+ case DAY_THU:
+ repeat_value |= ALARM_WDAY_THURSDAY;
+ break;
+ case DAY_FRI:
+ repeat_value |= ALARM_WDAY_FRIDAY;
+ break;
+ case DAY_SAT:
+ repeat_value |= ALARM_WDAY_SATURDAY;
+ break;
+ default:
+ break;
+ }
+
+ num *= 2;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ err = alarmmgr_set_repeat_mode(service_add_item, repeat_mode, repeat_value);
+ if (err != ALARMMGR_RESULT_SUCCESS)
+ FW_LOGE("alarmmgr_set_repeat_mode() Fail: %d", err);
+
+ /* set alarm type */
+ int alarm_type = 0;
+ if (temp_add_item->isDisposable != 0) {
+ alarm_type = ALARM_TYPE_VOLATILE;
+ } else {
+ alarm_type = ALARM_TYPE_DEFAULT;
+ }
+
+ err = alarmmgr_set_type(service_add_item, alarm_type);
+ if (err != ALARMMGR_RESULT_SUCCESS)
+ FW_LOGE("alarmmgr_set_type() Fail: %d", err);
+
+ /* insert add alarm item */
+ int alarm_id = 0;
+ int result = alarmmgr_add_alarm_with_localtime(service_add_item, 0, &alarm_id);
+ if (result != ALARMMGR_RESULT_SUCCESS) {
+ FW_LOGV("alarmmgr_add_alarm Fail: err_code = %d\n", result);
+ err = 0;
+ } else {
+ FW_LOGV("alarmmgr_add_alarm Success : alarm_id = %d\n", alarm_id);
+ *out_add_item_id = alarm_id;
+ err = 1;
+ }
+
+ if (service_add_item != 0)
+ alarmmgr_free_alarm(service_add_item);
+
+return_part:
+
+ FW_LOGV("End!!");
+ return err;
+}
+
+int remove_alarm(int remove_item_id)
+{
+ int result = alarmmgr_remove_alarm(remove_item_id);
+ if (result != ALARMMGR_RESULT_SUCCESS) {
+ FW_LOGV("alarmmgr_remove_alarm Fail: err_code = %d\n", result);
+ return 0;
+ } else {
+ FW_LOGV("alarmmgr_remove_alarm Success\n");
+ return 1;
+ }
+
+ return 0;
+}
+
+int get_alarm(int get_item_id, void **out_item)
+{
+ alarm_entry_t *alarm = alarmmgr_create_alarm();
+ int result = alarmmgr_get_info(get_item_id, alarm);
+ if (result != ALARMMGR_RESULT_SUCCESS) {
+ FW_LOGV("alarmmgr_get_info Fail: err_code = %d\n", result);
+ return 0;
+ }
+
+ /* converting */
+ pmci_alarm_t *agent_alarm_info = (pmci_alarm_t *) calloc(1, sizeof(pmci_alarm_t));
+
+ int alarm_type = 0;
+ result = alarmmgr_get_type(alarm, &alarm_type);
+ if (result != ALARMMGR_RESULT_SUCCESS) {
+ FW_LOGV("alarmmgr_get_type Fail: err_code = %d\n", result);
+ return 0;
+ }
+ FW_LOGV("alarm_type = %d", alarm_type);
+ if (alarm_type == ALARM_TYPE_DEFAULT) {
+ agent_alarm_info->isDisposable = false;
+ } else {
+ agent_alarm_info->isDisposable = true;
+ }
+
+ alarm_repeat_mode_t repeat_mode;
+ alarm_day_of_week_t repeat_value;
+ result = alarmmgr_get_repeat_mode(alarm, &repeat_mode, (int *)(&repeat_value));
+ if (result != ALARMMGR_RESULT_SUCCESS) {
+ FW_LOGV("alarmmgr_get_repeat_mode Fail: err_code = %d\n", result);
+ return 0;
+ }
+ FW_LOGV("repeat_mode = %d, repeat_value = %d", repeat_mode, repeat_value);
+ switch (repeat_mode) {
+ case ALARM_REPEAT_MODE_ONCE:
+ FW_LOGV("ALARM_REPEAT_ONCE");
+ agent_alarm_info->repeat_type = ONCE;
+ agent_alarm_info->repeat_value = repeat_value;
+ break;
+ case ALARM_REPEAT_MODE_REPEAT:
+ FW_LOGV("ALARM_REPEAT_MODE_REPEAT");
+ agent_alarm_info->repeat_type = REPEAT;
+ agent_alarm_info->repeat_value = repeat_value;
+ break;
+ case ALARM_REPEAT_MODE_WEEKLY:
+ case ALARM_REPEAT_MODE_MONTHLY:
+ case ALARM_REPEAT_MODE_ANNUALLY:
+ {
+ FW_LOGV("ALARM_REPEAT_MODE_WEEKLY, MONTHLY, ANNUALLY");
+ int tmp;
+ int num = 1;
+
+ int i;
+ for (i = 1; i <= DAY_CNT; i++) {
+ tmp = (repeat_value >> i);
+ switch (tmp) {
+ case DAY_SUN:
+ agent_alarm_info->repeat_value |= DAY_SUN;
+ break;
+ case DAY_MON:
+ agent_alarm_info->repeat_value |= DAY_MON;
+ break;
+ case DAY_TUE:
+ agent_alarm_info->repeat_value |= DAY_TUE;
+ break;
+ case DAY_WED:
+ agent_alarm_info->repeat_value |= DAY_WED;
+ break;
+ case DAY_THU:
+ agent_alarm_info->repeat_value |= DAY_THU;
+ break;
+ case DAY_FRI:
+ agent_alarm_info->repeat_value |= DAY_FRI;
+ break;
+ case DAY_SAT:
+ agent_alarm_info->repeat_value |= DAY_SAT;
+ break;
+ default:
+ break;
+ }
+ num *= 2;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ alarm_date_t alarm_time;
+ result = alarmmgr_get_time(alarm, &alarm_time);
+ if (result != ALARMMGR_RESULT_SUCCESS) {
+ FW_LOGV("alarmmgr_get_info Fail: err_code = %d\n", result);
+ return 0;
+ }
+
+ char *alarm_time_s = 0;
+ __convert_fw_time(&alarm_time, &alarm_time_s);
+ FW_LOGV("alarm_time_s = %s", alarm_time_s);
+ agent_alarm_info->start_alarm_time = alarm_time_s;
+
+ *out_item = agent_alarm_info;
+
+ if (alarm != 0)
+ alarmmgr_free_alarm(alarm);
+
+ return 1;
+}
+
+static int __convert_service_time(char *temp_time, alarm_date_t *out_time)
+{
+ if (temp_time == 0)
+ return 0;
+ FW_LOGV("temp_time = %s", temp_time);
+
+ char *delimiter = "-";
+
+ char *day_ptr = strstr(temp_time, "T");
+ FW_LOGV("Day_ptr = %s", day_ptr);
+
+ int length1 = strlen(day_ptr);
+ FW_LOGV("length1 = %d", length1);
+
+ char *day = (char *)calloc(length1 + 1, sizeof(char));
+ if (day == NULL) {
+ FW_LOGE("calloc fail !!");
+ return 0;
+ }
+ strncpy(day, temp_time, length1);
+ FW_LOGV("Day = %s", day);
+
+ /* get year */
+ char *ptr = strtok(day, delimiter);
+ if (ptr == 0)
+ return 0;
+ FW_LOGV("Year = %s\n", ptr);
+ (out_time)->year = atoi(ptr);
+
+ /* get month */
+ ptr = strtok(0, delimiter);
+ if (ptr == 0)
+ return 0;
+ FW_LOGV("Month = %s\n", ptr);
+ (out_time)->month = atoi(ptr);
+
+ /* get day */
+ ptr = strtok(0, delimiter);
+ if (ptr == 0)
+ return 0;
+ FW_LOGV("Day = %s\n", ptr);
+ (out_time)->day = atoi(ptr);
+
+ if (day != 0)
+ free(day);
+
+ char *time_ptr = strstr(day_ptr, "Z");
+ FW_LOGV("time_ptr = %s", time_ptr);
+
+ int length2 = strlen(temp_time) - strlen(day_ptr) - 2;
+ FW_LOGV("length2 = %d", length2);
+
+ char *time = (char *)calloc(length2, sizeof(char));
+ if (time == NULL) {
+ FW_LOGE("calloc fail !!");
+ return 0;
+ }
+ strncpy(time, day_ptr + 1, length2);
+ FW_LOGV("Time = %s", time);
+ delimiter = ":";
+
+ /* get hour */
+ ptr = strtok(time, delimiter);
+ if (ptr == 0)
+ return 0;
+ FW_LOGV("hour = %s\n", ptr);
+ (out_time)->hour = atoi(ptr);
+
+ /* get min */
+ ptr = strtok(0, delimiter);
+ if (ptr == 0)
+ return 0;
+ FW_LOGV("min = %s\n", ptr);
+ (out_time)->min = atoi(ptr);
+
+ /* get sec */
+ ptr = strtok(0, delimiter);
+ if (ptr == 0)
+ return 0;
+ FW_LOGV("sec = %s\n", ptr);
+ (out_time)->sec = atoi(ptr);
+
+ if (time != 0)
+ free(time);
+
+ return 1;
+}
+
+static int __convert_fw_time(alarm_date_t *temp_time, char **out_time)
+{
+ *out_time = g_strdup_printf("%.2d-%.2d-%.2dT%.2d:%.2d:%.2dZ", temp_time->year, temp_time->month, temp_time->day, temp_time->hour, temp_time->min, temp_time->sec);
+ FW_LOGV("out_time = %s\n", *out_time);
+
+ return 1;
+}
diff --git a/fw-plugin/slp-sysnoti-plugIn/src/SLP_CallBack.c b/fw-plugin/slp-sysnoti-plugIn/src/SLP_CallBack.c
new file mode 100644
index 0000000..3f3c38b
--- /dev/null
+++ b/fw-plugin/slp-sysnoti-plugIn/src/SLP_CallBack.c
@@ -0,0 +1,234 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#include "SLP_CallBack.h"
+#include "SLP_ConnManager.h"
+#include "agent-framework/Utility/fw_log.h"
+
+#define LOG_TAG "PLUGIN_PM_SLP"
+
+static CALLBACK_NETWORK_STATUS callback_network_status = 0;
+static CALLBACK_NETWORK_CANCEL callback_network_cancel = 0;
+static CALLBACK_SYNCML_SAN_INCOMING callback_syncml_san_incoming = 0;
+static CALLBACK_SYNCML_SAN_OPERATION callback_syncml_san_operation = 0;
+static CALLBACK_ALARM callback_alarm = 0;
+static CALLBACK_NETWORK_ON callback_network_on = 0;
+static CALLBACK_NETWORK_OFF callback_network_off = 0;
+
+void setCallBack_NetworkStatus(CALLBACK_NETWORK_STATUS callback)
+{
+ callback_network_status = callback;
+}
+
+void setCallBack_NetworkAllCancel(CALLBACK_NETWORK_CANCEL callback)
+{
+ callback_network_cancel = callback;
+}
+
+void setCallBack_Syncml_SAN_Incoming(CALLBACK_SYNCML_SAN_INCOMING callback)
+{
+ callback_syncml_san_incoming = callback;
+}
+
+void setCallBack_Syncml_SAN_Operation(CALLBACK_SYNCML_SAN_OPERATION callback)
+{
+ callback_syncml_san_operation = callback;
+}
+
+void setCallBack_Alarm(CALLBACK_ALARM callback)
+{
+ callback_alarm = callback;
+}
+
+void setCallBack_Network_On(CALLBACK_NETWORK_ON callback)
+{
+ callback_network_on = callback;
+}
+
+void setCallBack_Network_Off(CALLBACK_NETWORK_OFF callback)
+{
+ callback_network_off = callback;
+}
+
+void network_status_callback_fn(int protocol_type)
+{
+ FW_LOGV("[pm_slp_sysnoti_plugIn] Start !!");
+
+ int res = 1;
+ int net_status = 0;
+ int net_type = 0;
+ char *proxy = 0;
+ char *ip = 0;
+
+ if (check_network() == 1) {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] network is ON \n");
+ proxy = get_ConnMan_proxy();
+ ip = get_ConnMan_ip();
+ } else {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] network is OFF \n");
+ }
+
+ net_status = get_net_status();
+ net_type = get_net_type();
+
+ FW_LOGV("[pm_slp_sysnoti_plugIn] protocol_type : %d, network status : %d, network type : %d, proxy : %s, ip : %s\n", protocol_type, net_status, net_type, proxy, ip);
+
+ FW_LOGV("[pm_slp_sysnoti_plugIn] callback_network_status() Start !!");
+ if (callback_network_status != 0) {
+ res = callback_network_status(protocol_type, net_status, net_type, proxy, ip);
+ } else {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] callback_network_status is NULL!!");
+ }
+
+ FW_LOGV("[pm_slp_sysnoti_plugIn] callback_network_status() End !!");
+
+ if (res != 1) {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] callback_network_status() fail !!");
+ } else {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] callback_network_status() success !!");
+ }
+
+ FW_LOGV("[pm_slp_sysnoti_plugIn] End !!");
+}
+
+void network_cancel_callback_fn(int protocol_type)
+{
+ FW_LOGV("[pm_slp_sysnoti_plugIn] Start !!");
+
+ int res = 1;
+
+ if (callback_network_cancel != 0) {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] call registered network cancel callback function !!");
+
+ res = callback_network_cancel(protocol_type);
+ if (res != 1) {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] callback_network_cancel() fail !!");
+ } else {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] callback_network_cancel() success !!");
+ }
+ } else {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] network_cancel_callback is NULL !! (not registered network_cancel_callback function)");
+ }
+
+ FW_LOGV("[pm_slp_sysnoti_plugIn] End !!");
+}
+
+void syncml_san_incoming_callback_fn(int item_id, void *user_data)
+{
+ FW_LOGV("[pm_slp_sysnoti_plugIn] Start !!");
+
+ int res = 1;
+
+ if (callback_syncml_san_incoming != 0) {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] call registered user syncml_SAN_incoming_callback function !!");
+
+ res = callback_syncml_san_incoming(item_id, user_data);
+ if (res != 1) {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] syncml_SAN_incoming_callback_fn() fail !!");
+ } else {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] syncml_SAN_incoming_callback_fn() success !!");
+ }
+ } else {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] user syncml_SAN_incoming_callback is NULL !! (not registered user syncml_SAN_incoming_callback function)");
+ }
+
+ FW_LOGV("[pm_slp_sysnoti_plugIn] End !!");
+}
+
+void syncml_san_operation_callback_fn(int item_id, void *user_data)
+{
+ FW_LOGV("[pm_slp_sysnoti_plugIn] Start !!");
+
+ int res = 1;
+
+ if (callback_syncml_san_operation != 0) {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] call registered user syncml_SAN_operation_callback function !!");
+
+ res = callback_syncml_san_operation(item_id, user_data);
+ if (res != 1) {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] syncml_SAN_operation_callback_fn() fail !!");
+ } else {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] syncml_SAN_operation_callback_fn() success !!");
+ }
+ } else {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] user syncml_SAN_operation_callback is NULL !! (not registered user syncml_SAN_operation_callback function)");
+ }
+
+ FW_LOGV("[pm_slp_sysnoti_plugIn] End !!");
+}
+
+void network_on_callback_fn(int item_id, void *user_data)
+{
+ FW_LOGV("[pm_slp_sysnoti_plugIn] Start !!");
+
+ int res = 1;
+
+ if (callback_network_on != 0) {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] call registered user network_on_callback function !!");
+
+ res = callback_network_on(item_id, user_data);
+ if (res != 1) {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] callback_network_on() fail !!");
+ } else {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] callback_network_on() success !!");
+ }
+ } else {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] user network_on_callback is NULL !! (not registered user network_on_callback function)");
+ }
+
+ FW_LOGV("[pm_slp_sysnoti_plugIn] End !!");
+}
+
+void network_off_callback_fn(int item_id, void *user_data)
+{
+ FW_LOGV("[pm_slp_sysnoti_plugIn] Start !!");
+
+ int res = 1;
+
+ if (callback_network_on != 0) {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] call registered user network_off_callback function !!");
+
+ res = callback_network_off(item_id, user_data);
+ if (res != 1) {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] callback_network_off() fail !!");
+ } else {
+ FW_LOGV("[pm_slp_sysnoti_plugIn] callback_network_off() success !!");
+ }
+ } else {
+ FW_LOGE("[pm_slp_sysnoti_plugIn] user network_off_callback is NULL !! (not registered user network_off_callback function)");
+ }
+
+ FW_LOGV("[pm_slp_sysnoti_plugIn] End !!");
+}
diff --git a/fw-plugin/slp-sysnoti-plugIn/src/SLP_ConnManager.c b/fw-plugin/slp-sysnoti-plugIn/src/SLP_ConnManager.c
new file mode 100755
index 0000000..a86b3fe
--- /dev/null
+++ b/fw-plugin/slp-sysnoti-plugIn/src/SLP_ConnManager.c
@@ -0,0 +1,390 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#define ConnMan
+
+#ifdef ConnMan
+
+#include "SLP_CallBack.h"
+
+#include "SLP_ConnManager.h"
+#include "agent-framework/NetworkAccess/EXT_NA_NetworkStatus.h"
+
+/* for log */
+#include "agent-framework/Utility/fw_log.h"
+#define LOG_TAG "PLUGIN_PM_SLP_CM"
+
+static FW_NETWORK_STATUS fw_network_status;
+static FW_NETWORK_TYPE fw_network_type;
+
+GStaticRecMutex session_lock_mutex = G_STATIC_REC_MUTEX_INIT;
+
+#define LOCK_SESSION \
+{\
+ g_static_rec_mutex_lock(&session_lock_mutex);\
+}
+
+#define UNLOCK_SESSION \
+{\
+ g_static_rec_mutex_unlock(&session_lock_mutex);\
+}
+
+int check_network()
+{
+ FW_LOGV("Start !!");
+
+ int res = 0;
+ int network_config = 0;
+ int network_status = 0;
+ int status_wifi = 0;
+ int status_3g = 0;
+
+ if (vconf_get_int(VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND, &network_config) == -1) {
+ FW_LOGE("[connman] vconf_get_int ( VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND ) error !!");
+ } else {
+ FW_LOGV("current network configuration : %d", network_config);
+ }
+
+ if (network_config == 0) {
+ /*To do
+ * "0" means the network configuration is not set.
+ * It could be network connection is not open
+ * So, in this sample code, just check again more detail
+ */
+ if (vconf_get_int(VCONFKEY_NETWORK_STATUS, &network_status) == -1) {
+ FW_LOGE("[connman] vconf_get_int( VCONFKEY_NETWORK_STATUS ) error !!");
+ } else {
+ FW_LOGV("current network status : %d", network_status);
+ }
+
+ if (network_status == VCONFKEY_NETWORK_OFF) {
+ FW_LOGV("[connman] current network connection is OFF !!");
+
+ if (vconf_get_int(VCONFKEY_NETWORK_WIFI_STATE, &status_wifi) == -1) {
+ FW_LOGE("[connman] vconf_get_int( VCONFKEY_NETWORK_WIFI_STATE ) error !!");
+ } else {
+ FW_LOGV("wifi status : %d", status_wifi);
+ }
+
+ if (vconf_get_int(VCONFKEY_NETWORK_CELLULAR_STATE, &status_3g) == -1) {
+ FW_LOGE("[connman] vconf_get_int( VCONFKEY_NETWORK_CELLULAR_STATE ) error !!");
+ } else {
+ FW_LOGV("3G status : %d", status_3g);
+ }
+
+ if (status_wifi == VCONFKEY_NETWORK_WIFI_NOT_CONNECTED) {
+ FW_LOGV("[connman] WIFI ON, but not connected !!");
+ fw_network_status = NETWORK_OFF;
+ fw_network_type = NETWORK_WIFI_ON_NOT_CONNECTED;
+ res = 0;
+ }
+
+ if (status_3g != VCONFKEY_NETWORK_CELLULAR_ON) {
+ FW_LOGV("[connman] 3g connection status is not available !!");
+ fw_network_status = NETWORK_OFF;
+ fw_network_type = NETWORK_3G_OFF;
+ res = 0;
+ }
+
+ else {
+ /*
+ * in this case, network connection will be connected sooner
+ *
+ * what ever you want to do
+ * in this sample code, wait until network connection open
+ * or just terminate the application in here! with popup!
+ */
+ FW_LOGV("[connman] network connection is offline !!");
+ fw_network_status = NETWORK_OFF;
+ fw_network_type = NETWORK_NONE;
+ }
+ }
+ } else {
+ /* network configuration is set */
+ FW_LOGV("network configuration is set !!");
+
+ if (vconf_get_int(VCONFKEY_NETWORK_STATUS, &network_status) == -1) {
+ FW_LOGE("[connman] vconf_get_int( VCONFKEY_NETWORK_STATUS ) error !!");
+ } else {
+ FW_LOGV("current network status : %d", network_status);
+ }
+
+ if (network_status != VCONFKEY_NETWORK_OFF) {
+ fw_network_status = NETWORK_ON;
+ } else {
+ fw_network_status = NETWORK_OFF;
+ }
+
+ if (vconf_get_int(VCONFKEY_NETWORK_WIFI_STATE, &status_wifi) == -1) {
+ FW_LOGE("[connman] vconf_get_int( VCONFKEY_NETWORK_WIFI_STATE ) error !!");
+ } else {
+ FW_LOGV("wifi status : %d", status_wifi);
+ }
+
+ if (vconf_get_int(VCONFKEY_NETWORK_CELLULAR_STATE, &status_3g) == -1) {
+ FW_LOGE("[connman] vconf_get_int( VCONFKEY_NETWORK_CELLULAR_STATE ) error !!");
+ } else {
+ FW_LOGV("3G status : %d", status_3g);
+ }
+
+ if ((status_wifi == VCONFKEY_NETWORK_WIFI_CONNECTED) || (status_3g == VCONFKEY_NETWORK_CELLULAR_ON)) {
+ fw_network_status = NETWORK_ON;
+ if ((status_wifi == VCONFKEY_NETWORK_WIFI_CONNECTED) && (status_3g == VCONFKEY_NETWORK_CELLULAR_ON)) {
+ fw_network_type = NETWORK_WIFI_3G_ON;
+ } else if ((status_wifi == VCONFKEY_NETWORK_WIFI_CONNECTED) && (status_3g != VCONFKEY_NETWORK_CELLULAR_ON)) {
+ fw_network_type = NETWORK_WIFI_ON;
+ } else if ((status_wifi != VCONFKEY_NETWORK_WIFI_CONNECTED) && (status_3g == VCONFKEY_NETWORK_CELLULAR_ON)) {
+ fw_network_type = NETWORK_3G_ON;
+ }
+ }
+
+ FW_LOGV("fw_network_status : %d, fw_network_type : %d", fw_network_status, fw_network_type);
+
+ res = 1;
+ }
+
+ return res;
+}
+
+void network_connection_cb(keynode_t *node, void *data)
+{
+ FW_LOGV("Start !!");
+
+ char *vkey = NULL;
+ int network_status = 0;
+ int status_3g = 0;
+ int status_wifi = 0;
+
+ FW_NETWORK_STATUS prev_fw_network_status = fw_network_status;
+
+ /* LOCK_SESSION */
+
+ /* get VCONFKEY */
+ vkey = vconf_keynode_get_name(node);
+ FW_LOGV("vkey : %s", vkey);
+
+ network_status = vconf_keynode_get_int(node);
+ FW_LOGV("network status : %d", network_status);
+
+ switch (network_status) {
+ case VCONFKEY_NETWORK_OFF:
+ {
+ /*
+ * network connection is off
+ * halt the all action, for example reset socket, close application, just wait until connected
+ * in this sample, close the application
+ */
+ FW_LOGV("network connection is off !!");
+
+ FW_LOGV("network_cancel_callback_fn() : Start !!");
+ network_cancel_callback_fn(1);
+ FW_LOGV("network_cancel_callback_fn() : End !!");
+
+ if (fw_network_status == NETWORK_ON) {
+ network_off_callback_fn(0, NULL);
+ }
+
+ fw_network_status = NETWORK_OFF;
+ fw_network_type = NETWORK_NONE;
+
+ /* UNLOCK_SESSION */
+ }
+ break;
+ case VCONFKEY_NETWORK_CELLULAR:
+ {
+ fw_network_status = NETWORK_ON;
+
+ if (vconf_get_int(VCONFKEY_NETWORK_CELLULAR_STATE, &status_3g) == -1) {
+ FW_LOGE("[connman] vconf_get_int( VCONFKEY_NETWORK_CELLULAR_STATE ) error !!");
+ } else {
+ FW_LOGV("3G status : %d", status_3g);
+ }
+
+ if (status_3g != VCONFKEY_NETWORK_CELLULAR_ON) {
+ FW_LOGV("3g connection is off !!");
+
+ FW_LOGV("network_cancel_callback_fn() : Start !!");
+ network_cancel_callback_fn(1);
+ FW_LOGV("network_cancel_callback_fn() : End !!");
+
+ fw_network_type = NETWORK_3G_OFF;
+ } else {
+ FW_LOGV("3g connection is on !!");
+
+ fw_network_type = NETWORK_3G_ON;
+ }
+
+ /* UNLOCK_SESSION */
+ }
+ break;
+ case VCONFKEY_NETWORK_WIFI:
+ {
+ fw_network_status = NETWORK_ON;
+
+ if (vconf_get_int(VCONFKEY_NETWORK_WIFI_STATE, &status_wifi) == -1) {
+ FW_LOGE("[connman] vconf_get_int( VCONFKEY_NETWORK_WIFI_STATE ) error !!");
+ } else {
+ FW_LOGV("WIFI status : %d", status_wifi);
+ }
+
+ if (status_wifi == VCONFKEY_NETWORK_WIFI_CONNECTED) {
+ FW_LOGV("wifi connected !!");
+
+ fw_network_type = NETWORK_WIFI_ON;
+ /* todo : request re-sending message to engine */
+ } else if (status_wifi == VCONFKEY_NETWORK_WIFI_NOT_CONNECTED) {
+ FW_LOGV("wifi on, but not connected !!");
+
+ fw_network_type = NETWORK_WIFI_ON_NOT_CONNECTED;
+ /* todo : send msg to user (connection retry) */
+ } else {
+ FW_LOGV("wifi not connected !!");
+
+ FW_LOGV("network_cancel_callback_fn() : Start !!");
+ network_cancel_callback_fn(1);
+ FW_LOGV("network_cancel_callback_fn() : End !!");
+
+ fw_network_type = NETWORK_WIFI_OFF;
+ }
+
+ /* UNLOCK_SESSION */
+ }
+ break;
+ default:
+ /* UNLOCK_SESSION */
+ break;
+ }
+
+ FW_LOGV("network connection is connected, type : %d", network_status);
+
+ FW_LOGV("network_status_callback_fn() : Start !!");
+ network_status_callback_fn(1);
+ FW_LOGV("network_status_callback_fn() : End !!");
+
+ if (prev_fw_network_status == NETWORK_OFF) {
+ if (fw_network_status == NETWORK_ON) {
+ network_on_callback_fn(0, NULL);
+ }
+ } else { /* prev_fw_network_status == NETWORK_ON */
+ if (fw_network_status == NETWORK_OFF) {
+ network_off_callback_fn(0, NULL);
+ }
+ }
+
+ FW_LOGV("End !!");
+
+ return;
+}
+
+void network_configuration_handler(keynode_t *node, void *data)
+{
+ /* change ip/proxy value */
+ FW_LOGV("[%s] Start !!", __func__);
+
+ char *vkey = NULL;
+/* char *ip = NULL;
+ char *proxy = NULL;*/
+ int network_config = 0;
+
+ /* LOCK_SESSION */
+
+ /* get VCONFKEY */
+ vkey = vconf_keynode_get_name(node);
+ FW_LOGV("vkey : %s", __func__, vkey);
+
+ network_config = vconf_keynode_get_int(node);
+ FW_LOGV("network configuration : %d", __func__, network_config);
+
+ switch (network_config) {
+ case 1: /* connect network */
+ {
+ FW_LOGV("network configuration is set !!");
+
+ FW_LOGV("network_status_callback_fn() : Start !!");
+ network_status_callback_fn(1);
+ FW_LOGV("network_status_callback_fn() : End !!");
+
+ /* UNLOCK_SESSION */
+ }
+ break;
+ case 0: /* disconnect network */
+ {
+ FW_LOGV("network configuration is not set !!");
+
+ FW_LOGV("network_cancel_callback_fn() : Start !!");
+ network_cancel_callback_fn(1);
+ FW_LOGV("network_cancel_callback_fn() : End !!");
+
+ FW_LOGV("network_status_callback_fn() : Start !!");
+ network_status_callback_fn(1);
+ FW_LOGV("network_status_callback_fn() : End !!");
+
+ /* UNLOCK_SESSION */
+ }
+ break;
+ default:
+ break;
+ }
+
+ FW_LOGV("[%s] End !!", __func__);
+}
+
+int get_net_status()
+{
+ return fw_network_status;
+}
+
+int get_net_type()
+{
+ return fw_network_type;
+}
+
+char *get_ConnMan_proxy()
+{
+ return vconf_get_str(VCONFKEY_NETWORK_PROXY);
+}
+
+char *get_ConnMan_ip()
+{
+ return vconf_get_str(VCONFKEY_NETWORK_IP);
+}
+
+void init_network()
+{
+ fw_network_status = NETWORK_UNKNOWN;
+ fw_network_type = NETWORK_NONE;
+}
+
+#endif
diff --git a/fw-plugin/slp-sysnoti-plugIn/src/SLP_SAN.c b/fw-plugin/slp-sysnoti-plugIn/src/SLP_SAN.c
new file mode 100755
index 0000000..cbe9068
--- /dev/null
+++ b/fw-plugin/slp-sysnoti-plugIn/src/SLP_SAN.c
@@ -0,0 +1,394 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#include <string.h>
+#include "MapiTransport.h"
+#include "MapiControl.h"
+#include "MapiMessage.h"
+#include "MapiStorage.h"
+#include "MsgTypes.h"
+#include <time.h>
+#include <vconf.h>
+
+#include "SLP_CallBack.h"
+
+#include "SLP_SAN.h"
+#include "agent-framework/PlatformMonitor/EXT_PMCI_Struct.h"
+
+/* for log */
+#include "agent-framework/Utility/fw_log.h"
+#define LOG_TAG "PLUGIN_PM_SLP_SAN"
+
+static int register_syncml_msg_callback();
+
+static void check_msg_server_callback(keynode_t *node, void *data);
+
+static void incomming_syncml_msg_callback(MSG_HANDLE_T hMsgHandle, MSG_SYNCML_MESSAGE_TYPE_T msgType, const char *pPushBody, int PushBodyLen, const char *wspHeader, int wspHeaderLen, void *pUserParam);
+
+static void operation_syncml_msg_callback(MSG_HANDLE_T hMsgHandle, int msgId, int extId, void *pUserParam);
+
+static MSG_HANDLE_T msg_handle = NULL;
+
+int start_san()
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+ int msg_key = 0;
+
+ MSG_ERROR_T err = MSG_SUCCESS;
+
+ if (vconf_get_bool(VCONFKEY_MSG_SERVER_READY, &msg_key) == 0) {
+ if (msg_key == 1) {
+ FW_LOGV("msg server is ready !!");
+
+ err = msg_open_msg_handle(&msg_handle);
+ if (err != MSG_SUCCESS) {
+ FW_LOGE("msg_open_msg_handle() fail [%d] !!", err);
+ res = -1;
+ goto return_part;
+ } else {
+ FW_LOGV("msg_open_msg_handle() success !!");
+
+ res = register_syncml_msg_callback();
+ if (res != 1) {
+ FW_LOGE("register_syncml_msg_callback() fail !!");
+
+ err = msg_close_msg_handle(&msg_handle);
+ if (err != MSG_SUCCESS) {
+ FW_LOGE("msg_close_msg_handle() fail !!");
+ res = -1;
+ goto return_part;
+ } else {
+ FW_LOGV("msg_close_msg_handle() success !!");
+ msg_handle = NULL;
+ res = -1;
+ goto return_part;
+ }
+ } else {
+ FW_LOGV("register_syncml_msg_callback() success !!");
+ }
+ }
+ } else {
+ FW_LOGE("msg server is not ready !!");
+
+ if (vconf_notify_key_changed((char *)VCONFKEY_MSG_SERVER_READY, check_msg_server_callback, NULL) != 0) {
+ FW_LOGE("vconf_notify_key_changed( VCONFKEY_MSG_SERVER_READY ) fail !!");
+ res = -1;
+ goto return_part;
+ } else {
+ FW_LOGV("register vconf callback !!");
+ }
+ }
+ } else {
+ FW_LOGE("vconf_get_bool ( VCONFKEY_MSG_SERVER_READY ) fail !!");
+ res = -1;
+ goto return_part;
+ }
+
+return_part:
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+int end_san()
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+ MSG_ERROR_T err = MSG_SUCCESS;
+
+ err = msg_close_msg_handle(&msg_handle);
+ if (err != MSG_SUCCESS) {
+ FW_LOGE("msg_close_msg_handle() fail !!");
+ res = -1;
+ goto return_part;
+ } else {
+ FW_LOGV("msg_close_msg_handle() success !!");
+ msg_handle = NULL;
+ }
+
+return_part:
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+int add_san_message(void *add_item)
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+ MSG_ERROR_T err = MSG_SUCCESS;
+ MSG_SYNCML_MESSAGE_S push_san_msg;
+ pmci_san_message_t *add_msg = (pmci_san_message_t *) add_item;
+
+ push_san_msg.extId = add_msg->extId;
+ push_san_msg.pinCode = add_msg->pinCode;
+ push_san_msg.msg = msg_new_message();
+
+ msg_set_folder_id(push_san_msg.msg, MSG_INBOX_ID);
+ msg_set_message_type(push_san_msg.msg, MSG_TYPE_SMS_SYNCML);
+ msg_set_network_status(push_san_msg.msg, MSG_NETWORK_RECEIVED);
+ msg_set_direction_info(push_san_msg.msg, MSG_DIRECTION_TYPE_MT);
+ msg_add_address(push_san_msg.msg, "+1004", MSG_RECIPIENTS_TYPE_TO);
+
+ /* received time */
+ time_t t = time(NULL);
+ time_t recv_utf_time = time(&t);
+ msg_set_time(push_san_msg.msg, recv_utf_time);
+
+ if (add_msg->msgData == NULL) {
+ FW_LOGE("msgData is NULL !!");
+ res = -1;
+ goto return_part;
+ }
+
+ err = msg_sms_set_message_body(push_san_msg.msg, add_msg->msgData, strlen(add_msg->msgData));
+ if (err != MSG_SUCCESS) {
+ FW_LOGE("msg_sms_set_message_body() fail !!");
+ res = -1;
+ goto return_part;
+ } else {
+ FW_LOGV("msg_sms_set_message_body() success !!");
+ }
+
+ if (msg_handle == NULL) {
+ FW_LOGE("msg_handle is NULL !!");
+ res = -1;
+ goto return_part;
+ }
+
+ err = msg_add_syncml_message(msg_handle, &push_san_msg);
+ if (err != MSG_SUCCESS) {
+ FW_LOGE("msg_add_syncml_message() fail !!");
+ res = -1;
+ goto return_part;
+ } else {
+ FW_LOGV("msg_add_syncml_message() success !!");
+ }
+
+return_part:
+ msg_release_message(&(push_san_msg.msg));
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+int remove_san_message(int remove_item_id)
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+ MSG_ERROR_T err = MSG_SUCCESS;
+
+ if (msg_handle == NULL) {
+ FW_LOGE("msg_handle is NULL !!");
+ res = -1;
+ goto return_part;
+ }
+
+ err = msg_delete_message(msg_handle, remove_item_id);
+ if (err != MSG_SUCCESS) {
+ FW_LOGE("msg_delete_message() fail !!");
+ res = -1;
+ goto return_part;
+ } else {
+ FW_LOGV("msg_delete_message() success !!");
+ }
+
+return_part:
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+static int register_syncml_msg_callback()
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+ MSG_ERROR_T err = MSG_SUCCESS;
+
+ if (msg_handle == NULL) {
+ FW_LOGE("msg_handle is NULL !!");
+ res = -1;
+ goto return_part;
+ }
+
+ err = msg_reg_syncml_message_callback(msg_handle, incomming_syncml_msg_callback, NULL);
+ if (err != MSG_SUCCESS) {
+ FW_LOGE("Register SyncML Incoming Callback fail [%d] !!", err);
+ res = -1;
+ goto return_part;
+ } else {
+ FW_LOGV("Register SyncML Incoming Callback success !!");
+ }
+
+ err = msg_reg_syncml_message_operation_callback(msg_handle, operation_syncml_msg_callback, NULL);
+ if (err != MSG_SUCCESS) {
+ FW_LOGE("Register SyncML operation Callback fail [%d] !!", err);
+ res = -1;
+ goto return_part;
+ } else {
+ FW_LOGV("Register SyncML operation Callback success !!");
+ }
+
+return_part:
+
+ FW_LOGV("End !!");
+
+ return res;
+}
+
+static void check_msg_server_callback(keynode_t *node, void *data)
+{
+ FW_LOGV("Start !!");
+
+ int res = 1;
+ int msg_key = 0;
+ MSG_ERROR_T err = MSG_SUCCESS;
+
+ if (vconf_get_bool(VCONFKEY_MSG_SERVER_READY, &msg_key) == 0) {
+ if (msg_key == 1) {
+ FW_LOGV("msg server is ready !!");
+
+ if (msg_handle == NULL) {
+ err = msg_open_msg_handle(&msg_handle);
+ if (err != MSG_SUCCESS) {
+ FW_LOGE("msg_open_msg_handle() fail [%d] !!", err);
+ goto return_part;
+ } else {
+ FW_LOGV("msg_open_msg_handle() success !!");
+
+ res = register_syncml_msg_callback();
+ if (res != 1) {
+ FW_LOGE("register_syncml_msg_callback() fail !!");
+ goto return_part;
+ } else {
+ FW_LOGV("register_syncml_msg_callback() success !!");
+ }
+ }
+ } else {
+ FW_LOGV("callback is already registered !!");
+ }
+ } else {
+ FW_LOGV("msg server is not ready !!");
+ }
+ } else {
+ FW_LOGE("vconf_get_bool ( VCONFKEY_MSG_SERVER_READY ) fail !!");
+ goto return_part;
+ }
+
+return_part:
+
+ FW_LOGV("End !!");
+
+ return;
+}
+
+static void incomming_syncml_msg_callback(MSG_HANDLE_T hMsgHandle, MSG_SYNCML_MESSAGE_TYPE_T msgType, const char *pPushBody, int PushBodyLen, const char *wspHeader, int wspHeaderLen, void *pUserParam)
+{
+ FW_LOGV("Start !!");
+
+ pmci_san_incoming_t *san_incoming = (pmci_san_incoming_t *) calloc(1, sizeof(pmci_san_incoming_t));
+ if (san_incoming == NULL) {
+ FW_LOGE("pmci_san_incomming_t calloc error !!");
+ /* todo : exception handling */
+ return;
+ }
+ FW_LOGV("push body : %s, push body len : %d", pPushBody, PushBodyLen);
+ FW_LOGV("wsp header : %s, wsp header len : %d", wspHeader, wspHeaderLen);
+
+ if ((PushBodyLen > 0) && (pPushBody != NULL)) {
+ san_incoming->msgBody = strdup(pPushBody);
+ san_incoming->msgSize = PushBodyLen;
+ } else {
+ san_incoming->msgBody = 0;
+ san_incoming->msgSize = 0;
+ }
+
+ switch (msgType) {
+ case DS_NOTIFICATION:
+ {
+ FW_LOGV("MsgNoti ( msgType = 3, DS_NOTIFICATION ) detected.\n");
+ san_incoming->version = SAN_VERSION_12;
+ }
+ break;
+ case DS_WBXML:
+ {
+ FW_LOGV("MsgNoti ( msgType = 4, DS_WBXML ) detected.\n");
+ san_incoming->version = SAN_VERSION_11;
+ }
+ break;
+ case OTHERS:
+ default:
+ FW_LOGV("Unknown MsgNoti ( %d ) detected.\n", msgType);
+ break;
+ }
+
+ syncml_san_incoming_callback_fn(0, (void *)san_incoming);
+
+ FW_LOGV("End !!");
+}
+
+static void operation_syncml_msg_callback(MSG_HANDLE_T hMsgHandle, int msgId, int extId, void *pUserParam)
+{
+ FW_LOGV("Start !!");
+
+ pmci_san_operation_t *san_operation = (pmci_san_operation_t *) calloc(1, sizeof(pmci_san_operation_t));
+ if (san_operation == NULL) {
+ FW_LOGE("pmci_san_operation_t calloc error !!");
+ /* todo : exception handling */
+ return;
+ }
+
+ san_operation->msgId = msgId;
+ FW_LOGV("msgId : %d", msgId);
+
+ san_operation->extId = extId;
+ FW_LOGV("extId : %d", extId);
+
+ san_operation->user_param = pUserParam;
+
+ syncml_san_operation_callback_fn(0, (void *)san_operation);
+
+ FW_LOGV("End !!");
+}
diff --git a/fw-plugin/vcalendar-plugIn/.cproject b/fw-plugin/vcalendar-plugIn/.cproject
new file mode 100755
index 0000000..3c36d31
--- /dev/null
+++ b/fw-plugin/vcalendar-plugIn/.cproject
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?>
+
+<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="org.eclipse.cdt.core.default.config.2033120496">
+ <storageModule buildSystemId="org.eclipse.cdt.core.defaultConfigDataProvider" id="org.eclipse.cdt.core.default.config.2033120496" moduleId="org.eclipse.cdt.core.settings" name="Configuration">
+ <externalSettings/>
+ <extensions>
+ <extension id="com.samsung.limo.SboxELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="com.samsung.limo.SboxGCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="com.samsung.limo.SboxMakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ <storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
+ <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
+ <storageModule moduleId="org.eclipse.cdt.core.pathentry">
+ <pathentry kind="src" path="include"/>
+ <pathentry kind="src" path="src"/>
+ <pathentry excluding="include|src" kind="src" path=""/>
+ <pathentry kind="out" path=""/>
+ </storageModule>
+ </cconfiguration>
+ </storageModule>
+</cproject>
diff --git a/fw-plugin/vcalendar-plugIn/.project b/fw-plugin/vcalendar-plugIn/.project
new file mode 100755
index 0000000..110bda3
--- /dev/null
+++ b/fw-plugin/vcalendar-plugIn/.project
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>vcalendar-plugIn</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>com.samsung.slp2.SboxBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>com.samsung.slp2.SboxBuilder.needConfigure</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;com.samsung.limo.SboxGCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.append_environment</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.arguments</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.command</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.auto</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.clean</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.inc</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.environment</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>com.samsung.slp2.cnature</nature>
+ </natures>
+</projectDescription>
diff --git a/fw-plugin/vcalendar-plugIn/CMakeLists.src b/fw-plugin/vcalendar-plugIn/CMakeLists.src
new file mode 100755
index 0000000..04ce4aa
--- /dev/null
+++ b/fw-plugin/vcalendar-plugIn/CMakeLists.src
@@ -0,0 +1 @@
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRCS)
diff --git a/fw-plugin/vcalendar-plugIn/CMakeLists.sub b/fw-plugin/vcalendar-plugIn/CMakeLists.sub
new file mode 100755
index 0000000..c8b177d
--- /dev/null
+++ b/fw-plugin/vcalendar-plugIn/CMakeLists.sub
@@ -0,0 +1,37 @@
+#################################################################################
+# THIS FILE IS CREATED AUTOMATICALLY. DO NOT DELETE OR MODIFY THIS FILE.
+#################################################################################
+
+INCLUDE(CMakeLists.src)
+
+## PROJECT NAME
+PROJECT(plugin-dc-vcalendar C)
+
+## PACKAGE CONFIG
+SET(SLP_PKGCONFIG_LIST "calendar glib-2.0")
+
+## INCLUDES
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../framework/include)
+
+## DEFINITIONS
+ADD_DEFINITIONS("-DAPP_DIR=\"${CMAKE_INSTALL_PREFIX}\"")
+
+## LIBRARY PATH
+SET(SLP_LD_PATH_FLAGS "")
+
+## LIBRARY
+SET(SLP_LD_FLAGS "")
+
+## DEBUG
+SET(SLP_DEBUG_FLAGS "-g")
+
+## OPTIMIZATION
+SET(SLP_OPT_FLAGS "-O0")
+
+## COMPILER FLAGS
+SET(SLP_COMPILER_FLAGS "")
+
+## LINKER FLAGS
+SET(SLP_LINKER_FLAGS "")
+
diff --git a/fw-plugin/vcalendar-plugIn/CMakeLists.txt b/fw-plugin/vcalendar-plugIn/CMakeLists.txt
new file mode 100755
index 0000000..711be71
--- /dev/null
+++ b/fw-plugin/vcalendar-plugIn/CMakeLists.txt
@@ -0,0 +1,33 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+
+# INCLUDE SUB CMAKELIST FILE
+INCLUDE(CMakeLists.sub)
+
+SET(RESOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/res")
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs_plugin_vcalendar REQUIRED ${SLP_PKGCONFIG_LIST})
+
+FOREACH(flag ${pkgs_plugin_vcalendar_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+SET(CMAKE_CXX_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+
+ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS})
+
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_plugin_vcalendar_LDFLAGS} ${SLP_LD_PATH_FLAGS} ${SLP_LD_FLAGS} ${SLP_LINKER_FLAGS} sync-agent-framework)
+
+# INSTALL
+INSTALL(TARGETS ${PROJECT_NAME} DESTINATION lib)
+#INSTALL(DIRECTORY ${RESOURCE_DIR}/data DESTINATION share)
+
+#added by KTS for install to the system
+#CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY)
+#INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig)
+
+
+# INCLUDE LAYOUT DIRECTORY
+# ADD_SUBDIRECTORY(layout)
+#ADD_SUBDIRECTORY(res/locale)
diff --git a/fw-plugin/vcalendar-plugIn/include/IN_DataStore_Info_Vcalendar.h b/fw-plugin/vcalendar-plugIn/include/IN_DataStore_Info_Vcalendar.h
new file mode 100755
index 0000000..14e141c
--- /dev/null
+++ b/fw-plugin/vcalendar-plugIn/include/IN_DataStore_Info_Vcalendar.h
@@ -0,0 +1,248 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef IN_DATASTORE_INFO_VCALENDAR_H_
+#define IN_DATASTORE_INFO_VCALENDAR_H_
+
+#define VCALENDAR_TYPE "text/x-vcalendar"
+#define VCALENDAR_VERSION "1.0"
+
+typedef enum {
+ VCALENDAR_FIELD_BEGIN = 10,
+ VCALENDAR_FIELD_END,
+ VCALENDAR_FIELD_VERSION,
+ VCALENDAR_FIELD_AALARM,
+ VCALENDAR_FIELD_ACTION,
+ VCALENDAR_FIELD_ATTACH,
+ VCALENDAR_FIELD_ATTENDEE,
+ VCALENDAR_FIELD_CALSCALE,
+ VCALENDAR_FIELD_CATEGORIES,
+ VCALENDAR_FIELD_CLASS,
+ VCALENDAR_FIELD_COMMENT,
+ VCALENDAR_FIELD_COMPLETED,
+ VCALENDAR_FIELD_CONTACT,
+ VCALENDAR_FIELD_CREATED,
+ VCALENDAR_FIELD_DALARM,
+ VCALENDAR_FIELD_DAYLIGHT,
+ VCALENDAR_FIELD_DCREATED,
+ VCALENDAR_FIELD_DESCRIPTION,
+ VCALENDAR_FIELD_DTEND,
+ VCALENDAR_FIELD_DTSTAMP,
+ VCALENDAR_FIELD_DTSTART,
+ VCALENDAR_FIELD_DUE,
+ VCALENDAR_FIELD_DURATION,
+ VCALENDAR_FIELD_EXDATE,
+ VCALENDAR_FIELD_EXRULE,
+ VCALENDAR_FIELD_FREEBUSY,
+ VCALENDAR_FIELD_GEO,
+ VCALENDAR_FIELD_LAST_MODIFIED,
+ VCALENDAR_FIELD_LOCATION,
+ VCALENDAR_FIELD_MALARM,
+ VCALENDAR_FIELD_METHOD,
+ VCALENDAR_FIELD_ORGANIZER,
+ VCALENDAR_FIELD_PALARM,
+ VCALENDAR_FIELD_PERCENT_COMPLETE,
+ VCALENDAR_FIELD_PRIORITY,
+ VCALENDAR_FIELD_PRODID,
+ VCALENDAR_FIELD_RDATE,
+ VCALENDAR_FIELD_RECURRENCE_ID,
+ VCALENDAR_FIELD_RELATED_TO,
+ VCALENDAR_FIELD_REPEAT,
+ VCALENDAR_FIELD_REQUEST_STATUS,
+ VCALENDAR_FIELD_RESOURCES,
+ VCALENDAR_FIELD_RNUM,
+ VCALENDAR_FIELD_RRULE,
+ VCALENDAR_FIELD_SEQUENCE,
+ VCALENDAR_FIELD_STANDARD,
+ VCALENDAR_FIELD_STATUS,
+ VCALENDAR_FIELD_SUMMARY,
+ VCALENDAR_FIELD_TRANSP,
+ VCALENDAR_FIELD_TRIGGER,
+ VCALENDAR_FIELD_TZ,
+ VCALENDAR_FIELD_TZID,
+ VCALENDAR_FIELD_TZNAME,
+ VCALENDAR_FIELD_TZOFFSETFROM,
+ VCALENDAR_FIELD_TZOFFSETTO,
+ VCALENDAR_FIELD_TZURL,
+ VCALENDAR_FIELD_URL,
+ VCALENDAR_FIELD_UID,
+ VCALENDAR_FIELD_VALARM,
+ VCALENDAR_FIELD_VCALENDAR,
+ VCALENDAR_FIELD_VEVENT,
+ VCALENDAR_FIELD_VFREEBUSY,
+ VCALENDAR_FIELD_VJOURNAL,
+ VCALENDAR_FIELD_VTIMEZONE,
+ VCALENDAR_FIELD_VTODO,
+ VCALENDAR_FIELD_X_FUNAMBOL_ALLDAY,
+
+} VCALENDAR_FIELD;
+
+typedef enum {
+ VCALENDAR_FIELD_BEGIN_END_VCALENDAR = 100,
+ VCALENDAR_FIELD_BEGIN_END_VEVENT,
+ VCALENDAR_FIELD_BEGIN_END_VTODO,
+ VCALENDAR_FIELD_BEGIN_END_VJOURNAL,
+ VCALENDAR_FIELD_BEGIN_END_VFREEBUSY,
+ VCALENDAR_FIELD_BEGIN_END_VTIMEZONE,
+ VCALENDAR_FIELD_BEGIN_END_VALARM,
+ VCALENDAR_FIELD_BEGIN_END_STANDARD,
+ VCALENDAR_FIELD_BEGIN_END_DAYLIGHT,
+
+} VCALENDAR_FIELD_BEGIN_END_SUB;
+
+typedef enum {
+ VCALENDAR_FIELD_CATEGORIES_APPOINTMENT = 200,
+ VCALENDAR_FIELD_CATEGORIES_HOLIDAY,
+ VCALENDAR_FIELD_CATEGORIES_BUSINESS,
+ VCALENDAR_FIELD_CATEGORIES_SPECIAL_OCCASION,
+ VCALENDAR_FIELD_CATEGORIES_IMPORTANT,
+ VCALENDAR_FIELD_CATEGORIES_BIRTHDAY,
+ VCALENDAR_FIELD_CATEGORIES_MISSCELLANEOUS,
+
+} VCALENDAR_FIELD_CATEGORIES_SUB;
+
+typedef enum {
+ VCALENDAR_FIELD_STATUS_NEEDS_ACTION = 300,
+ VCALENDAR_FIELD_STATUS_COMPLETED,
+
+} VCALENDAR_FIELD_STATUS_SUB;
+
+typedef struct VCALENDAR_FIELD_LIST VCALENDAR_FIELD_LIST;
+struct VCALENDAR_FIELD_LIST {
+ int field_enum;
+ char *field_name;
+};
+
+static VCALENDAR_FIELD_LIST vcalendar_field_list[] = {
+ {VCALENDAR_FIELD_BEGIN, "BEGIN"},
+ {VCALENDAR_FIELD_END, "END"},
+ {VCALENDAR_FIELD_VERSION, "VERSION"},
+ {VCALENDAR_FIELD_AALARM, "AALARM"},
+ {VCALENDAR_FIELD_ACTION, "ACTION"},
+ {VCALENDAR_FIELD_ATTACH, "ATTACH"},
+ {VCALENDAR_FIELD_ATTENDEE, "ATTENDEE"},
+ {VCALENDAR_FIELD_CALSCALE, "CALSCALE"},
+ {VCALENDAR_FIELD_CATEGORIES, "CATEGORIES"},
+ {VCALENDAR_FIELD_CLASS, "CLASS"},
+ {VCALENDAR_FIELD_COMMENT, "COMMENT"},
+ {VCALENDAR_FIELD_COMPLETED, "COMPLETED"},
+ {VCALENDAR_FIELD_CONTACT, "CONTACT"},
+ {VCALENDAR_FIELD_CREATED, "CREATED"},
+ {VCALENDAR_FIELD_DALARM, "DALARM"},
+ {VCALENDAR_FIELD_DAYLIGHT, "DAYLIGHT"},
+ {VCALENDAR_FIELD_DCREATED, "DCREATED"},
+ {VCALENDAR_FIELD_DESCRIPTION, "DESCRIPTION"},
+ {VCALENDAR_FIELD_DTEND, "DTEND"},
+ {VCALENDAR_FIELD_DTSTAMP, "DTSTAMP"},
+ {VCALENDAR_FIELD_DTSTART, "DTSTART"},
+ {VCALENDAR_FIELD_DUE, "DUE"},
+ {VCALENDAR_FIELD_DURATION, "DURATION"},
+ {VCALENDAR_FIELD_EXDATE, "EXDATE"},
+ {VCALENDAR_FIELD_EXRULE, "EXRULE"},
+ {VCALENDAR_FIELD_FREEBUSY, "FREEBUSY"},
+ {VCALENDAR_FIELD_GEO, "GEO"},
+ {VCALENDAR_FIELD_LAST_MODIFIED, "LAST-MODIFIED"},
+ {VCALENDAR_FIELD_LOCATION, "LOCATION"},
+ {VCALENDAR_FIELD_MALARM, "MALARM"},
+ {VCALENDAR_FIELD_METHOD, "METHOD"},
+ {VCALENDAR_FIELD_ORGANIZER, "ORGANIZER"},
+ {VCALENDAR_FIELD_PALARM, "PALARM"},
+ {VCALENDAR_FIELD_PERCENT_COMPLETE, "PERCENT-COMPLETE"},
+ {VCALENDAR_FIELD_PRIORITY, "PRIORITY"},
+ {VCALENDAR_FIELD_PRODID, "PRODID"},
+ {VCALENDAR_FIELD_RDATE, "RDATE"},
+ {VCALENDAR_FIELD_RECURRENCE_ID, "RECURRENCE-ID"},
+ {VCALENDAR_FIELD_RELATED_TO, "RELATED-TO"},
+ {VCALENDAR_FIELD_REPEAT, "REPEAT"},
+ {VCALENDAR_FIELD_REQUEST_STATUS, "REQUEST-STATUS"},
+ {VCALENDAR_FIELD_RESOURCES, "RESOURCES"},
+ {VCALENDAR_FIELD_RNUM, "RNUM"},
+ {VCALENDAR_FIELD_RRULE, "RRULE"},
+ {VCALENDAR_FIELD_SEQUENCE, "SEQUENCE"},
+ {VCALENDAR_FIELD_STANDARD, "STANDARD"},
+ {VCALENDAR_FIELD_STATUS, "STATUS"},
+ {VCALENDAR_FIELD_SUMMARY, "SUMMARY"},
+ {VCALENDAR_FIELD_TRANSP, "TRANSP"},
+ {VCALENDAR_FIELD_TRIGGER, "TRIGGER"},
+ {VCALENDAR_FIELD_TZ, "TZ"},
+ {VCALENDAR_FIELD_TZID, "TZID"},
+ {VCALENDAR_FIELD_TZNAME, "TZNAME"},
+ {VCALENDAR_FIELD_TZOFFSETFROM, "TZOFFSETFROM"},
+ {VCALENDAR_FIELD_TZOFFSETTO, "TZOFFSETTO"},
+ {VCALENDAR_FIELD_TZURL, "TZURL"},
+ {VCALENDAR_FIELD_URL, "URL"},
+ {VCALENDAR_FIELD_UID, "UID"},
+ {VCALENDAR_FIELD_VALARM, "VALARM"},
+ {VCALENDAR_FIELD_VCALENDAR, "VCALENDAR"},
+ {VCALENDAR_FIELD_VEVENT, "VEVENT"},
+ {VCALENDAR_FIELD_VFREEBUSY, "VFREEBUSY"},
+ {VCALENDAR_FIELD_VJOURNAL, "VJOURNAL"},
+ {VCALENDAR_FIELD_VTIMEZONE, "VTIMEZONE"},
+ {VCALENDAR_FIELD_VTODO, "VTODO"},
+ {VCALENDAR_FIELD_X_FUNAMBOL_ALLDAY, "X-FUNAMBOL-ALLDAY"}
+};
+
+static VCALENDAR_FIELD_LIST vcalendar_field_list_begin_end[] = {
+ {VCALENDAR_FIELD_BEGIN_END_VCALENDAR, "VCALENDAR"},
+ {VCALENDAR_FIELD_BEGIN_END_VEVENT, "VEVENT"},
+ {VCALENDAR_FIELD_BEGIN_END_VTODO, "VTODO"},
+ {VCALENDAR_FIELD_BEGIN_END_VJOURNAL, "VJOURNAL"},
+ {VCALENDAR_FIELD_BEGIN_END_VFREEBUSY, "VFREEBUSY"},
+ {VCALENDAR_FIELD_BEGIN_END_VTIMEZONE, "VTIMEZONE"},
+ {VCALENDAR_FIELD_BEGIN_END_VALARM, "VALARM"},
+ {VCALENDAR_FIELD_BEGIN_END_STANDARD, "STANDARD"},
+ {VCALENDAR_FIELD_BEGIN_END_DAYLIGHT, "DAYLIGHT"}
+};
+
+static VCALENDAR_FIELD_LIST vcalendar_field_list_version[] = {
+ {-1, VCALENDAR_VERSION}
+};
+
+static VCALENDAR_FIELD_LIST vcalendar_field_list_categories[] = {
+ {VCALENDAR_FIELD_CATEGORIES_APPOINTMENT, "APPOINTMENT"},
+ {VCALENDAR_FIELD_CATEGORIES_HOLIDAY, "HOLIDAY"},
+ {VCALENDAR_FIELD_CATEGORIES_BUSINESS, "BUSINESS"},
+ {VCALENDAR_FIELD_CATEGORIES_SPECIAL_OCCASION, "SPECIAL OCCASION"},
+ {VCALENDAR_FIELD_CATEGORIES_IMPORTANT, "IMPORTANT"},
+ {VCALENDAR_FIELD_CATEGORIES_BIRTHDAY, "BIRTHDAY"},
+ {VCALENDAR_FIELD_CATEGORIES_MISSCELLANEOUS, "MISSCELLANEOUS"}
+};
+
+static VCALENDAR_FIELD_LIST vcalendar_field_list_status[] = {
+ {VCALENDAR_FIELD_STATUS_NEEDS_ACTION, "NEEDS ACTION"},
+ {VCALENDAR_FIELD_STATUS_COMPLETED, "COMPLETED"}
+};
+
+#endif /* IN_DATASTORE_INFO_VCALENDAR_H_ */
diff --git a/fw-plugin/vcalendar-plugIn/include/encoding_util.h b/fw-plugin/vcalendar-plugIn/include/encoding_util.h
new file mode 100755
index 0000000..ebab0ae
--- /dev/null
+++ b/fw-plugin/vcalendar-plugIn/include/encoding_util.h
@@ -0,0 +1,255 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef ENCODING_UTIL_H_
+#define ENCODING_UTIL_H_
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define QP_SIZE 76
+#define BASE64_SIZE 76
+
+typedef enum {
+ EN_TYPE_NONE = 0,
+ EN_TYPE_QUOTED_PRINTABLE,
+ EN_TYPE_BASE64
+} ENCODING_TYPE;
+
+/* Quoted-Printable
+ *
+ * @example code
+int main()
+{
+ char *src = "안녕하세요";
+ char *encode_src;
+ int encode_src_len = 0;
+ char *decode_src;
+ int decode_src_len = 0;
+
+ int res = encode_QP(src, strlen(src), &encode_src, &encode_src_len);
+ if (res != 0)
+ fprintf(stdout, "encode src : %s ( %d ) \n", encode_src, encode_src_len);
+ else
+ fprintf(stdout, "encode error !! \n");
+
+ res = decode_QP(encode_src, encode_src_len, &decode_src, &decode_src_len);
+ if (res != 0)
+ fprintf(stdout, "decode src : %s ( %d ) \n", decode_src, decode_src_len);
+ else
+ fprintf(stdout, "decode error !! \n");
+
+ return 0;
+}
+
+ */
+
+/*
+ * @brief encode original source ( encoding type : quoted-printable )
+ * @param[in] src original source
+ * @param[in] src_len length of original source
+ * @param[out] en_src encoded source
+ * @param[out] en_src_len length of encoded source
+ * @return operation result
+ * @retval 1 success
+ * @retval 0 fail
+ */
+int encode_QP(char *src, int src_len, char **en_src, int *en_src_len);
+
+/*
+ * @brief decode encoded source ( decoding type : quoted-printable )
+ * @param[in] src encoded source
+ * @param[in] src_len length of encoded source
+ * @param[out] de_src decoded source ( original source )
+ * @param[out] de_src_len length of decoded source
+ * @return operation result
+ * @retval 1 success
+ * @retval 0 fail
+ */
+int decode_QP(char *src, int src_len, char **de_src, int *de_src_len);
+
+/* Base64
+ *
+ * @example code
+
+ int main()
+{
+ char *src = "안녕하세요";
+ char *encode_src;
+ int encode_src_len = 0;
+ char *decode_src;
+ int decode_src_len = 0;
+
+ int res = encode_base64(src, strlen(src), &encode_src, &encode_src_len);
+ if (res != 0)
+ fprintf(stdout, "encode src : %s ( %d ) \n", encode_src, encode_src_len);
+ else
+ fprintf(stdout, "encode error !! \n");
+
+ res = decode_base64(encode_src, encode_src_len, &decode_src, &decode_src_len);
+ if (res != 0)
+ fprintf(stdout, "decode src : %s ( %d ) \n", decode_src, decode_src_len);
+ else
+ fprintf(stdout, "decode error !! \n");
+
+ return 0;
+}
+
+ */
+
+/*
+ * @brief encode original source ( encoding type : base64 )
+ * @param[in] src original source
+ * @param[in] src_len length of original source
+ * @param[out] en_src encoded source
+ * @param[out] en_src_len length of encoded source
+ * @return operation result
+ * @retval 1 success
+ * @retval 0 fail
+ */
+int encode_base64(char *src, int src_len, char **en_src, int *en_src_len);
+
+/*
+ * @brief decode encoded source ( decoding type : base64 )
+ * @param[in] src encoded source
+ * @param[in] src_len length of encoded source
+ * @param[out] de_src decoded source ( original source )
+ * @param[out] de_src_len length of decoded source
+ * @return operation result
+ * @retval 1 success
+ * @retval 0 fail
+ */
+int decode_base64(char *src, int src_len, char **de_src, int *de_src_len);
+
+/*
+ * @brief make the decoding process
+ * @param[in] src encoded source
+ * @param[in] src_len length of encoded source
+ * @param[out] de_src decoded source ( original source )
+ * @param[out] de_src_len length of decoded source
+ * @return operation result
+ * @retval 1 success
+ * @retval 0 fail
+ *
+ * @example code
+
+int main()
+{
+ char *src = "..."; // decoded data
+ int src_len = strlen(src);
+ char *decode_src;
+ int decode_src_len = 0;
+
+ int res = proc_decoding(src, src_len, &decode_src, &decode_src_len);
+
+ if (res != 0)
+ fprintf(stdout, "decode src : \n%s\n", decode_src);
+ else
+ fprintf(stdout, "decode error !! \n");
+
+ if (decode_src != NULL)
+ free(decode_src);
+
+ return 0;
+}
+ */
+int proc_decoding(const char *src, int src_len, char **de_src, int *de_src_len);
+
+/*
+ * @brief encoded value is changed to the decoded value
+ * @param[in] type encoding type
+ * @param[in] value encoded value (end of string must be '\0' !!)
+ * ex) =EA=B9=80;=EC=B2=A0=EC=88=98;;;\0
+ * @param[in] value_size length of encoded value
+ * @param[out] decode_str decoded string
+ * @param[out] decode_str_len length of decoded string
+ * @return operation result
+ * @ratval 1 success
+ * @retval 0 fail
+ *
+ * @example code
+
+ int main()
+ {
+ char *data = "..."; // ex) ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8
+ ENCODING_TYPE type = find_encoding_type((const char *)data);
+
+ char *value = "..."; // ex) =EA=B9=80;=EC=B2=A0=EC=88=98;;;\0
+ int value_size = strlen(value);
+
+ int decode_str_len = 0;
+ char *decode_str = (char*)malloc(sizeof(char)*BUF_SIZE); // BUF_SIZE : user define
+ if (decode_str == NULL) {
+ // error process
+ }
+ memset(decode_str, 0x00, sizeof(char)*BUF_SIZE);
+
+ int res = decode_value(type, value, data_size, &decode_str, &decode_str_len);
+
+ if (res == 1) {
+ // success process
+ if (decode_str != NULL)
+ free(decode_str);
+ } else {
+ // error process
+ if (decode_str != NULL)
+ free(decode_str);
+ }
+
+ return 0;
+ }
+ */
+int decode_value(ENCODING_TYPE type, const char *value, int value_size, char **decode_str, int *decode_str_len);
+
+/*
+ * @brief get encoding type for data
+ * @param[in] data vobject data
+ * @return encoding type
+ * @ratval >= 1 success
+ * @retval 0 fail
+ */
+ENCODING_TYPE find_encoding_type(const char *data);
+
+/*
+ * @brief check whether to exist this string, "ENCODING=" in the data
+ * @param[in] data vobject data
+ * @return operation result
+ * @retval 1 exist
+ * @retval 0 not exist
+ */
+int check_encoding_data(const char *data);
+
+#endif /* ENCODING_UTIL_H_ */
diff --git a/fw-plugin/vcalendar-plugIn/src/PlugIn_Interface.c b/fw-plugin/vcalendar-plugIn/src/PlugIn_Interface.c
new file mode 100755
index 0000000..1d6c53c
--- /dev/null
+++ b/fw-plugin/vcalendar-plugIn/src/PlugIn_Interface.c
@@ -0,0 +1,516 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "encoding_util.h"
+#include "calendar-svc-provider.h"
+
+#include "IN_DataStore_Info_Vcalendar.h"
+
+/* for log */
+#include "agent-framework/Utility/fw_log.h"
+
+#include "agent-framework/PlugIn/DataConverter_Interface.h"
+
+#define LOG_TAG "PLUGIN_DC_VCALENDAR"
+
+static int __free_obj_field_info(Field_Info *field_list, int count);
+static int __set_obj_field_info(Field_Info **field_list, int count, VCALENDAR_FIELD_LIST * input_list);
+static DACI_RETURN __convert_service_error_to_common_error(cal_error err);
+/* static void __print_obj_field_info(Field_Info *info, int count); */
+
+DACI_RETURN Converter(const void *agent_data, void **service_data)
+{
+ FW_LOGV("[dc_vcalendar_plugIn] Start !!");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+ cal_struct *temp_service_data = 0;
+ const char *temp_agent_data = (const char *)agent_data;
+
+ char *decoded_agent_data;
+ int decoded_agent_data_len = 0;
+ int agent_data_len = strlen(agent_data);
+
+ /* Temporary fix for KIES vCalendar X-ALLDAY tag : START */
+ int allday = 0;
+ if (strstr((char *)agent_data, "\r\nX-ALLDAY:SET"))
+ allday = 1;
+ /* Temporary fix for KIES vCalendar X-ALLDAY tag : END */
+
+ /* decoding */
+ if (check_encoding_data(agent_data) == 1) {
+ err = proc_decoding(agent_data, agent_data_len, &decoded_agent_data, &decoded_agent_data_len);
+ if (err != 1) {
+ FW_LOGE("[dc_vcalendar_plugIn] proc_decoding() fail !!");
+ return DACI_ERRORS;
+ }
+
+ /* convert */
+ err = calendar_svc_util_convert_vcs_to_event(decoded_agent_data, decoded_agent_data_len, &temp_service_data);
+
+ /* free memory */
+ if (decoded_agent_data != 0)
+ free(decoded_agent_data);
+ } else {
+ /* convert */
+ err = calendar_svc_util_convert_vcs_to_event(temp_agent_data, strlen(temp_agent_data), &temp_service_data);
+ }
+
+ if (err < CAL_SUCCESS) {
+ FW_LOGV("[dc_vcalendar_plugIn] calendar_svc_util_convert_vcs_to_event() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ *service_data = 0;
+ } else {
+ /* Temporary fix for KIES vCalendar X-ALLDAY tag : START */
+ if (allday) {
+ cal_struct *item = (cal_struct *) temp_service_data;
+
+ FW_LOGI(" CAL_VALUE_INT_ALL_DAY_EVENT = %d ", calendar_svc_struct_get_int(item, CAL_VALUE_INT_ALL_DAY_EVENT));
+
+ if (!calendar_svc_struct_get_int(item, CAL_VALUE_INT_ALL_DAY_EVENT)) {
+ FW_LOGV("[Debug] X-ALLDAY flag set in vCalendar, but not in calendar service structure after conversion !!!");
+ calendar_svc_struct_set_int(item, CAL_VALUE_INT_ALL_DAY_EVENT, 1);
+ }
+ }
+ /* Temporary fix for KIES vCalendar X-ALLDAY tag : END */
+
+ FW_LOGV("[dc_vcalendar_plugIn] calendar_svc_util_convert_vcs_to_event() Success!\n");
+ *service_data = (void *)temp_service_data;
+ }
+
+ FW_LOGV("[dc_vcalendar_plugIn] End !!");
+ return ret;
+}
+
+DACI_RETURN Replace_Converter(void *old_service_data, const void *agent_data, void **new_service_data)
+{
+ FW_LOGV("[dc_vcalendar_plugIn] Start !!");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+ cal_struct *temp_new_service_data = 0;
+ cal_struct *temp_old_service_data = (cal_struct *) old_service_data;
+ const char *temp_agent_data = (const char *)agent_data;
+
+ /* Temporary fix for KIES vCalendar X-ALLDAY tag : START */
+ int allday = 0;
+
+ if (strstr((char *)agent_data, "\r\nX-ALLDAY:SET"))
+ allday = 1;
+ /* Temporary fix for KIES vCalendar X-ALLDAY tag : END */
+
+ /* convert */
+ err = calendar_svc_util_convert_vcs_to_event(temp_agent_data, strlen(temp_agent_data), &temp_new_service_data);
+ if (err < CAL_SUCCESS) {
+ FW_LOGV("[dc_vcalendar_plugIn] calendar_svc_util_convert_vcs_to_event() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ *new_service_data = 0;
+ } else {
+ /* Temporary fix for KIES vCalendar X-ALLDAY tag : START */
+ if (allday) {
+ cal_struct *item = (cal_struct *) temp_new_service_data;
+
+ FW_LOGI(" CAL_VALUE_INT_ALL_DAY_EVENT = %d ", calendar_svc_struct_get_int(item, CAL_VALUE_INT_ALL_DAY_EVENT));
+
+ if (!calendar_svc_struct_get_int(item, CAL_VALUE_INT_ALL_DAY_EVENT)) {
+ FW_LOGV("[Debug] X-ALLDAY flag set in vCalendar, but not in calendar service structure after conversion !!!");
+ calendar_svc_struct_set_int(item, CAL_VALUE_INT_ALL_DAY_EVENT, 1);
+ }
+ }
+ /* Temporary fix for KIES vCalendar X-ALLDAY tag : END */
+
+ FW_LOGV("[dc_vcalendar_plugIn] calendar_svc_util_convert_vcs_to_event() Success!\n");
+ *new_service_data = (void *)temp_new_service_data;
+ }
+
+ /* memory free */
+ if (temp_old_service_data != 0)
+ calendar_svc_struct_free(&temp_old_service_data);
+
+ FW_LOGV("[dc_vcalendar_plugIn] End !!");
+ return ret;
+}
+
+DACI_RETURN Reverse_Converter(void *service_data, void **agent_data)
+{
+ FW_LOGV("[dc_vcalendar_plugIn] Start !!");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+ char *temp_agent_data = 0;
+ cal_struct *temp_service_data = (cal_struct *) service_data;
+ int size = 0;
+
+ /* Temporary fix for KIES vCalendar X-ALLDAY/RRULE/LAST MODIFIED tag : START */
+ int allday = 0;
+ char rrule[30];
+ memset(rrule, 0, 30);
+
+ cal_struct *item = (cal_struct *) temp_service_data;
+
+ FW_LOGI(" CAL_VALUE_INT_ALL_DAY_EVENT = %d ", calendar_svc_struct_get_int(item, CAL_VALUE_INT_ALL_DAY_EVENT));
+
+ if (calendar_svc_struct_get_int(item, CAL_VALUE_INT_ALL_DAY_EVENT)) {
+ FW_LOGV("[Debug] Found X-ALLDAY flag set in calendar service structure before conversion !!!");
+ allday = 1;
+ }
+
+ FW_LOGI(" CAL_VALUE_INT_REPEAT_TERM = %d ", calendar_svc_struct_get_int(item, CAL_VALUE_INT_REPEAT_TERM));
+ FW_LOGI(" CAL_VALUE_INT_REPEAT_INTERVAL = %d ", calendar_svc_struct_get_int(item, CAL_VALUE_INT_REPEAT_INTERVAL));
+
+ if (calendar_svc_struct_get_int(item, CAL_VALUE_INT_REPEAT_TERM) != CAL_REPEAT_NONE) {
+
+ char repeat_end_date[16 + 1] = { 0 };
+ char week_day_string[16 + 1] = { 0 };
+
+ struct tm *tm = calendar_svc_struct_get_tm(item, CAL_VALUE_GMT_REPEAT_END_DATE, CAL_TZ_FLAG_LOCAL);
+
+ memset(repeat_end_date, 0, 17);
+
+ sprintf(repeat_end_date, "%04ld%02d%02dT%02d%02d%02dZ", tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
+
+ FW_LOGI(" repeat_end_date = %s ", repeat_end_date);
+
+ char str[50];
+ memset(str, 0, 50);
+
+ switch (calendar_svc_struct_get_int(item, CAL_VALUE_INT_REPEAT_TERM)) {
+ case CAL_REPEAT_EVERY_DAY:
+ sprintf(str, "D%d %s", calendar_svc_struct_get_int(item, CAL_VALUE_INT_REPEAT_INTERVAL), repeat_end_date);
+ break;
+
+ case CAL_REPEAT_EVERY_WEEK:
+ case CAL_REPEAT_EVERY_WEEKDAYS:{
+ struct tm *tm_start = calendar_svc_struct_get_tm(item, CAL_VALUE_GMT_START_DATE_TIME, CAL_TZ_FLAG_LOCAL);
+
+ char *date_string[7] = { "SU", "MO", "TU", "WE", "TH", "FR", "SA" };
+
+ struct tm temp;
+ time_t t = timegm(tm_start);
+ gmtime_r(&t, &temp);
+
+ if (temp.tm_wday < 0 || temp.tm_wday > 6) {
+ } else {
+ snprintf(week_day_string, 3, date_string[temp.tm_wday]);
+ }
+
+ sprintf(str, "W%d %s %s", calendar_svc_struct_get_int(item, CAL_VALUE_INT_REPEAT_INTERVAL), week_day_string, repeat_end_date);
+ }
+ break;
+
+ case CAL_REPEAT_EVERY_MONTH:
+ case CAL_REPEAT_EVERY_MONTH_DAY:
+ sprintf(str, "MD%d %s", calendar_svc_struct_get_int(item, CAL_VALUE_INT_REPEAT_INTERVAL), repeat_end_date);
+ break;
+
+ case CAL_REPEAT_EVERY_YEAR:
+ case CAL_REPEAT_EVERY_YEAR_DAY:
+ sprintf(str, "YM%d %s", calendar_svc_struct_get_int(item, CAL_VALUE_INT_REPEAT_INTERVAL), repeat_end_date);
+ break;
+
+ default:
+ break;
+ }
+
+ strcat(rrule, "\r\nRRULE:");
+ strcat(rrule, str);
+
+ FW_LOGI(" rrule = %s ", rrule);
+ }
+ int isModifiedTime = 0;
+ char sModifiedTime[16] = { 0, };
+ if (calendar_svc_struct_get_int(item, CAL_VALUE_GMT_LAST_MODIFIED_TIME) != CAL_REPEAT_NONE) {
+ isModifiedTime = 1;
+ /* get the time value */
+ time_t last_modified_time = 0;
+ last_modified_time = calendar_svc_struct_get_time(item, CAL_VALUE_GMT_LAST_MODIFIED_TIME, CAL_TZ_FLAG_GMT);
+
+ struct tm *sometime = localtime(&last_modified_time);
+ if (sometime != 0) {
+ strftime(sModifiedTime, 20, "%Y%m%d%H%M%S", sometime);
+ FW_LOGI("Modified time = %s ", sModifiedTime);
+ }
+ }
+ /* Temporary fix for KIES vCalendar X-ALLDAY/RRULE/LAST MODIFIED tag : END */
+
+ /* Reverse_Converter */
+ err = calendar_svc_util_convert_event_to_vcs(temp_service_data, &temp_agent_data, &size);
+ if (err < CAL_SUCCESS) {
+ FW_LOGV("[dc_vcalendar_plugIn] calendar_svc_util_convert_event_to_vcs() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ *agent_data = 0;
+ } else {
+ /* Temporary fix for KIES vCalendar X-ALLDAY/RRULE tag : START */
+ if (!strstr(temp_agent_data, "\r\nX-ALLDAY:SET") && allday) {
+ char *vevent_loc = strstr(temp_agent_data, "\r\nEND:VEVENT");
+ if (vevent_loc != NULL) {
+ char *mod_data = (char *)calloc(strlen(temp_agent_data) + strlen("\r\nX-ALLDAY:SET") + 1, sizeof(char));
+
+ strncpy(mod_data, temp_agent_data, vevent_loc - temp_agent_data);
+ strcat(mod_data, "\r\nX-ALLDAY:SET");
+ strcat(mod_data, vevent_loc);
+
+ free(temp_agent_data);
+ temp_agent_data = mod_data;
+ }
+ char *dtstart_loc = strstr(temp_agent_data, "\r\nDTSTART:");
+ if (dtstart_loc != NULL) {
+ char *dtstart_Z_loc = dtstart_loc + 25;
+ if (!strncmp(dtstart_Z_loc, "Z", 1))
+ strncpy(dtstart_Z_loc, "\r\r\n", 3);
+ }
+ char *dtend_loc = strstr(temp_agent_data, "\r\nDTEND:");
+ if (dtend_loc != NULL) {
+ char *dtend_z_loc = dtend_loc + 23;
+ if (!strncmp(dtend_z_loc, "Z", 1))
+ strncpy(dtend_z_loc, "\r\r\n", 3);
+ }
+ }
+
+ if (!strstr(temp_agent_data, "\r\nRRULE:") && rrule != NULL) {
+ char *category_loc = strstr(temp_agent_data, "\r\nCATEGORIES:");
+ if (category_loc != NULL) {
+ char *mod_data = (char *)calloc(strlen(temp_agent_data) + strlen(rrule) + 1, sizeof(char));
+
+ strncpy(mod_data, temp_agent_data, category_loc - temp_agent_data);
+ strcat(mod_data, rrule);
+ strcat(mod_data, category_loc);
+
+ free(temp_agent_data);
+ temp_agent_data = mod_data;
+ }
+ }
+
+ if (!strstr(temp_agent_data, "\r\nLAST-MODIFIED:") && sModifiedTime != NULL) {
+ char *category_loc = strstr(temp_agent_data, "\r\nLAST-MODIFIED:");
+ if (category_loc != NULL) {
+ char *mod_data = (char *)calloc(strlen(temp_agent_data) + strlen(sModifiedTime) + 1, sizeof(char));
+
+ strncpy(mod_data, temp_agent_data, category_loc - temp_agent_data);
+ strcat(mod_data, sModifiedTime);
+ strcat(mod_data, category_loc);
+
+ free(temp_agent_data);
+ temp_agent_data = mod_data;
+ }
+ }
+ /* Temporary fix for KIES vCalendar X-ALLDAY/RRULE tag : END */
+ FW_LOGV("[dc_vcalendar_plugIn] calendar_svc_util_convert_event_to_vcs() Success!\n");
+ *agent_data = (void *)temp_agent_data;
+ }
+
+ /* memory free */
+ if (temp_service_data != 0)
+ calendar_svc_struct_free(&temp_service_data);
+
+ FW_LOGV("[dc_vcalendar_plugIn] End !!");
+ return ret;
+}
+
+void *Alloc_Object()
+{
+ FW_LOGV("[dc_vcard_plugIn] not implement !!");
+ return 0;
+}
+
+int Free_Object(void *in_object)
+{
+ FW_LOGV("[dc_vcard_plugIn] not implement !!");
+ return 0;
+}
+
+void *Set_Value_To_Object(void *in_object, int key, char *extension_key, void *value)
+{
+ FW_LOGV("[dc_vcard_plugIn] not implement !!");
+ return 0;
+}
+
+void *Get_Value_To_Object(void *in_object, int key, char *extension_key)
+{
+ FW_LOGV("[dc_vcard_plugIn] not implement !!");
+ return 0;
+}
+
+Object_Info *Get_Obj_Info()
+{
+ Object_Info *obj_info = (Object_Info *)calloc(1, sizeof(Object_Info));
+
+ obj_info->type = VCALENDAR_TYPE;
+ obj_info->version = VCALENDAR_VERSION;
+ obj_info->field_cnt = sizeof(vcalendar_field_list) / sizeof(VCALENDAR_FIELD_LIST);
+
+ if (obj_info->field_cnt > 0)
+ __set_obj_field_info(&(obj_info->field_list), obj_info->field_cnt, vcalendar_field_list);
+
+ return obj_info;
+}
+
+int Free_Obj_Info(Object_Info *obj_info)
+{
+ if (obj_info) {
+ if (obj_info->field_cnt > 0)
+ if (__free_obj_field_info(obj_info->field_list, obj_info->field_cnt) == 0)
+ return 0;
+
+ free(obj_info);
+ }
+
+ return 1;
+}
+
+static int __free_obj_field_info(Field_Info *field_list, int count)
+{
+ int field_count = 0;
+ Field_Info *child = NULL;
+
+ if (field_list) {
+ for (field_count = 0; field_count < count; field_count++) {
+ child = field_list + field_count;
+ if (child->field_child_cnt > 0)
+ if (__free_obj_field_info(child->field_child_list, child->field_child_cnt) == 0)
+ return 0;
+ }
+ free(field_list);
+ }
+
+ return 1;
+}
+
+static int __set_obj_field_info(Field_Info **field_list, int count, VCALENDAR_FIELD_LIST * input_list)
+{
+ int field_count = 0;
+ Field_Info *child = NULL;
+
+ *field_list = (Field_Info *)calloc(count, sizeof(Field_Info));
+
+ for (field_count = 0; field_count < count; field_count++) {
+ child = (*field_list) + field_count;
+ child->field_name = input_list[field_count].field_name;
+ FW_LOGI("[%s]", child->field_name);
+
+ if (input_list[field_count].field_enum == VCALENDAR_FIELD_BEGIN || input_list[field_count].field_enum == VCALENDAR_FIELD_END) {
+ child->field_child_cnt = sizeof(vcalendar_field_list_begin_end) / sizeof(VCALENDAR_FIELD_LIST);
+ FW_LOGI("----------");
+ __set_obj_field_info(&(child->field_child_list), child->field_child_cnt, vcalendar_field_list_begin_end);
+ FW_LOGI("==========");
+ } else if (input_list[field_count].field_enum == VCALENDAR_FIELD_VERSION) {
+ child->field_child_cnt = sizeof(vcalendar_field_list_version) / sizeof(VCALENDAR_FIELD_LIST);
+ FW_LOGI("----------");
+ __set_obj_field_info(&(child->field_child_list), child->field_child_cnt, vcalendar_field_list_version);
+ FW_LOGI("==========");
+ } else if (input_list[field_count].field_enum == VCALENDAR_FIELD_CATEGORIES) {
+ child->field_child_cnt = sizeof(vcalendar_field_list_categories) / sizeof(VCALENDAR_FIELD_LIST);
+ FW_LOGI("----------");
+ __set_obj_field_info(&(child->field_child_list), child->field_child_cnt, vcalendar_field_list_categories);
+ FW_LOGI("==========");
+ } else if (input_list[field_count].field_enum == VCALENDAR_FIELD_STATUS) {
+ child->field_child_cnt = sizeof(vcalendar_field_list_status) / sizeof(VCALENDAR_FIELD_LIST);
+ FW_LOGI("----------");
+ __set_obj_field_info(&(child->field_child_list), child->field_child_cnt, vcalendar_field_list_status);
+ FW_LOGI("==========");
+ }
+ }
+
+ return 1;
+}
+
+static DACI_RETURN __convert_service_error_to_common_error(cal_error err)
+{
+ DACI_RETURN ret = DACI_SUCCESS;
+ FW_LOGV("[da_calendar_plugIn] Error Code : %d\n", err);
+
+ switch (err) {
+ case CAL_ERR_DB_LOCK: /* -204 */
+ ret = DACI_ERR_LOCKED;
+ break;
+ case CAL_ERR_DB_RECORD_NOT_FOUND: /* -203 */
+ case CAL_ERR_NO_DATA: /* -3 */
+ ret = DACI_ERR_NO_DATA;
+ break;
+ case CAL_ERR_DB_NOT_OPENED: /* -201 */
+ ret = DACI_ERR_OPEN_FAILED;
+ break;
+ case CAL_ERR_OUT_OF_MEMORY: /* -8 */
+ ret = DACI_ERR_MEMORY_FULL;
+ break;
+ case CAL_ERR_ALREADY_EXIST: /* -7 */
+ ret = DACI_ERR_ALREADY_EXIST;
+ break;
+ case CAL_ERR_EVENT_START_DATE: /* -405 */
+ case CAL_ERR_EVENT_END_DATE: /* -404 */
+ case CAL_ERR_EVENT_REPEAT_END_DATE: /* -403 */
+ case CAL_ERR_EVENT_DURATION: /* -402 */
+ case CAL_ERR_EVENT_REPEAT_DURATION_TOO_SHORT: /* -401 */
+ case CAL_ERR_INVALID_DATA_TYPE: /* -301 */
+ case CAL_ERR_ARG_NULL: /* -5 */
+ case CAL_ERR_ARG_INVALID: /* -4 */
+ ret = DACI_ERR_INVALID_CONTENT;
+ break;
+ case CAL_ERR_FINISH_ITER: /* -2 */
+ case CAL_SUCCESS: /* 0 */
+ case CAL_TRUE: /* 1 */
+ ret = DACI_SUCCESS;
+ break;
+ /*
+ * CAL_ERR_DB_FAILED: -202,
+ * CAL_ERR_VCONF_FAILED: -102,
+ * CAL_ERR_VOBJECT_FAILED: -101,
+ * CAL_ERR_EXCEEDED_LIMIT: -9,
+ * CAL_ERR_ENV_INVALID: -6, CAL_ERR_FAIL: -1,
+ */
+ default:
+ ret = DACI_ERRORS;
+ break;
+ }
+
+ return ret;
+}
+
+/*
+static void __print_obj_field_info(Field_Info *info, int count)
+{
+ int i = 0;
+ if (info)
+ for (i = 0; i < count; i++) {
+ printf("[%s]\n", info[i].field_name);
+ if (info[i].field_child_list)
+ printf(info[i].field_child_list, info[i].field_child_cnt);
+ }
+}
+*/
diff --git a/fw-plugin/vcalendar-plugIn/src/encoding_util.c b/fw-plugin/vcalendar-plugIn/src/encoding_util.c
new file mode 100755
index 0000000..7208106
--- /dev/null
+++ b/fw-plugin/vcalendar-plugIn/src/encoding_util.c
@@ -0,0 +1,775 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#include "encoding_util.h"
+
+/* for log */
+#include "agent-framework/Utility/fw_log.h"
+#define LOG_TAG "ENCODING_UTIL"
+
+#define TYPE_CHECK_BUF_SIZE 100 /* temporary definition */
+
+/* BASE64 TABLE */
+static char base64_table[65] = {
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
+ 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
+ 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a',
+ 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+ 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1',
+ '2', '3', '4', '5', '6', '7', '8', '9', '+',
+ '/', '='
+};
+
+/* Quoted-Printable */
+static char *__dec2hex(int dec);
+static int __hex2dec(char *hex);
+
+/* Base64 */
+static int __find_base(char ch);
+
+/*
+ * Quoted-Printable
+ */
+int encode_QP(char *src, int src_len, char **en_src, int *en_src_len)
+{
+ char *en_hex;
+ int i = 0;
+ int j = 0;
+ int size_cnt = 0;
+
+ if (src == NULL) {
+ FW_LOGE("[encoding_util] src is NULL\n");
+ return 0;
+ }
+
+ /*encoded string length is three times longer than existing maximum string length */
+ int full_lenth = src_len * 3 + 1 + (int)(src_len * 3 / 76) * 3;
+ *en_src = (char *)malloc(sizeof(char) * full_lenth);
+ if (*en_src == 0x00) {
+ FW_LOGE("[encoding_util] malloc fail !!\n");
+ return 0;
+ }
+ memset(*en_src, 0x00, src_len * 3 + 1);
+
+ FW_LOGV("[encoding_util] src_len : %d\n", src_len);
+ for (i = 0; i < src_len; i++) {
+ /* FW_LOGV("[encoding_util] i : %d\n", i); */
+ if (size_cnt >= QP_SIZE - 3) {
+ size_cnt = 0;
+ (*en_src)[j++] = 0x3D;
+ (*en_src)[j++] = 0x0D;
+ (*en_src)[j++] = 0x0A;
+ }
+
+ if ((src[i] >= 33 && src[i] <= 126) || (src[i] == 0x0A) || (src[i] == 0x0D)) {
+ if (src[i] == 61 || src[i] == 0x0A || src[i] == 0x0D) {
+ en_hex = __dec2hex(src[i]);
+ (*en_src)[j++] = 0x3D; /* '=' */
+ (*en_src)[j++] = en_hex[0];
+ (*en_src)[j++] = en_hex[1];
+ size_cnt += 3;
+ } else {
+ size_cnt++;
+ (*en_src)[j++] = src[i];
+ }
+ } else if (src[i] == 9 || src[i] == 32) {
+ if (src[i + 1] == 0x0A || src[i + 1] == 0x00) { /* TAB or WhiteSpace */
+ en_hex = __dec2hex(src[i]);
+ (*en_src)[j++] = 0x3D; /* '=' */
+ (*en_src)[j++] = en_hex[0];
+ (*en_src)[j++] = en_hex[1];
+ size_cnt += 3;
+ } else {
+ size_cnt++;
+ (*en_src)[j++] = src[i];
+ }
+ } else {
+ en_hex = __dec2hex(src[i]);
+ (*en_src)[j++] = 0x3D; /* '=' */
+ (*en_src)[j++] = en_hex[0];
+ (*en_src)[j++] = en_hex[1];
+ FW_LOGV("[encoding_util] en_src : %s\n", *en_src);
+ size_cnt += 3;
+ }
+ }
+
+ (*en_src)[j] = 0x00;
+ *en_src_len = size_cnt;
+
+ return 1;
+}
+
+int decode_QP(char *src, int src_len, char **de_src, int *de_src_len)
+{
+ char hex[3];
+ char ch;
+ int dec = 0;
+ int i = 0;
+ int j = 0;
+
+ if (src == NULL) {
+ FW_LOGE("[encoding_util] src is NULL\n");
+ return 0;
+ }
+
+ *de_src = (char *)malloc(sizeof(char) * (src_len + 1));
+ if (*de_src == 0x00) {
+ FW_LOGE("[encoding_util] malloc is fail !!\n");
+ return 0;
+ }
+ memset(*de_src, 0x00, sizeof(char) * (src_len + 1));
+
+ while (src[i] != '\0') {
+ if (src[i] == 0x3D) { /* '=' */
+ /* check whiteSpace */
+ ch = src[++i];
+
+ /* '=' skip if next character is a TAB or WhiteSpace */
+ while (ch == 0x09 || ch == 0x20) {
+ ch = src[++i];
+ continue;
+ }
+
+ /* '=' skip if next character is 3D which means '=' (encoding error case ??)*/
+ while (ch == '3') {
+ ch = src[++i];
+
+ if (ch == 'D') {
+ ch = src[++i];
+ continue;
+ }
+ }
+
+ /* if next character is LF after '=' do doft line break
+ * encoded QP string on one line 76 character is allowed
+ */
+ if (ch == 0x0D) { /* LF */
+ ch = src[++i];
+ if (ch == 0x0A) {
+ ch = src[++i];
+ continue;
+ }
+ }
+
+ hex[0] = src[i++];
+ hex[1] = src[i++];
+ hex[2] = '\0';
+
+ dec = __hex2dec(hex);
+
+ /* decoding error */
+ if (dec < 0) {
+ /* when error occur, restore the previous encoding message */
+ (*de_src)[j++] = 0x3D; /* '=' */
+ (*de_src)[j++] = hex[0];
+ (*de_src)[j++] = hex[1];
+ } else {
+ (*de_src)[j++] = dec;
+ }
+ } else if (src[i] > 0x7E) { /* encoding error */
+ i++; /* ignore that character */
+ } else {
+ (*de_src)[j++] = src[i++];
+ }
+ }
+
+ (*de_src)[j] = '\0';
+ *de_src_len = j;
+
+ return 1;
+}
+
+static char *__dec2hex(int dec)
+{
+ static char hex[3];
+ int i;
+ int ch;
+
+ for (i = 0; i < 2; i++) {
+ if (i == 0) {
+ ch = (dec & 0xF0) >> 4;
+ } else if (i == 1) {
+ ch = (dec & 0x0F);
+ }
+
+ if (ch >= 10) {
+ hex[i] = 'A' + ch - 10;
+ } else {
+ hex[i] = '0' + ch;
+ }
+ }
+
+ hex[i] = 0x00;
+
+ FW_LOGV("[encoding_util] hex : %s\n", hex);
+
+ return &hex[0];
+}
+
+static int __hex2dec(char *hex)
+{
+ int dec = 0;
+ int byte;
+ int i = 0;
+
+ for (i = 0; i < 2; i++) {
+ if (hex[i] >= '0' && hex[i] <= '9') {
+ byte = hex[i] - '0';
+ } else if (hex[i] >= 'A' && hex[i] <= 'F') {
+ byte = hex[i] - 'A' + 10;
+ } else if (hex[i] >= 'a' && hex[i] <= 'f') {
+ byte = hex[i] - 'a' + 10;
+ } else {
+ byte = -1;
+ }
+
+ if (byte < 0)
+ return -1;
+
+ dec += (i == 0) ? byte << 4 : byte;
+ }
+
+ return dec;
+}
+
+/*
+ * Base64
+ */
+int encode_base64(char *src, int src_len, char **en_src, int *en_src_len)
+{
+ int i = 0;
+ int j = 0;
+ int cnt = 0;
+ int ch = 0;
+ int size_cnt = 0;
+
+ if (src == NULL) {
+ FW_LOGE("[encoding_util] src is NULL\n");
+ return 0;
+ }
+
+ *en_src = (char *)malloc(sizeof(char) * (src_len * 2));
+ if (*en_src == NULL) {
+ FW_LOGE("[encoding_util] malloc error !!");
+ return 0;
+ }
+ memset(*en_src, 0x00, src_len * 2);
+
+ if (*en_src == 0x00) {
+ FW_LOGE("[encoding_util] malloc fail !!\n");
+ return 0;
+ }
+
+ while (1) {
+ switch (cnt++) {
+ case 0:
+ {
+ if (i < src_len) {
+ ch = (src[i] & 0xFC) >> 2;
+ } else {
+ ch = -1;
+ }
+ }
+ break;
+
+ case 1:
+ {
+ if (i < src_len) {
+ if (i + 1 < src_len) {
+ ch = ((src[i] & 0x03) << 4) | ((src[i + 1] & 0xF0) >> 4);
+ } else {
+ ch = ((src[i] & 0x03) << 4);
+ }
+ } else {
+ ch = -1;
+ }
+ i++;
+ break;
+ }
+
+ case 2:
+ {
+ if (i < src_len) {
+ if (i + 1 < src_len) {
+ ch = ((src[i] & 0x0F) << 2) | ((src[i] & 0xC0) >> 6);
+ } else {
+ ch = ((src[i] & 0x0F) << 2);
+ }
+ } else {
+ ch = -1;
+ }
+ i++;
+ }
+ break;
+
+ case 3:
+ {
+ if (i < src_len) {
+ ch = (src[i] & 0x3F);
+ } else {
+ ch = -1;
+ }
+ i++;
+ cnt = 0;
+ }
+ break;
+ }
+
+ /*
+ if (ch >= 0 && ch <= 25) { // Upper Case Alphabet
+ (*en_src)[j++] = 'A' + ch;
+ } else if (ch >= 26 && ch <= 51) { // Lower Case Alphabet
+ (*en_src)[j++] = 'a' + ch - 26;
+ } else if (ch >= 52 && ch <= 61) { // Digit
+ (*en_src)[j++] = '0' + ch - 52;
+ } else if (ch == 62) {
+ (*en_src)[j++] = '+';
+ } else if (ch == 63) {
+ (*en_src)[j++] = '/';
+ } else if (ch == -1) {
+ (*en_src)[j++] = '='; // padding
+ }
+ */
+
+ if ((ch != -1) && (ch >= 0 && ch <= 64)) {
+ (*en_src)[j++] = base64_table[ch];
+ } else {
+ (*en_src)[j++] = base64_table[64]; /* padding */
+ }
+
+ size_cnt++;
+
+ if (j % 4 == 0) {
+ if (size_cnt == BASE64_SIZE) {
+ size_cnt = 0;
+ (*en_src)[j++] = 0x0A; /* soft line break */
+ }
+
+ if (i >= src_len)
+ break;
+ }
+ }
+
+ (*en_src)[j] = 0x00;
+ *en_src_len = j;
+
+ return 1;
+}
+
+int decode_base64(char *src, int src_len, char **de_src, int *de_src_len)
+{
+ long tmp = 0; /* 4byte (using decoding) */
+ int i = 0;
+ int j = 0;
+ int cnt = 0;
+ int pad_cnt = 0;
+
+ if (src == NULL) {
+ FW_LOGE("[encoding_util] src is NULL\n");
+ return 0;
+ }
+
+ /* de_src is enough for the src_len 3/4 size */
+ *de_src = (char *)malloc(sizeof(char) * (src_len));
+ if (*de_src == NULL) {
+ FW_LOGE("malloc error !!");
+ return 0;
+ }
+ memset(*de_src, 0x00, src_len);
+
+ if (*de_src == 0x00) {
+ FW_LOGE("[encoding_util] malloc is fail !!\n");
+ return 0;
+ }
+
+ while (src[i] != '\0') {
+ /*
+ if (isupper(src[i])) {
+ tmp = (tmp << 6) | (src[i] - 'A'); // Upper case : 0 ~ 25
+ } else if (islower(src[i])) {
+ tmp = (tmp << 6) | (src[i] - 'a' + 0x1A); // Lower case : 26(0x1A) ~ 51
+ } else if (isdigit(src[i])) {
+ tmp = (tmp << 6) | (src[i] - '0' + 0x34); // Number : 52(0x34) ~ 61
+ } else if (src[i] == '+') {
+ tmp = (tmp << 6) | 0x3E; // '+' : 62(0x3E)
+ } else if (src[i] == '/') {
+ tmp = (tmp << 6) | 0x3F; // '/' : 63(0x3F)
+ } else if (src[i] == '=') {
+ pad_cnt++;
+ tmp = (tmp << 6); // '=' : padding
+ } else {
+ tmp = (tmp << 6); // encoding error
+ fFW_LOGV(stdout, "encoding error !! \n");
+ }
+ */
+
+ tmp = (tmp << 6) | (__find_base(src[i]));
+ if (tmp == 64) {
+ pad_cnt++;
+ } else if (tmp == -1) {
+ FW_LOGE("[encoding_util] encoding error \n");
+ }
+
+ if (++cnt >= 4) {
+ (*de_src)[j++] = (char)((tmp & 0x00FF0000) >> 16);
+ (*de_src)[j++] = (char)((tmp & 0x0000FF00) >> 8);
+ (*de_src)[j++] = (char)(tmp & 0x000000FF);
+
+ cnt = 0;
+ tmp = 0;
+
+ if (src[i + 1] == 0x0A) { /* soft line break */
+ i++;
+ }
+ }
+
+ i++;
+ }
+
+ (*de_src)[j - pad_cnt] = '\0';
+ *de_src_len = j - pad_cnt;
+
+ return 1;
+}
+
+int proc_decoding(const char *src, int src_len, char **de_src, int *de_src_len)
+{
+ FW_LOGV("[encoding_util] Start \n");
+
+ const char *reg_src = NULL;
+ reg_src = src;
+
+ FW_LOGV("[encoding_util] << src >> \n%s\n", src);
+
+ *de_src = (char *)malloc(sizeof(char) * (src_len + 1));
+ if (*de_src == NULL) {
+ FW_LOGV("[encoding_util] malloc error !! \n");
+
+ return 0;
+ }
+ memset(*de_src, 0x00, sizeof(char) * (src_len + 1));
+
+ char colon[] = ":";
+ char line_breaker[] = "\r\n";
+ char *start_decoding = NULL;
+ int data_size = 0;
+ int res = 0;
+ int de_temp_len = 0;
+
+ char *de_temp = (char *)malloc(sizeof(char) * src_len); /* todo : temporary */
+ if (de_temp == NULL) {
+ FW_LOGE("[encoding_util] malloc error !!\n");
+
+ if (*de_src != NULL)
+ free(*de_src);
+
+ return 0;
+ }
+
+ while ((start_decoding = strstr(src, "ENCODING="))) {
+ char *charset_loc = strstr(src, "CHARSET=");
+ char *colon_loc = strstr(start_decoding, colon); /* find ':''s location */
+ char *line_breaker_loc = 0;
+
+ /*edited code for line beaker */
+ char *colon_loc_temp = colon_loc;
+ while (line_breaker_loc == NULL) {
+ line_breaker_loc = strstr(colon_loc_temp, line_breaker); /* find "\r\n"'s location */
+ if (line_breaker_loc > colon_loc_temp && !strncmp(line_breaker_loc - 1, "=", 1)) {
+ colon_loc_temp = line_breaker_loc + 1;
+ line_breaker_loc = 0;
+ }
+ }
+
+ /*
+ * if find "ENCODING=" do strcat data until ":" to de_src
+ */
+ if (charset_loc != NULL) {
+ if (start_decoding > charset_loc) { /* CHARSET=UTF-8;ENCODING=abcxx: */
+ data_size = (charset_loc - 1) - src;
+ } else { /* ENCODING=abcxxx;CHARSET=UTF-8: */
+ data_size = (start_decoding - 1) - src;
+ }
+ } else {
+ data_size = (start_decoding - 1) - src;
+ }
+
+ char *temp = (char *)malloc(sizeof(char) * (data_size + 1));
+ if (temp == NULL) {
+ FW_LOGE("[encoding_util] malloc error !!");
+
+ if (*de_src != NULL)
+ free(*de_src);
+
+ if (de_temp != NULL)
+ free(de_temp);
+
+ return 0;
+ }
+ memset(temp, 0x00, sizeof(char) * (data_size + 1));
+ memcpy(temp, src, data_size);
+
+ strcat(*de_src, temp);
+ (*de_src)[strlen(*de_src)] = ':';
+ if (temp != NULL)
+ free(temp);
+
+ FW_LOGV("[encoding_util] << *de_src >> \n %s\n", *de_src);
+
+ /*
+ * copy data from ":" until "\r\n"(actual encoding stream)
+ */
+ data_size = line_breaker_loc - colon_loc; /* from ':' until "\r\n" + '\0' */
+ char *value = (char *)malloc(sizeof(char) * (data_size + 1));
+ if (value == NULL) {
+ FW_LOGE("[encoding_util] malloc error !!\n");
+
+ if (*de_src != NULL)
+ free(*de_src);
+
+ if (de_temp != NULL)
+ free(de_temp);
+
+ return 0;
+ }
+ memset(value, 0x00, sizeof(char) * (data_size + 1));
+ memcpy(value, ++colon_loc, data_size); /* from ':' until "\r\n" */
+ value[data_size] = '\0';
+ FW_LOGV("[encoding_util] data len is [%d] and value is [%s]\n\n", data_size, value);
+ /*
+ * Get encoding type using data from "ENCODING=" to ":"
+ */
+ char type_check[TYPE_CHECK_BUF_SIZE] = { 0, };
+ int type_check_size = colon_loc - start_decoding;
+ strncpy(type_check, start_decoding, type_check_size);
+ FW_LOGV("[encoding_util] type check : %s\n", type_check);
+ ENCODING_TYPE type = find_encoding_type((const char *)type_check);
+
+ /*
+ * Process decoding by passing the actual value and encoding type to decode_value()
+ */
+ de_temp_len = 0;
+ memset(de_temp, 0x00, sizeof(char) * src_len); /* todo : temporary */
+
+ res = decode_value(type, value, data_size, &de_temp, &de_temp_len);
+
+ if (res != 1) {
+ FW_LOGE("[encoding_util] decode_value error !!\n");
+
+ if (*de_src != NULL)
+ free(*de_src);
+
+ if (de_temp != NULL)
+ free(de_temp);
+
+ return 0;
+ }
+
+ /*
+ * Append decoded data to de_src
+ */
+ FW_LOGV("[encoding_util] de_temp : %s\n", de_temp);
+ strcat(*de_src, de_temp);
+
+ /*
+ * find "ENCODING=" since "\r\n" agina
+ */
+ src = line_breaker_loc;
+
+ if (value != NULL)
+ free(value);
+ }
+
+ strcat(*de_src, src); /* Append remain character */
+ *de_src_len = strlen(*de_src);
+ FW_LOGV("[encoding_util] changed src : \n%s ( %d ) \n", *de_src, *de_src_len);
+
+ if (de_temp != NULL)
+ free(de_temp);
+
+ FW_LOGV("[encoding_util] End \n");
+
+ return 1;
+}
+
+int check_encoding_data(const char *data)
+{
+ if (strstr(data, "ENCODING=") != NULL) {
+ FW_LOGV("[encoding_util] exist encoding data !! \n");
+ return 1;
+ } else {
+ FW_LOGV("[encoding_util] not exist encoding data !! \n");
+ return 0;
+ }
+}
+
+ENCODING_TYPE find_encoding_type(const char *data)
+{
+ FW_LOGV("[encoding_util] Start !! \n");
+
+ ENCODING_TYPE type = EN_TYPE_NONE;
+ if (strstr(data, "QUOTED-PRINTABLE") != NULL) {
+ FW_LOGV("[encoding_util] type : QP\n");
+ type = EN_TYPE_QUOTED_PRINTABLE;
+ } else if (strstr(data, "BASE64") != NULL) {
+ FW_LOGV("[encoding_util] type : BASE64\n");
+ type = EN_TYPE_BASE64;
+ } else {
+ FW_LOGV("[encoding_util] not supported type !! \n");
+ }
+
+ FW_LOGV("[encoding_util] End !! \n");
+
+ return type;
+}
+
+int decode_value(ENCODING_TYPE type, const char *value, int value_size, char **decode_str, int *decode_str_len)
+{
+ FW_LOGV("[encoding_util] Start !! \n");
+
+ int res = 1;
+ const char *start_pos = NULL;
+ const char *cursor = NULL;
+ int semi_cnt = 0;
+
+ /*
+ * ex> value - =EA=B9=80;=EC=B2=A0=EC=88=98;;;\0
+ */
+ cursor = value;
+ start_pos = value;
+
+ while (*cursor != '\0') {
+ if ((*cursor != ';') && (*(cursor + 1) != '\0')) {
+ cursor++;
+ continue;
+ } else if (*cursor == ';') {
+ semi_cnt++;
+ }
+
+ int data_size = 0;
+ if (*cursor == ';')
+ data_size = cursor - start_pos;
+ else /* case of [*(cursor+1)=='\0'] */
+ data_size = cursor + 1 - start_pos;
+
+ if (data_size == 0) {
+ cursor++;
+ start_pos++;
+ } else {
+ char *temp = (char *)malloc(sizeof(char) * (value_size + 1));
+ if (temp == NULL) {
+ FW_LOGE("[encoding_util] malloc error !!");
+ return 0;
+ }
+ memset(temp, 0x00, sizeof(char) * (value_size + 1));
+ memcpy(temp, start_pos, data_size);
+
+ FW_LOGV("[encoding_util] temp : %s \n", temp);
+
+ char *decoding = 0;
+ int decoding_len = 0;
+
+ switch (type) {
+ case EN_TYPE_QUOTED_PRINTABLE:
+ res = decode_QP(temp, data_size, &decoding, &decoding_len);
+ if (temp != NULL)
+ free(temp);
+ break;
+ case EN_TYPE_BASE64:
+ res = decode_base64(temp, data_size, &decoding, &decoding_len);
+ if (temp != NULL)
+ free(temp);
+ break;
+ default:
+ break;
+ }
+
+ FW_LOGV("[encoding_util] decoding : %s ( %d )\n", decoding, decoding_len);
+
+ if (res != 1) {
+ FW_LOGE("[encoding_util] decoding error !! \n");
+
+ if (decoding != NULL)
+ free(decoding);
+
+ res = 0;
+ return res;
+ }
+
+ strcat(*decode_str, decoding);
+
+ FW_LOGV("[encoding_util] *decode_str : %s\n", *decode_str);
+
+ if (decoding != NULL)
+ free(decoding);
+
+ cursor++;
+ start_pos = cursor;
+ }
+
+ if (semi_cnt > 0) {
+ int len = strlen(*decode_str);
+ (*decode_str)[len] = ';';
+ FW_LOGV("[encoding_util] *decode_str : %s ( %d )\n", *decode_str, strlen(*decode_str));
+ semi_cnt--;
+ }
+ }
+
+ *decode_str_len = strlen(*decode_str);
+
+ FW_LOGV("[encoding_util] *decode_str : %s ( %d )\n", *decode_str, *decode_str_len);
+
+ FW_LOGV("[encoding_util] End !! \n");
+
+ return res;
+}
+
+static int __find_base(char ch)
+{
+ FW_LOGV("[encoding_util] Start !! \n");
+
+ int i = 0;
+ for (i = 0; i < 65; i++) {
+ if (base64_table[i] == ch) {
+ FW_LOGV("[encoding_util] End !! \n");
+ return i;
+ }
+ }
+
+ FW_LOGV("[encoding_util] End !! \n");
+
+ return -1;
+}
diff --git a/fw-plugin/vcard-plugIn/.cproject b/fw-plugin/vcard-plugIn/.cproject
new file mode 100755
index 0000000..3c36d31
--- /dev/null
+++ b/fw-plugin/vcard-plugIn/.cproject
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?>
+
+<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="org.eclipse.cdt.core.default.config.2033120496">
+ <storageModule buildSystemId="org.eclipse.cdt.core.defaultConfigDataProvider" id="org.eclipse.cdt.core.default.config.2033120496" moduleId="org.eclipse.cdt.core.settings" name="Configuration">
+ <externalSettings/>
+ <extensions>
+ <extension id="com.samsung.limo.SboxELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="com.samsung.limo.SboxGCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="com.samsung.limo.SboxMakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ <storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
+ <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
+ <storageModule moduleId="org.eclipse.cdt.core.pathentry">
+ <pathentry kind="src" path="include"/>
+ <pathentry kind="src" path="src"/>
+ <pathentry excluding="include|src" kind="src" path=""/>
+ <pathentry kind="out" path=""/>
+ </storageModule>
+ </cconfiguration>
+ </storageModule>
+</cproject>
diff --git a/fw-plugin/vcard-plugIn/.project b/fw-plugin/vcard-plugIn/.project
new file mode 100755
index 0000000..a133f37
--- /dev/null
+++ b/fw-plugin/vcard-plugIn/.project
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>vcard-plugIn</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>com.samsung.slp2.SboxBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>com.samsung.slp2.SboxBuilder.needConfigure</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.core.errorOutputParser</key>
+ <value>org.eclipse.cdt.core.MakeErrorParser;com.samsung.limo.SboxGCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser;</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.append_environment</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.arguments</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.command</key>
+ <value>make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.auto</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.clean</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.build.target.inc</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.environment</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>com.samsung.slp2.cnature</nature>
+ </natures>
+</projectDescription>
diff --git a/fw-plugin/vcard-plugIn/CMakeLists.src b/fw-plugin/vcard-plugIn/CMakeLists.src
new file mode 100755
index 0000000..04ce4aa
--- /dev/null
+++ b/fw-plugin/vcard-plugIn/CMakeLists.src
@@ -0,0 +1 @@
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRCS)
diff --git a/fw-plugin/vcard-plugIn/CMakeLists.sub b/fw-plugin/vcard-plugIn/CMakeLists.sub
new file mode 100755
index 0000000..4f36946
--- /dev/null
+++ b/fw-plugin/vcard-plugIn/CMakeLists.sub
@@ -0,0 +1,37 @@
+#################################################################################
+# THIS FILE IS CREATED AUTOMATICALLY. DO NOT DELETE OR MODIFY THIS FILE.
+#################################################################################
+
+INCLUDE(CMakeLists.src)
+
+## PROJECT NAME
+PROJECT(plugin-dc-vcard C)
+
+## PACKAGE CONFIG
+SET(SLP_PKGCONFIG_LIST "contacts-service")
+
+## INCLUDES
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../framework/include)
+
+## DEFINITIONS
+ADD_DEFINITIONS("-DAPP_DIR=\"${CMAKE_INSTALL_PREFIX}\"")
+
+## LIBRARY PATH
+SET(SLP_LD_PATH_FLAGS "")
+
+## LIBRARY
+SET(SLP_LD_FLAGS "")
+
+## DEBUG
+SET(SLP_DEBUG_FLAGS "-g")
+
+## OPTIMIZATION
+SET(SLP_OPT_FLAGS "-O0")
+
+## COMPILER FLAGS
+SET(SLP_COMPILER_FLAGS "")
+
+## LINKER FLAGS
+SET(SLP_LINKER_FLAGS "")
+
diff --git a/fw-plugin/vcard-plugIn/CMakeLists.txt b/fw-plugin/vcard-plugIn/CMakeLists.txt
new file mode 100755
index 0000000..7c63f08
--- /dev/null
+++ b/fw-plugin/vcard-plugIn/CMakeLists.txt
@@ -0,0 +1,33 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+
+# INCLUDE SUB CMAKELIST FILE
+INCLUDE(CMakeLists.sub)
+
+SET(RESOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/res")
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs_plugin_vcard REQUIRED ${SLP_PKGCONFIG_LIST})
+
+FOREACH(flag ${pkgs_plugin_vcard_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+SET(CMAKE_CXX_FLAGS "${SLP_DEBUG_FLAGS} ${SLP_OPT_FLAGS} ${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} ${SLP_COMPILER_FLAGS}")
+
+ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS})
+
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_plugin_vcard_LDFLAGS} ${SLP_LD_PATH_FLAGS} ${SLP_LD_FLAGS} ${SLP_LINKER_FLAGS} sync-agent-framework)
+
+# INSTALL
+INSTALL(TARGETS ${PROJECT_NAME} DESTINATION lib)
+#INSTALL(DIRECTORY ${RESOURCE_DIR}/data DESTINATION share)
+
+#added by KTS for install to the system
+#CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY)
+#INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig)
+
+
+# INCLUDE LAYOUT DIRECTORY
+# ADD_SUBDIRECTORY(layout)
+#ADD_SUBDIRECTORY(res/locale)
diff --git a/fw-plugin/vcard-plugIn/include/IN_DataStore_Info_Vcard.h b/fw-plugin/vcard-plugIn/include/IN_DataStore_Info_Vcard.h
new file mode 100755
index 0000000..443ae58
--- /dev/null
+++ b/fw-plugin/vcard-plugIn/include/IN_DataStore_Info_Vcard.h
@@ -0,0 +1,174 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Wook Choi <wook.choi@samsung.com>
+ */
+
+#ifndef IN_DATASTORE_INFO_VCARD_H_
+#define IN_DATASTORE_INFO_VCARD_H_
+
+#define VCARD_TYPE "text/x-vcard"
+#define VCARD_VERSION "2.1"
+
+typedef enum {
+ VCARD_FIELD_BEGIN = 10,
+ VCARD_FIELD_END,
+ VCARD_FIELD_VERSION,
+ VCARD_FIELD_FN,
+ VCARD_FIELD_N,
+ VCARD_FIELD_NICKNAME,
+ VCARD_FIELD_PHOTO,
+ VCARD_FIELD_BDAY,
+ VCARD_FIELD_ADR,
+ VCARD_FIELD_LABEL,
+ VCARD_FIELD_TEL,
+ VCARD_FIELD_EMAIL,
+ VCARD_FIELD_TITLE,
+ VCARD_FIELD_ROLE,
+ VCARD_FIELD_ORG,
+ VCARD_FIELD_NOTE,
+ VCARD_FIELD_REV,
+ VCARD_FIELD_UID,
+ VCARD_FIELD_URL,
+ VCARD_FIELD_X_ANNIVERSARY,
+ VCARD_FIELD_X_IRMC_LUID,
+
+} VCARD_FIELD;
+
+typedef enum {
+ VCARD_FIELD_ADR_DOM = 100,
+ VCARD_FIELD_ADR_INTL,
+ VCARD_FIELD_ADR_HOME,
+ VCARD_FIELD_ADR_WORK,
+ VCARD_FIELD_ADR_POSTAL,
+ VCARD_FIELD_ADR_PARCEL,
+ VCARD_FIELD_ADR_PREF,
+
+} VCARD_FIELD_ADR_SUB;
+
+typedef enum {
+ VCARD_FIELD_TEL_HOME = 200,
+ VCARD_FIELD_TEL_MSG,
+ VCARD_FIELD_TEL_WORK,
+ VCARD_FIELD_TEL_VOICE,
+ VCARD_FIELD_TEL_FAX,
+ VCARD_FIELD_TEL_CELL,
+ VCARD_FIELD_TEL_VIDEO,
+ VCARD_FIELD_TEL_PAGER,
+ VCARD_FIELD_TEL_BBS,
+ VCARD_FIELD_TEL_MODEM,
+ VCARD_FIELD_TEL_CAR,
+ VCARD_FIELD_TEL_ISDN,
+ VCARD_FIELD_TEL_PCS,
+ VCARD_FIELD_TEL_PREF,
+
+} VCARD_FIELD_TEL_SUB;
+
+typedef enum {
+ VCARD_FIELD_EMAIL_HOME = 300,
+ VCARD_FIELD_EMAIL_WORK,
+ VCARD_FIELD_EMAIL_PREF,
+
+} VCARD_FIELD_EMAIL_SUB;
+
+typedef struct VCARD_FIELD_LIST VCARD_FIELD_LIST;
+struct VCARD_FIELD_LIST {
+ int field_enum;
+ char *field_name;
+};
+
+static VCARD_FIELD_LIST vcard_field_list[] = {
+ {VCARD_FIELD_BEGIN, "BEGIN"},
+ {VCARD_FIELD_END, "END"},
+ {VCARD_FIELD_VERSION, "VERSION"},
+ {VCARD_FIELD_FN, "FN"},
+ {VCARD_FIELD_N, "N"},
+ {VCARD_FIELD_NICKNAME, "NICKNAME"},
+ {VCARD_FIELD_PHOTO, "PHOTO"},
+ {VCARD_FIELD_BDAY, "BDAY"},
+ {VCARD_FIELD_ADR, "ADR"},
+ {VCARD_FIELD_LABEL, "LABEL"},
+ {VCARD_FIELD_TEL, "TEL"},
+ {VCARD_FIELD_EMAIL, "EMAIL"},
+ {VCARD_FIELD_TITLE, "TITLE"},
+ {VCARD_FIELD_ROLE, "ROLE"},
+ {VCARD_FIELD_ORG, "ORG"},
+ {VCARD_FIELD_NOTE, "NOTE"},
+ {VCARD_FIELD_REV, "REV"},
+ {VCARD_FIELD_UID, "UID"},
+ {VCARD_FIELD_URL, "URL"},
+ {VCARD_FIELD_X_ANNIVERSARY, "X-ANNIVERSARY"},
+ {VCARD_FIELD_X_IRMC_LUID, "X-IRMC-LUID"}
+};
+
+static VCARD_FIELD_LIST vcard_field_list_adr[] = {
+ {VCARD_FIELD_ADR_DOM, "DOM"},
+ {VCARD_FIELD_ADR_INTL, "INTL"},
+ {VCARD_FIELD_ADR_HOME, "HOME"},
+ {VCARD_FIELD_ADR_WORK, "WORK"},
+ {VCARD_FIELD_ADR_POSTAL, "POSTAL"},
+ {VCARD_FIELD_ADR_PARCEL, "PARCEL"},
+ {VCARD_FIELD_ADR_PREF, "PREF"}
+};
+
+static VCARD_FIELD_LIST vcard_field_list_tel[] = {
+ {VCARD_FIELD_TEL_HOME, "HOME"},
+ {VCARD_FIELD_TEL_MSG, "MSG"},
+ {VCARD_FIELD_TEL_WORK, "WORK"},
+ {VCARD_FIELD_TEL_VOICE, "VOICE"},
+ {VCARD_FIELD_TEL_FAX, "FAX"},
+ {VCARD_FIELD_TEL_CELL, "CELL"},
+ {VCARD_FIELD_TEL_VIDEO, "VIDEO"},
+ {VCARD_FIELD_TEL_PAGER, "PAGER"},
+ {VCARD_FIELD_TEL_BBS, "BBS"},
+ {VCARD_FIELD_TEL_MODEM, "MODEM"},
+ {VCARD_FIELD_TEL_CAR, "CAR"},
+ {VCARD_FIELD_TEL_ISDN, "ISDN"},
+ {VCARD_FIELD_TEL_PCS, "PCS"},
+ {VCARD_FIELD_TEL_PREF, "PREF"}
+};
+
+static VCARD_FIELD_LIST vcard_field_list_email[] = {
+ {VCARD_FIELD_EMAIL_HOME, "HOME"},
+ {VCARD_FIELD_EMAIL_WORK, "WORK"},
+ {VCARD_FIELD_EMAIL_PREF, "PREF"}
+};
+
+static VCARD_FIELD_LIST vcard_field_list_begin_end[] = {
+ {-1, "VCARD"}
+};
+
+static VCARD_FIELD_LIST vcard_field_list_version[] = {
+ {-1, VCARD_VERSION}
+};
+
+#endif /* IN_DATASTORE_INFO_VCARD_H_ */
diff --git a/fw-plugin/vcard-plugIn/include/PlugIn_Spec.h b/fw-plugin/vcard-plugIn/include/PlugIn_Spec.h
new file mode 100755
index 0000000..6b8ca52
--- /dev/null
+++ b/fw-plugin/vcard-plugIn/include/PlugIn_Spec.h
@@ -0,0 +1,83 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#ifndef PLUGIN_SPEC_H_
+#define PLUGIN_SPEC_H_
+
+typedef enum {
+
+ VCARD_CONTENT_NO_TYPE = 0,
+ VCARD_CONTENT_EXTENSION = 1,
+ VCARD_CONTENT_FN = 2,
+ VCARD_CONTENT_N = 3,
+ VCARD_CONTENT_NICKNAME = 4,
+ VCARD_CONTENT_PHOTO = 5,
+ VCARD_CONTENT_BDAY = 6,
+ VCARD_CONTENT_ADR = 7,
+ VCARD_CONTENT_LABEL = 8,
+ VCARD_CONTENT_TEL = 9,
+ VCARD_CONTENT_EMAIL = 10,
+ VCARD_CONTENT_TITLE = 11,
+ VCARD_CONTENT_ROLE = 12,
+ VCARD_CONTENT_ORG = 13,
+ VCARD_CONTENT_NOTE = 14,
+ VCARD_CONTENT_REV = 15,
+ VCARD_CONTENT_UID = 16,
+ VCARD_CONTENT_URL = 17,
+ VCARD_CONTENT_X_ANNIVERSARY = 18,
+ VCARD_CONTENT_X_IRMC_LUID = 19,
+
+/*
+ VCARD_CONTENT_NAME,
+ VCARD_CONTENT_PROFILE,
+ VCARD_CONTENT_SOURCE,
+ VCARD_CONTENT_MAILER,
+ VCARD_CONTENT_TZ,
+ VCARD_CONTENT_GEO,
+ VCARD_CONTENT_LOGO,
+ VCARD_CONTENT_AGENT,
+ VCARD_CONTENT_CATEGORIES,
+ VCARD_CONTENT_PRODID,
+ VCARD_CONTENT_SORT-STRING,
+ VCARD_CONTENT_SOUND,
+ VCARD_CONTENT_VERSION,
+ VCARD_CONTENT_CLASS,
+ VCARD_CONTENT_KEY,
+ VCARD_CONTENT_X_CHILDREN,
+*/
+
+} VCARD_VALUE_TYPE;
+
+#endif /* PLUGIN_SPEC_H_ */
diff --git a/fw-plugin/vcard-plugIn/include/encoding_util.h b/fw-plugin/vcard-plugIn/include/encoding_util.h
new file mode 100755
index 0000000..b6fcc22
--- /dev/null
+++ b/fw-plugin/vcard-plugIn/include/encoding_util.h
@@ -0,0 +1,255 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#ifndef ENCODING_UTIL_H_
+#define ENCODING_UTIL_H_
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define QP_SIZE 76
+#define BASE64_SIZE 76
+
+typedef enum {
+ EN_TYPE_NONE = 0,
+ EN_TYPE_QUOTED_PRINTABLE,
+ EN_TYPE_BASE64
+} ENCODING_TYPE;
+
+/* Quoted-Printable
+*
+* @example code
+int main()
+{
+char *src = "안녕하세요";
+char *encode_src;
+int encode_src_len = 0;
+char *decode_src;
+int decode_src_len = 0;
+
+int res = encode_QP(src, strlen(src), &encode_src, &encode_src_len);
+if (res != 0)
+fprintf(stdout, "encode src : %s ( %d ) \n", encode_src, encode_src_len);
+else
+fprintf(stdout, "encode error !! \n");
+
+res = decode_QP(encode_src, encode_src_len, &decode_src, &decode_src_len);
+if (res != 0)
+fprintf(stdout, "decode src : %s ( %d ) \n", decode_src, decode_src_len);
+else
+fprintf(stdout, "decode error !! \n");
+
+return 0;
+}
+
+*/
+
+/*
+* @brief encode original source ( encoding type : quoted-printable )
+* @param[in] src original source
+* @param[in] src_len length of original source
+* @param[out] en_src encoded source
+* @param[out] en_src_len length of encoded source
+* @return operation result
+* @retval 1 success
+* @retval 0 fail
+*/
+int encode_QP(char *src, int src_len, char **en_src, int *en_src_len);
+
+/*
+* @brief decode encoded source ( decoding type : quoted-printable )
+* @param[in] src encoded source
+* @param[in] src_len length of encoded source
+* @param[out] de_src decoded source ( original source )
+* @param[out] de_src_len length of decoded source
+* @return operation result
+* @retval 1 success
+* @retval 0 fail
+*/
+int decode_QP(char *src, int src_len, char **de_src, int *de_src_len);
+
+/* Base64
+*
+* @example code
+
+int main()
+{
+char *src = "안녕하세요";
+char *encode_src;
+int encode_src_len = 0;
+char *decode_src;
+int decode_src_len = 0;
+
+int res = encode_base64(src, strlen(src), &encode_src, &encode_src_len);
+if (res != 0)
+fprintf(stdout, "encode src : %s ( %d ) \n", encode_src, encode_src_len);
+else
+fprintf(stdout, "encode error !! \n");
+
+res = decode_base64(encode_src, encode_src_len, &decode_src, &decode_src_len);
+if (res != 0)
+fprintf(stdout, "decode src : %s ( %d ) \n", decode_src, decode_src_len);
+else
+fprintf(stdout, "decode error !! \n");
+
+return 0;
+}
+
+*/
+
+/*
+* @brief encode original source ( encoding type : base64 )
+* @param[in] src original source
+* @param[in] src_len length of original source
+* @param[out] en_src encoded source
+* @param[out] en_src_len length of encoded source
+* @return operation result
+* @retval 1 success
+* @retval 0 fail
+*/
+int encode_base64(char *src, int src_len, char **en_src, int *en_src_len);
+
+/*
+* @brief decode encoded source ( decoding type : base64 )
+* @param[in] src encoded source
+* @param[in] src_len length of encoded source
+* @param[out] de_src decoded source ( original source )
+* @param[out] de_src_len length of decoded source
+* @return operation result
+* @retval 1 success
+* @retval 0 fail
+*/
+int decode_base64(char *src, int src_len, char **de_src, int *de_src_len);
+
+/*
+* @brief make the decoding process
+* @param[in] src encoded source
+* @param[in] src_len length of encoded source
+* @param[out] de_src decoded source ( original source )
+* @param[out] de_src_len length of decoded source
+* @return operation result
+* @retval 1 success
+* @retval 0 fail
+*
+* @example code
+
+int main()
+{
+char *src = "..."; // decoded data
+int src_len = strlen(src);
+char *decode_src;
+int decode_src_len = 0;
+
+int res = proc_decoding(src, src_len, &decode_src, &decode_src_len);
+
+if (res != 0)
+fprintf(stdout, "decode src : \n%s\n", decode_src);
+else
+fprintf(stdout, "decode error !! \n");
+
+if (decode_src != NULL)
+free(decode_src);
+
+return 0;
+}
+*/
+int proc_decoding(const char *src, int src_len, char **de_src, int *de_src_len);
+
+/*
+* @brief encoded value is changed to the decoded value
+* @param[in] type encoding type
+* @param[in] value encoded value (end of string must be '\0' !!)
+* ex) =EA=B9=80;=EC=B2=A0=EC=88=98;;;\0
+* @param[in] value_size length of encoded value
+* @param[out] decode_str decoded string
+* @param[out] decode_str_len length of decoded string
+* @return operation result
+* @ratval 1 success
+* @retval 0 fail
+*
+* @example code
+
+int main()
+{
+char *data = "..."; // ex) ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8
+ENCODING_TYPE type = find_encoding_type((const char *)data);
+
+char *value = "..."; // ex) =EA=B9=80;=EC=B2=A0=EC=88=98;;;\0
+int value_size = strlen(value);
+
+int decode_str_len = 0;
+char *decode_str = (char*)malloc(sizeof(char)*BUF_SIZE); // BUF_SIZE : user define
+if (decode_str == NULL) {
+// error process
+}
+memset(decode_str, 0x00, sizeof(char)*BUF_SIZE);
+
+int res = decode_value(type, value, data_size, &decode_str, &decode_str_len);
+
+if (res == 1) {
+// success process
+if (decode_str != NULL)
+free(decode_str);
+} else {
+// error process
+if (decode_str != NULL)
+free(decode_str);
+}
+
+return 0;
+}
+*/
+int decode_value(ENCODING_TYPE type, const char *value, int value_size, char **decode_str, int *decode_str_len);
+
+/*
+* @brief get encoding type for data
+* @param[in] data vobject data
+* @return encoding type
+* @ratval >= 1 success
+* @retval 0 fail
+*/
+ENCODING_TYPE find_encoding_type(const char *data);
+
+/*
+* @brief check whether to exist this string, "ENCODING=" in the data
+* @param[in] data vobject data
+* @return operation result
+* @retval 1 exist
+* @retval 0 not exist
+*/
+int check_encoding_data(const char *data);
+
+#endif /* ENCODING_UTIL_H_ */
diff --git a/fw-plugin/vcard-plugIn/src/PlugIn_Interface.c b/fw-plugin/vcard-plugIn/src/PlugIn_Interface.c
new file mode 100755
index 0000000..2a0625c
--- /dev/null
+++ b/fw-plugin/vcard-plugIn/src/PlugIn_Interface.c
@@ -0,0 +1,546 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * JungWook Ryu <jungwook.ryu@samsung.com>
+ */
+
+#include <stdio.h>
+#include <contacts-svc.h>
+#include <glib.h>
+
+#include "PlugIn_Spec.h"
+#include "IN_DataStore_Info_Vcard.h"
+
+#include "encoding_util.h"
+
+/* for log */
+#include "agent-framework/Utility/fw_log.h"
+
+#include "agent-framework/PlugIn/DataConverter_Interface.h"
+
+#define LOG_TAG "PLUGIN_DC_VCARD"
+
+static int __free_obj_field_info(Field_Info *field_list, int count);
+static int __set_obj_field_info(Field_Info **field_list, int count, VCARD_FIELD_LIST * input_list);
+static char *__convert_key_name(int key);
+
+static int __get_content(const char *value, void *data);
+
+static DACI_RETURN __convert_service_error_to_common_error(cts_error err);
+static void __remove_vcard_field(CTSstruct *contact);
+static void __remove_vcard_gslist_field(gpointer data, gpointer user_data);
+
+DACI_RETURN Converter(const void *agent_data, void **service_data)
+{
+ FW_LOGV("[dc_vcard_plugIn] Start !!");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+ CTSstruct *temp_service_data = 0;
+
+ /* decoding & convert */
+ FW_LOGV("[dc_vcard_plugIn] agent data : %s\n", agent_data);
+ char *de_agent_data;
+ int src_len = strlen(agent_data);
+ int de_agent_data_len = 0;
+
+ if (check_encoding_data(agent_data) == 1) {
+ err = proc_decoding(agent_data, src_len, &de_agent_data, &de_agent_data_len);
+ if (err == 0) {
+ FW_LOGE("[dc_vcard_plugIn] proc_decoding() Fail!\n");
+ ret = DACI_ERRORS;
+ return ret;
+ }
+
+ err = contacts_svc_get_contact_from_vcard((const void *)de_agent_data, &temp_service_data);
+
+ /*memory free */
+ if (de_agent_data != 0)
+ free(de_agent_data);
+ } else {
+ err = contacts_svc_get_contact_from_vcard(agent_data, &temp_service_data);
+ }
+
+ if (err < CTS_SUCCESS) {
+ FW_LOGE("[dc_vcard_plugIn] contacts_svc_get_contact_from_vcard() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ *service_data = 0;
+ } else {
+ FW_LOGV("[dc_vcard_plugIn] contacts_svc_get_contact_from_vcard() Success!\n");
+ *service_data = (void *)temp_service_data;
+ }
+
+ FW_LOGV("[dc_vcard_plugIn] End !!");
+ return ret;
+}
+
+DACI_RETURN Replace_Converter(void *old_service_data, const void *agent_data, void **new_service_data)
+{
+ FW_LOGV("[dc_vcard_plugIn] Start !!");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+ CTSstruct *temp_new_service_data = 0;
+ CTSstruct *temp_old_service_data = (CTSstruct *)old_service_data;
+
+ /* 1. agent_data encoding check
+ * 2. decoding
+ * 3. new_service_dataì— ë³µì‚¬
+ */
+ /* decoding */
+ char *de_agent_data;
+ int src_len = strlen(agent_data);
+ int de_agent_data_len = 0;
+
+ if (check_encoding_data(agent_data) == 1) {
+ err = proc_decoding(agent_data, src_len, &de_agent_data, &de_agent_data_len);
+ if (err == 0) {
+ FW_LOGE("[dc_vcard_plugIn] proc_decoding() Fail!\n");
+/* ret = DACI_ERRORS;
+ return ret;*/
+ err = contacts_svc_get_contact_from_vcard(agent_data, &temp_new_service_data);
+ } else {
+ FW_LOGV("[dc_vcard_plugIn] proc_decoding() Success l!\n");
+ err = contacts_svc_get_contact_from_vcard((const void *)de_agent_data, &temp_new_service_data);
+
+ /*memory free */
+ if (de_agent_data != 0)
+ free(de_agent_data);
+ }
+ } else {
+ err = contacts_svc_get_contact_from_vcard(agent_data, &temp_new_service_data);
+ }
+
+ if (err < CTS_SUCCESS) {
+ FW_LOGE("[dc_vcard_plugIn] contacts_svc_get_contact_from_vcard() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ *new_service_data = 0;
+
+ /* memory free */
+ if (temp_old_service_data != 0)
+ contacts_svc_struct_free(temp_old_service_data);
+
+ } else {
+ FW_LOGV("[dc_vcard_plugIn] contacts_svc_get_contact_from_vcard() Success!\n");
+ __remove_vcard_field(temp_old_service_data);
+ err = contacts_svc_struct_merge(temp_old_service_data, temp_new_service_data);
+ if (err < CTS_SUCCESS) {
+ FW_LOGE("[dc_vcard_plugIn] contacts_svc_struct_merge() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ *new_service_data = 0;
+
+ /* memory free */
+ if (temp_old_service_data != 0)
+ contacts_svc_struct_free(temp_old_service_data);
+ } else {
+ FW_LOGV("[dc_vcard_plugIn] contacts_svc_struct_merge() Success!\n");
+ *new_service_data = (void *)temp_old_service_data;
+ }
+ }
+
+ /* memory free */
+ if (temp_new_service_data != 0)
+ contacts_svc_struct_free(temp_new_service_data);
+
+ FW_LOGV("[dc_vcard_plugIn] End !!");
+ return ret;
+}
+
+DACI_RETURN Reverse_Converter(void *service_data, void **agent_data)
+{
+ FW_LOGV("[dc_vcard_plugIn] Start !!");
+
+ DACI_RETURN ret = DACI_SUCCESS;
+ int err = 0;
+ char *temp_agent_data = 0;
+ CTSstruct *temp_service_data = (CTSstruct *)service_data;
+
+ /* Reverse_Converter */
+ err = contacts_svc_get_vcard_from_contact(temp_service_data, &temp_agent_data);
+ if (err < CTS_SUCCESS) {
+ FW_LOGV("[dc_vcard_plugIn] contacts_svc_get_vcard_from_contact() Fail!\n");
+ ret = __convert_service_error_to_common_error(err);
+ *agent_data = 0;
+ } else {
+ FW_LOGV("[dc_vcard_plugIn] contacts_svc_get_vcard_from_contact() Success!\n");
+ *agent_data = (void *)temp_agent_data;
+ }
+
+ /* memory free */
+ if (temp_service_data != 0)
+ contacts_svc_struct_free(temp_service_data);
+
+ FW_LOGV("[dc_vcard_plugIn] End !!");
+ return ret;
+}
+
+void *Alloc_Object()
+{
+ FW_LOGV("[dc_vcard_plugIn] Start !!");
+
+ char *agent_data = "BEGIN:VCARD\r\n\
+VERSION:2.1\r\n\
+END:VCARD";
+
+ FW_LOGV("[dc_vcard_plugIn] End !!");
+ return (void *)agent_data;
+}
+
+int Free_Object(void *in_object)
+{
+ FW_LOGV("[dc_vcard_plugIn] Start !!");
+ FW_LOGV("[dc_vcard_plugIn] Do nothing\n");
+
+ return 1;
+}
+
+void *Set_Value_To_Object(void *in_object, int key, char *extension_key, void *value)
+{
+ FW_LOGV("[dc_vcard_plugIn] Start !!");
+
+ char *new_agent_data = 0;
+ char *key_name = 0;
+
+ if (key == VCARD_CONTENT_NO_TYPE)
+ return (void *)new_agent_data;
+ else if (key == VCARD_CONTENT_EXTENSION)
+ key_name = extension_key;
+ else
+ key_name = __convert_key_name(key);
+
+ new_agent_data = contacts_svc_vcard_put_content((const char *)in_object, (const char *)key_name, (const char *)value);
+
+ FW_LOGV("[dc_vcard_plugIn] End !!");
+ return (void *)new_agent_data;
+}
+
+void *Get_Value_To_Object(void *in_object, int key, char *extension_key)
+{
+ FW_LOGV("[dc_vcard_plugIn] Start !!");
+
+ char data[5000] = { 0, }; /* hard coding : size 1000 */
+ char *key_name = 0;
+
+ if (key == VCARD_CONTENT_NO_TYPE)
+ return 0;
+ else if (key == VCARD_CONTENT_EXTENSION)
+ key_name = extension_key;
+ else
+ key_name = __convert_key_name(key);
+
+ contacts_svc_vcard_get_content((const char *)in_object, (const char *)key_name, __get_content, data);
+
+ FW_LOGV("[dc_vcard_plugIn] End !!");
+
+ if (strlen(data) == 0)
+ return 0;
+ else
+ return strdup(data);
+}
+
+Object_Info *Get_Obj_Info()
+{
+ Object_Info *obj_info = (Object_Info *)calloc(1, sizeof(Object_Info));
+
+ obj_info->type = VCARD_TYPE;
+ obj_info->version = VCARD_VERSION;
+ obj_info->field_cnt = sizeof(vcard_field_list) / sizeof(VCARD_FIELD_LIST);
+
+ if (obj_info->field_cnt > 0)
+ __set_obj_field_info(&(obj_info->field_list), obj_info->field_cnt, vcard_field_list);
+
+ return obj_info;
+}
+
+int Free_Obj_Info(Object_Info *obj_info)
+{
+ if (obj_info) {
+ if (obj_info->field_cnt > 0)
+ if (__free_obj_field_info(obj_info->field_list, obj_info->field_cnt) == 0)
+ return 0;
+
+ free(obj_info);
+ }
+
+ return 1;
+}
+
+static int __free_obj_field_info(Field_Info *field_list, int count)
+{
+ int field_count = 0;
+ Field_Info *child = NULL;
+
+ if (field_list) {
+ for (field_count = 0; field_count < count; field_count++) {
+ child = field_list + field_count;
+ if (child->field_child_cnt > 0)
+ if (__free_obj_field_info(child->field_child_list, child->field_child_cnt) == 0)
+ return 0;
+ }
+ free(field_list);
+ }
+
+ return 1;
+}
+
+static int __set_obj_field_info(Field_Info **field_list, int count, VCARD_FIELD_LIST * input_list)
+{
+ int field_count = 0;
+ Field_Info *child = NULL;
+
+ *field_list = (Field_Info *)calloc(count, sizeof(Field_Info));
+
+ for (field_count = 0; field_count < count; field_count++) {
+ child = (*field_list) + field_count;
+ child->field_name = input_list[field_count].field_name;
+ FW_LOGI("[%s]", child->field_name);
+
+ if (input_list[field_count].field_enum == VCARD_FIELD_BEGIN || input_list[field_count].field_enum == VCARD_FIELD_END) {
+ child->field_child_cnt = sizeof(vcard_field_list_begin_end) / sizeof(VCARD_FIELD_LIST);
+ FW_LOGI("----------");
+ __set_obj_field_info(&(child->field_child_list), child->field_child_cnt, vcard_field_list_begin_end);
+ FW_LOGI("==========");
+ } else if (input_list[field_count].field_enum == VCARD_FIELD_VERSION) {
+ child->field_child_cnt = sizeof(vcard_field_list_version) / sizeof(VCARD_FIELD_LIST);
+ FW_LOGI("----------");
+ __set_obj_field_info(&(child->field_child_list), child->field_child_cnt, vcard_field_list_version);
+ FW_LOGI("==========");
+ } else if (input_list[field_count].field_enum == VCARD_FIELD_ADR) {
+ child->field_child_cnt = sizeof(vcard_field_list_adr) / sizeof(VCARD_FIELD_LIST);
+ FW_LOGI("----------");
+ __set_obj_field_info(&(child->field_child_list), child->field_child_cnt, vcard_field_list_adr);
+ FW_LOGI("==========");
+ } else if (input_list[field_count].field_enum == VCARD_FIELD_TEL) {
+ child->field_child_cnt = sizeof(vcard_field_list_tel) / sizeof(VCARD_FIELD_LIST);
+ FW_LOGI("----------");
+ __set_obj_field_info(&(child->field_child_list), child->field_child_cnt, vcard_field_list_tel);
+ FW_LOGI("==========");
+ } else if (input_list[field_count].field_enum == VCARD_FIELD_EMAIL) {
+ child->field_child_cnt = sizeof(vcard_field_list_email) / sizeof(VCARD_FIELD_LIST);
+ FW_LOGI("----------");
+ __set_obj_field_info(&(child->field_child_list), child->field_child_cnt, vcard_field_list_email);
+ FW_LOGI("==========");
+ }
+ }
+
+ return 1;
+}
+
+static char *__convert_key_name(int key)
+{
+ char *key_name = 0;
+
+ switch (key) {
+ case VCARD_CONTENT_FN:
+ key_name = "FN";
+ break;
+ case VCARD_CONTENT_N:
+ key_name = "N";
+ break;
+ case VCARD_CONTENT_NICKNAME:
+ key_name = "NICKNAME";
+ break;
+ case VCARD_CONTENT_PHOTO:
+ key_name = "PHOTO";
+ break;
+ case VCARD_CONTENT_BDAY:
+ key_name = "BDAY";
+ break;
+ case VCARD_CONTENT_ADR:
+ key_name = "ADR";
+ break;
+ case VCARD_CONTENT_LABEL:
+ key_name = "LABEL";
+ break;
+ case VCARD_CONTENT_TEL:
+ key_name = "TEL";
+ break;
+ case VCARD_CONTENT_EMAIL:
+ key_name = "EMAIL";
+ break;
+ case VCARD_CONTENT_TITLE:
+ key_name = "TITLE";
+ break;
+ case VCARD_CONTENT_ROLE:
+ key_name = "ROLE";
+ break;
+ case VCARD_CONTENT_ORG:
+ key_name = "ORG";
+ break;
+ case VCARD_CONTENT_NOTE:
+ key_name = "NOTE";
+ break;
+ case VCARD_CONTENT_REV:
+ key_name = "REV";
+ break;
+ case VCARD_CONTENT_UID:
+ key_name = "UID";
+ break;
+ case VCARD_CONTENT_URL:
+ key_name = "URL";
+ break;
+ case VCARD_CONTENT_X_ANNIVERSARY:
+ key_name = "X-ANNIVERSARY";
+ break;
+ case VCARD_CONTENT_X_IRMC_LUID:
+ key_name = "X-IRMC-LUID";
+ break;
+ default:
+ break;
+ }
+
+ return key_name;
+}
+
+static int __get_content(const char *value, void *data)
+{
+ const char *line_breaker = "\r";
+ char *colon_loc = 0;
+ char *line_breaker_loc = 0;
+ int data_size = 0;
+
+ colon_loc = (char *)value;
+ line_breaker_loc = strstr(colon_loc, line_breaker);
+ data_size = line_breaker_loc - colon_loc;
+ FW_LOGV("[dc_vcard_plugIn] value : %s", value);
+ FW_LOGV("[dc_vcard_plugIn] colon_loc : %s", colon_loc);
+ FW_LOGV("[dc_vcard_plugIn] line_breaker_loc : %s", line_breaker_loc);
+ FW_LOGV("[dc_vcard_plugIn] data_size : %d", data_size);
+
+ /* hard coding : size 5000 */
+ memcpy((char *)data, colon_loc, data_size);
+
+ return 1;
+}
+
+static DACI_RETURN __convert_service_error_to_common_error(cts_error err)
+{
+ DACI_RETURN ret = DACI_SUCCESS;
+ FW_LOGV("[dc_vcard_plugIn] Error Code : %d\n", err);
+
+ switch (err) {
+ case CTS_ERR_DB_LOCK: /* -204 */
+ ret = DACI_ERR_LOCKED;
+ break;
+ case CTS_ERR_DB_RECORD_NOT_FOUND: /* -203 */
+ case CTS_ERR_NO_DATA: /* -3 */
+ ret = DACI_ERR_NO_DATA;
+ break;
+ case CTS_ERR_DB_NOT_OPENED: /* -201 */
+ ret = DACI_ERR_OPEN_FAILED;
+ break;
+ case CTS_ERR_NO_SPACE: /* -13 */
+ case CTS_ERR_OUT_OF_MEMORY: /* -8 */
+ ret = DACI_ERR_MEMORY_FULL;
+ break;
+ case CTS_ERR_ALREADY_EXIST: /* -7 */
+ ret = DACI_ERR_ALREADY_EXIST;
+ break;
+ case CTS_ERR_ARG_NULL: /* -5 */
+ case CTS_ERR_ARG_INVALID: /* -4 */
+ ret = DACI_ERR_INVALID_CONTENT;
+ break;
+ case CTS_ERR_FINISH_ITER: /* -2 */
+ case CTS_SUCCESS: /* 0 */
+ case CTS_TRUE: /* 1 */
+ ret = DACI_SUCCESS;
+ break;
+ /*
+ * CTS_ERR_DB_FAILED: -202, CTS_ERR_VCONF_FAILED: -102,
+ * CTS_ERR_VOBJECT_FAILED: -101, CTS_ERR_IO_ERR: -12,
+ * CTS_ERR_ALREADY_RUNNING: -10, CTS_ERR_EXCEEDED_LIMIT: -9,
+ * CTS_ERR_ENV_INVALID: -6, CTS_ERR_FAIL: -1,
+ */
+ default:
+ ret = DACI_ERRORS;
+ break;
+ }
+
+ return ret;
+}
+
+static void __remove_vcard_field(CTSstruct *contact)
+{
+ GSList *numbers = 0, *email = 0, *event = 0, *postal = 0, *web = 0, *nick = 0;
+ CTSvalue *name = 0, *company = 0, *base = 0;
+
+ /* free name */
+ contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &name);
+ contacts_svc_value_set_str(name, CTS_NAME_VAL_FIRST_STR, 0);
+ contacts_svc_value_set_str(name, CTS_NAME_VAL_LAST_STR, 0);
+ contacts_svc_value_set_str(name, CTS_NAME_VAL_ADDITION_STR, 0);
+ contacts_svc_value_set_str(name, CTS_NAME_VAL_SUFFIX_STR, 0);
+ contacts_svc_value_set_str(name, CTS_NAME_VAL_PREFIX_STR, 0);
+ contacts_svc_value_set_str(name, CTS_NAME_VAL_DISPLAY_STR, 0);
+
+ /* free company */
+ contacts_svc_struct_get_value(contact, CTS_VALUE_COMPANY, &company);
+ contacts_svc_value_set_str(company, CTS_COMPANY_VAL_NAME_STR, 0);
+ contacts_svc_value_set_str(company, CTS_COMPANY_VAL_DEPARTMENT_STR, 0);
+ contacts_svc_value_set_str(company, CTS_COMPANY_VAL_JOB_TITLE_STR, 0);
+ contacts_svc_value_set_str(company, CTS_COMPANY_VAL_ROLE_STR, 0);
+
+ /* free base */
+ contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &base);
+ contacts_svc_value_set_str(base, CTS_BASE_VAL_IMG_PATH_STR, 0);
+ contacts_svc_value_set_str(base, CTS_BASE_VAL_FULL_IMG_PATH_STR, 0);
+ contacts_svc_value_set_str(base, CTS_BASE_VAL_NOTE_STR, 0);
+
+ /* free number */
+ contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &numbers);
+ g_slist_foreach(numbers, __remove_vcard_gslist_field, (gpointer) CTS_NUM_VAL_DELETE_BOOL);
+
+ /* free email */
+ contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &email);
+ g_slist_foreach(email, __remove_vcard_gslist_field, (gpointer) CTS_EMAIL_VAL_DELETE_BOOL);
+
+ /* free event */
+ contacts_svc_struct_get_list(contact, CTS_CF_EVENT_LIST, &event);
+ g_slist_foreach(event, __remove_vcard_gslist_field, (gpointer) CTS_EVENT_VAL_DELETE_BOOL);
+
+ /* free postal */
+ contacts_svc_struct_get_list(contact, CTS_CF_POSTAL_ADDR_LIST, &postal);
+ g_slist_foreach(postal, __remove_vcard_gslist_field, (gpointer) CTS_POSTAL_VAL_DEFAULT_BOOL);
+
+ /* free web */
+ contacts_svc_struct_get_list(contact, CTS_CF_WEB_ADDR_LIST, &web);
+ g_slist_foreach(web, __remove_vcard_gslist_field, (gpointer) CTS_WEB_VAL_DELETE_BOOL);
+
+ /* free nick */
+ contacts_svc_struct_get_list(contact, CTS_CF_NICKNAME_LIST, &nick);
+ g_slist_foreach(nick, __remove_vcard_gslist_field, (gpointer) CTS_NICKNAME_VAL_DELETE_BOOL);
+}
+
+static void __remove_vcard_gslist_field(gpointer data, gpointer user_data)
+{
+ contacts_svc_value_set_bool((CTSvalue *) data, (int)user_data, 1);
+}
diff --git a/fw-plugin/vcard-plugIn/src/encoding_util.c b/fw-plugin/vcard-plugIn/src/encoding_util.c
new file mode 100755
index 0000000..12db548
--- /dev/null
+++ b/fw-plugin/vcard-plugIn/src/encoding_util.c
@@ -0,0 +1,758 @@
+/*
+ * sync-agent-framework
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JuHak Park <juhaki.park@samsung.com>,
+ * JuneHyuk Lee <junhyuk7.lee@samsung.com>,
+ * SunBong Ha <sunbong.ha@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+/*
+ * For any sort of issue you concern as to this software,
+ * you may use following point of contact.
+ * All resources contributed on this software
+ * are orinigally written by S-Core Inc., a member of Samsung Group.
+ *
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ */
+
+#include "encoding_util.h"
+
+/* for log */
+#include "agent-framework/Utility/fw_log.h"
+#define LOG_TAG "ENCODING_UTIL"
+
+#define TYPE_CHECK_BUF_SIZE 500 /* temporary definition */
+
+/* BASE64 TABLE */
+static char base64_table[65] = {
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
+ 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
+ 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a',
+ 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+ 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1',
+ '2', '3', '4', '5', '6', '7', '8', '9', '+',
+ '/', '='
+};
+
+/* Quoted-Printable */
+static char *__dec2hex(int dec);
+static int __hex2dec(char *hex);
+
+/* Base64 */
+static int __find_base(char ch);
+
+/*
+ * Quoted-Printable
+ */
+int encode_QP(char *src, int src_len, char **en_src, int *en_src_len)
+{
+ char *en_hex;
+ int i = 0;
+ int j = 0;
+ int size_cnt = 0;
+
+ if (src == NULL) {
+ FW_LOGE("[encoding_util] src is NULL\n");
+ return 0;
+ }
+
+ /*encoded string length is three times longer than existing maximum string length */
+ int full_lenth = src_len * 3 + 1 + (int)(src_len * 3 / 76) * 3;
+ *en_src = (char *)malloc(sizeof(char) * full_lenth);
+ if (*en_src == 0x00) {
+ FW_LOGE("[encoding_util] malloc fail !!\n");
+ return 0;
+ }
+ memset(*en_src, 0x00, src_len * 3 + 1);
+
+ FW_LOGV("[encoding_util] src_len : %d\n", src_len);
+ for (i = 0; i < src_len; i++) {
+ /* FW_LOGV("[encoding_util] i : %d\n", i); */
+ if (size_cnt >= QP_SIZE - 3) {
+ size_cnt = 0;
+ (*en_src)[j++] = 0x0A;
+ }
+
+ if ((src[i] >= 33 && src[i] <= 126) || (src[i] == 0x0A)) {
+ if (src[i] == 61) {
+ en_hex = __dec2hex(src[i]);
+ (*en_src)[j++] = 0x3D; /* '=' */
+ (*en_src)[j++] = en_hex[0];
+ (*en_src)[j++] = en_hex[1];
+ size_cnt += 3;
+ } else {
+ size_cnt++;
+ (*en_src)[j++] = src[i];
+ }
+ } else if (src[i] == 9 || src[i] == 32) {
+ if (src[i + 1] == 0x0A || src[i + 1] == 0x00) { /* TAB or WhiteSpace */
+ en_hex = __dec2hex(src[i]);
+ (*en_src)[j++] = 0x3D; /* '=' */
+ (*en_src)[j++] = en_hex[0];
+ (*en_src)[j++] = en_hex[1];
+ size_cnt += 3;
+ } else {
+ size_cnt++;
+ (*en_src)[j++] = src[i];
+ }
+ } else {
+ en_hex = __dec2hex(src[i]);
+ (*en_src)[j++] = 0x3D; /* '=' */
+ (*en_src)[j++] = en_hex[0];
+ (*en_src)[j++] = en_hex[1];
+ FW_LOGV("[encoding_util] en_src : %s\n", *en_src);
+ size_cnt += 3;
+ }
+ }
+
+ (*en_src)[j] = 0x00;
+ *en_src_len = size_cnt;
+
+ return 1;
+}
+
+int decode_QP(char *src, int src_len, char **de_src, int *de_src_len)
+{
+ char hex[3];
+ char ch;
+ int dec = 0;
+ int is_space = 0;
+ int i = 0;
+ int j = 0;
+
+ if (src == NULL) {
+ FW_LOGE("[encoding_util] src is NULL\n");
+ return 0;
+ }
+
+ *de_src = (char *)malloc(sizeof(char) * (src_len + 1));
+ if (*de_src == 0x00) {
+ FW_LOGE("[encoding_util] malloc is fail !!\n");
+ return 0;
+ }
+ memset(*de_src, 0x00, sizeof(char) * (src_len + 1));
+
+ while (src[i] != '\0') {
+ if (src[i] == 0x3D) { /* '=' */
+ /* check whiteSpace */
+ ch = src[++i];
+
+ /* '=' skip if next character is a TAB or WhiteSpace */
+ while (ch == 0x09 || ch == 0x20) {
+ is_space = 1;
+ ch = src[++i];
+
+ if (is_space == 1) {
+ is_space = 0;
+ continue;
+ }
+ }
+
+ /* '=' skip if next character is 3D which means '=' (encoding error case ??)*/
+ while (ch == '3') {
+ ch = src[++i];
+
+ if (ch == 'D') {
+ ch = src[++i];
+ continue;
+ }
+ }
+
+ /* if next character is LF after '=' do doft line break
+ * encoded QP string on one line 76 character is allowed
+ */
+ if (ch == 0x0A) { /* LF */
+ i++;
+ continue;
+ }
+
+ hex[0] = src[i++];
+ hex[1] = src[i++];
+ hex[2] = '\0';
+
+ dec = __hex2dec(hex);
+
+ /* decoding error */
+ if (dec < 0) {
+ /* when error occur, restore the previous encoding message */
+ (*de_src)[j++] = 0x3D; /* '=' */
+ (*de_src)[j++] = hex[0];
+ (*de_src)[j++] = hex[1];
+ } else {
+ (*de_src)[j++] = dec;
+ }
+ } else if (src[i] > 0x7E) { /* encoding error */
+ i++; /* ignore that character */
+ } else {
+ (*de_src)[j++] = src[i++];
+ }
+ }
+
+ (*de_src)[j] = '\0';
+ *de_src_len = j;
+
+ return 1;
+}
+
+static char *__dec2hex(int dec)
+{
+ static char hex[3];
+ int i;
+ int ch;
+
+ for (i = 0; i < 2; i++) {
+ if (i == 0) {
+ ch = (dec & 0xF0) >> 4;
+ } else if (i == 1) {
+ ch = (dec & 0x0F);
+ }
+
+ if (ch >= 10) {
+ hex[i] = 'A' + ch - 10;
+ } else {
+ hex[i] = '0' + ch;
+ }
+ }
+
+ hex[i] = 0x00;
+
+ FW_LOGV("[encoding_util] hex : %s\n", hex);
+
+ return &hex[0];
+}
+
+static int __hex2dec(char *hex)
+{
+ int dec = 0;
+ int byte;
+ int i = 0;
+
+ for (i = 0; i < 2; i++) {
+ if (hex[i] >= '0' && hex[i] <= '9') {
+ byte = hex[i] - '0';
+ } else if (hex[i] >= 'A' && hex[i] <= 'F') {
+ byte = hex[i] - 'A' + 10;
+ } else if (hex[i] >= 'a' && hex[i] <= 'f') {
+ byte = hex[i] - 'a' + 10;
+ } else {
+ byte = -1;
+ }
+
+ if (byte < 0)
+ return -1;
+
+ dec += (i == 0) ? byte << 4 : byte;
+ }
+
+ return dec;
+}
+
+/*
+ * Base64
+ */
+int encode_base64(char *src, int src_len, char **en_src, int *en_src_len)
+{
+ int i = 0;
+ int j = 0;
+ int cnt = 0;
+ int ch = 0;
+ int size_cnt = 0;
+
+ if (src == NULL) {
+ FW_LOGE("[encoding_util] src is NULL\n");
+ return 0;
+ }
+
+ *en_src = (char *)malloc(sizeof(char) * (src_len * 2));
+ if (*en_src == 0x00) {
+ FW_LOGE("[encoding_util] malloc fail !!\n");
+ return 0;
+ }
+ memset(*en_src, 0x00, src_len * 2);
+
+ while (1) {
+ switch (cnt++) {
+ case 0:
+ {
+ if (i < src_len) {
+ ch = (src[i] & 0xFC) >> 2;
+ } else {
+ ch = -1;
+ }
+ }
+ break;
+
+ case 1:
+ {
+ if (i < src_len) {
+ if (i + 1 < src_len) {
+ ch = ((src[i] & 0x03) << 4) | ((src[i + 1] & 0xF0) >> 4);
+ } else {
+ ch = ((src[i] & 0x03) << 4);
+ }
+ } else {
+ ch = -1;
+ }
+ i++;
+ break;
+ }
+
+ case 2:
+ {
+ if (i < src_len) {
+ if (i + 1 < src_len) {
+ ch = ((src[i] & 0x0F) << 2) | ((src[i] & 0xC0) >> 6);
+ } else {
+ ch = ((src[i] & 0x0F) << 2);
+ }
+ } else {
+ ch = -1;
+ }
+ i++;
+ }
+ break;
+
+ case 3:
+ {
+ if (i < src_len) {
+ ch = (src[i] & 0x3F);
+ } else {
+ ch = -1;
+ }
+ i++;
+ cnt = 0;
+ }
+ break;
+ }
+
+ /*
+ if (ch >= 0 && ch <= 25) { // Upper Case Alphabet
+ (*en_src)[j++] = 'A' + ch;
+ } else if (ch >= 26 && ch <= 51) { // Lower Case Alphabet
+ (*en_src)[j++] = 'a' + ch - 26;
+ } else if (ch >= 52 && ch <= 61) { // Digit
+ (*en_src)[j++] = '0' + ch - 52;
+ } else if (ch == 62) {
+ (*en_src)[j++] = '+';
+ } else if (ch == 63) {
+ (*en_src)[j++] = '/';
+ } else if (ch == -1) {
+ (*en_src)[j++] = '='; // padding
+ }
+ */
+
+ if ((ch != -1) && (ch >= 0 && ch <= 64)) {
+ (*en_src)[j++] = base64_table[ch];
+ } else {
+ (*en_src)[j++] = base64_table[64]; /* padding */
+ }
+
+ size_cnt++;
+
+ if (j % 4 == 0) {
+ if (size_cnt == BASE64_SIZE) {
+ size_cnt = 0;
+ (*en_src)[j++] = 0x0A; /* soft line break */
+ }
+
+ if (i >= src_len)
+ break;
+ }
+ }
+
+ (*en_src)[j] = 0x00;
+ *en_src_len = j;
+
+ return 1;
+}
+
+int decode_base64(char *src, int src_len, char **de_src, int *de_src_len)
+{
+ long tmp = 0; /* 4byte (using decoding) */
+ int i = 0;
+ int j = 0;
+ int cnt = 0;
+ int pad_cnt = 0;
+
+ if (src == NULL) {
+ FW_LOGE("[encoding_util] src is NULL\n");
+ return 0;
+ }
+
+ /* de_src is enough for the src_len 3/4 size */
+ *de_src = (char *)malloc(sizeof(char) * (src_len));
+ if (*de_src == 0x00) {
+ FW_LOGE("[encoding_util] malloc is fail !!\n");
+ return 0;
+ }
+ memset(*de_src, 0x00, src_len);
+
+ while (src[i] != '\0') {
+ /*
+ if (isupper(src[i])) {
+ tmp = (tmp << 6) | (src[i] - 'A'); // Upper case : 0 ~ 25
+ } else if (islower(src[i])) {
+ tmp = (tmp << 6) | (src[i] - 'a' + 0x1A); // Lower case : 26(0x1A) ~ 51
+ } else if (isdigit(src[i])) {
+ tmp = (tmp << 6) | (src[i] - '0' + 0x34); // Number : 52(0x34) ~ 61
+ } else if (src[i] == '+') {
+ tmp = (tmp << 6) | 0x3E; // '+' : 62(0x3E)
+ } else if (src[i] == '/') {
+ tmp = (tmp << 6) | 0x3F; // '/' : 63(0x3F)
+ } else if (src[i] == '=') {
+ pad_cnt++;
+ tmp = (tmp << 6); // '=' : padding
+ } else {
+ tmp = (tmp << 6); // encoding error
+ fFW_LOGV(stdout, "encoding error !! \n");
+ }
+ */
+
+ tmp = (tmp << 6) | (__find_base(src[i]));
+ if (tmp == 64) {
+ pad_cnt++;
+ } else if (tmp == -1) {
+ FW_LOGE("[encoding_util] encoding error \n");
+ }
+
+ if (++cnt >= 4) {
+ (*de_src)[j++] = (char)((tmp & 0x00FF0000) >> 16);
+ (*de_src)[j++] = (char)((tmp & 0x0000FF00) >> 8);
+ (*de_src)[j++] = (char)(tmp & 0x000000FF);
+
+ cnt = 0;
+ tmp = 0;
+
+ if (src[i + 1] == 0x0A) { /* soft line break */
+ i++;
+ }
+ }
+
+ i++;
+ }
+
+ (*de_src)[j - pad_cnt] = '\0';
+ *de_src_len = j - pad_cnt;
+
+ return 1;
+}
+
+int proc_decoding(const char *src, int src_len, char **de_src, int *de_src_len)
+{
+ FW_LOGV("[encoding_util] Start \n");
+
+ const char *reg_src = NULL;
+ reg_src = src;
+
+ FW_LOGV("[encoding_util] << src >> \n%s\n", src);
+
+ *de_src = (char *)malloc(sizeof(char) * (src_len + 1));
+ if (*de_src == NULL) {
+ FW_LOGV("[encoding_util] malloc error !! \n");
+
+ return 0;
+ }
+ memset(*de_src, 0x00, sizeof(char) * (src_len + 1));
+
+ char colon[] = ":";
+ char line_breaker[] = "\r\n";
+ char *start_decoding = NULL;
+ int data_size = 0;
+ int res = 0;
+ int de_temp_len = 0;
+
+ FW_LOGV("src len : %d", src_len);
+ char *de_temp = (char *)malloc(sizeof(char) * src_len); /* todo : temporary */
+ if (de_temp == NULL) {
+ FW_LOGE("[encoding_util] malloc error !!\n");
+
+ if (*de_src != NULL)
+ free(*de_src);
+
+ return 0;
+ }
+
+ while ((start_decoding = strstr(src, "ENCODING="))) {
+ char *colon_loc = strstr(start_decoding, colon);/* find ':''s location */
+ char *line_breaker_loc = NULL;
+ if (colon_loc != NULL) {
+ line_breaker_loc = strstr(colon_loc, line_breaker); /* find "\r\n"'s location */
+ } else {
+ if (*de_src != NULL)
+ free(*de_src);
+
+ if (de_temp != NULL)
+ free(de_temp);
+ return 0;
+ }
+
+ /*
+ * if find "ENCODING=" do strcat data until ":" to de_src
+ */
+ data_size = (colon_loc + 1) - src; /* colon_loc + 1 ==> Until next character of ':'*/
+
+ FW_LOGV("data_size : %d", data_size);
+ char *temp = (char *)malloc(sizeof(char) * (data_size + 1));
+ if (temp == NULL) {
+ FW_LOGE("[encoding_util] malloc error !!");
+
+ if (*de_src != NULL)
+ free(*de_src);
+
+ if (de_temp != NULL)
+ free(de_temp);
+
+ return 0;
+ }
+ memset(temp, 0x00, sizeof(char) * (data_size + 1));
+ memcpy(temp, src, data_size);
+ strcat(*de_src, temp);
+ if (temp != NULL)
+ free(temp);
+
+ FW_LOGV("[encoding_util] << *de_src >> \n %s\n", *de_src);
+
+ /*
+ * copy data from ":" until "\r\n"(actual encoding stream)
+ */
+ data_size = line_breaker_loc - colon_loc; /* from ':' until "\r\n" + '\0' */
+ char *value = (char *)malloc(sizeof(char) * (data_size + 1));
+ if (value == NULL) {
+ FW_LOGE("[encoding_util] malloc error !!\n");
+
+ if (*de_src != NULL)
+ free(*de_src);
+
+ if (de_temp != NULL)
+ free(de_temp);
+
+ return 0;
+ }
+ memset(value, 0x00, sizeof(char) * (data_size + 1));
+ memcpy(value, ++colon_loc, data_size); /* from ':' until "\r\n" */
+ value[data_size] = '\0';
+ FW_LOGV("value : %s, value_len : %d", value, strlen(value));
+
+ /*
+ * Get encoding type using data from "ENCODING=" to ":"
+ */
+ char type_check[TYPE_CHECK_BUF_SIZE] = { 0, };
+ int type_check_size = colon_loc - start_decoding;
+ strncpy(type_check, start_decoding, type_check_size);
+ FW_LOGV("[encoding_util] type check : %s\n", type_check);
+ ENCODING_TYPE type = find_encoding_type((const char *)type_check);
+
+ /*
+ * Process decoding by passing the actual value and encoding type to decode_value()
+ */
+ de_temp_len = 0;
+ memset(de_temp, 0x00, sizeof(char) * src_len); /* todo : temporary */
+ res = decode_value(type, value, data_size, &de_temp, &de_temp_len);
+
+ if (res != 1) {
+ FW_LOGE("[encoding_util] decode_value error !!\n");
+
+ if (*de_src != NULL)
+ free(*de_src);
+
+ if (de_temp != NULL)
+ free(de_temp);
+
+ return 0;
+ }
+
+ /*
+ * Append decoded data to de_src
+ */
+ FW_LOGV("[encoding_util] de_temp : %s\n", de_temp);
+ strcat(*de_src, de_temp);
+
+ /*
+ * find "ENCODING=" since "\r\n" agina
+ */
+ src = line_breaker_loc;
+
+ if (value != NULL)
+ free(value);
+ }
+
+ strcat(*de_src, src); /* Append remain character */
+ *de_src_len = strlen(*de_src);
+ FW_LOGV("[encoding_util] changed src : \n%s ( %d ) \n", *de_src, *de_src_len);
+
+ if (de_temp != NULL)
+ free(de_temp);
+
+ FW_LOGV("[encoding_util] End \n");
+
+ return 1;
+}
+
+int check_encoding_data(const char *data)
+{
+ if (strstr(data, "ENCODING=") != NULL) {
+ FW_LOGV("[encoding_util] exist encoding data !! \n");
+ return 1;
+ } else {
+ FW_LOGV("[encoding_util] not exist encoding data !! \n");
+ return 0;
+ }
+}
+
+ENCODING_TYPE find_encoding_type(const char *data)
+{
+ FW_LOGV("[encoding_util] Start !! \n");
+
+ ENCODING_TYPE type = EN_TYPE_NONE;
+ if (strstr(data, "QUOTED-PRINTABLE") != NULL) {
+ FW_LOGV("[encoding_util] type : QP\n");
+ type = EN_TYPE_QUOTED_PRINTABLE;
+ } else if (strstr(data, "BASE64") != NULL) {
+ FW_LOGV("[encoding_util] type : BASE64\n");
+ type = EN_TYPE_BASE64;
+ } else {
+ FW_LOGV("[encoding_util] not supported type !! \n");
+ }
+
+ FW_LOGV("[encoding_util] End !! \n");
+
+ return type;
+}
+
+int decode_value(ENCODING_TYPE type, const char *value, int value_size, char **decode_str, int *decode_str_len)
+{
+ FW_LOGV("[encoding_util] Start !! \n");
+
+ int res = 1;
+ const char *start_pos = NULL;
+ const char *cursor = NULL;
+ int semi_cnt = 0;
+
+ /*
+ * ex> value - =EA=B9=80;=EC=B2=A0=EC=88=98;;;\0
+ */
+ cursor = value;
+ start_pos = value;
+
+ while (*cursor != '\0') {
+ if ((*cursor != ';') && (*cursor != '\r')) {
+ cursor++;
+ continue;
+ } else if (*cursor == ';') {
+ semi_cnt++;
+ }
+
+ int data_size = 0;
+ data_size = cursor - start_pos;
+
+ if (data_size == 0) {
+ cursor++;
+ start_pos++;
+ } else {
+ char *temp = (char *)malloc(sizeof(char) * (value_size + 1));
+ if (temp == NULL) {
+ FW_LOGE("[encoding_util] malloc error !!");
+ return 0;
+ }
+ memset(temp, 0x00, sizeof(char) * (value_size + 1));
+ memcpy(temp, start_pos, data_size);
+
+ FW_LOGV("[encoding_util] temp : %s \n", temp);
+
+ char *decoding = 0;
+ int decoding_len = 0;
+
+ switch (type) {
+ case EN_TYPE_QUOTED_PRINTABLE:
+ res = decode_QP(temp, data_size, &decoding, &decoding_len);
+ if (temp != NULL)
+ free(temp);
+ break;
+ case EN_TYPE_BASE64:
+ res = decode_base64(temp, data_size, &decoding, &decoding_len);
+ if (temp != NULL)
+ free(temp);
+ break;
+ default:
+ break;
+ }
+
+ FW_LOGV("[encoding_util] decoding : %s ( %d )\n", decoding, decoding_len);
+
+ if (res != 1) {
+ FW_LOGE("[encoding_util] decoding error !! \n");
+
+ if (decoding != NULL)
+ free(decoding);
+
+ return 0;
+ } else {
+ FW_LOGV("[encoding_util] decoding success !!");
+ if (decoding != NULL) {
+ strcat(*decode_str, decoding);
+ FW_LOGV("[encoding_util] *decode_str : %s\n", *decode_str);
+ } else {
+ FW_LOGE("[encoding_util] decoding is NULL !!");
+ return 0;
+ }
+ }
+
+ if (decoding != NULL)
+ free(decoding);
+
+ cursor++;
+ start_pos = cursor;
+ }
+
+ if (semi_cnt > 0) {
+ int len = strlen(*decode_str);
+ (*decode_str)[len] = ';';
+ FW_LOGV("[encoding_util] *decode_str : %s ( %d )\n", *decode_str, strlen(*decode_str));
+ semi_cnt--;
+ }
+ }
+
+ *decode_str_len = strlen(*decode_str);
+
+ FW_LOGV("[encoding_util] *decode_str : %s ( %d )\n", *decode_str, *decode_str_len);
+
+ FW_LOGV("[encoding_util] End !! \n");
+
+ return res;
+}
+
+static int __find_base(char ch)
+{
+ FW_LOGV("[encoding_util] Start !! \n");
+
+ int i = 0;
+ for (i = 0; i < 65; i++) {
+ if (base64_table[i] == ch) {
+ FW_LOGV("[encoding_util] End !! \n");
+ return i;
+ }
+ }
+
+ FW_LOGV("[encoding_util] End !! \n");
+
+ return -1;
+}
diff --git a/packaging/sync-agent-framework.spec b/packaging/sync-agent-framework.spec
new file mode 100755
index 0000000..a14af5f
--- /dev/null
+++ b/packaging/sync-agent-framework.spec
@@ -0,0 +1,88 @@
+Name: sync-agent-framework
+Summary: Sync agent FW Library
+Version: 0.1.9
+Release: 1
+Group: TO_BE/FILLED_IN
+License: Samsung Proprietary License
+Source0: sync-agent-framework-%{version}.tar.gz
+Requires(post): /sbin/ldconfig
+Requires(postun): /sbin/ldconfig
+BuildRequires: pkgconfig(glib-2.0)
+BuildRequires: pkgconfig(sqlite3)
+BuildRequires: pkgconfig(libsoup-2.4)
+BuildRequires: pkgconfig(vconf)
+BuildRequires: pkgconfig(uuid)
+BuildRequires: pkgconfig(msg-service)
+BuildRequires: pkgconfig(drm-service)
+BuildRequires: pkgconfig(libxml-2.0)
+BuildRequires: pkgconfig(libwbxml2)
+BuildRequires: pkgconfig(calendar)
+BuildRequires: pkgconfig(pmapi)
+BuildRequires: pkgconfig(accounts-svc)
+#BuildRequires: pkgconfig(email-service)
+BuildRequires: pkgconfig(contacts-service)
+#BuildRequires: pkgconfig(kies_alarm)
+#BuildRequires: pkgconfig(bookmark-service)
+BuildRequires: pkgconfig(memo)
+#BuildRequires: pkgconfig(push)
+BuildRequires: pkgconfig(alarm-service)
+#BuildRequires: pkgconfig(location)
+BuildRequires: pkgconfig(tapi)
+BuildRequires: pkgconfig(sysman)
+BuildRequires: pkgconfig(capi-base-common)
+#BuildRequires: pkgconfig(capi-messaging-push)
+#BuildRequires: drm-bnr-devel
+#BuildRequires: data-router-devel
+#BuildRequires: liboauth-devel
+BuildRequires: libgcrypt-devel
+BuildRequires: cmake
+
+Requires(post): /sbin/ldconfig
+Requires(postun): /sbin/ldconfig
+
+
+%description
+sync-agent-framework library (development headers)
+
+
+%package devel
+Summary: Development files for %{name}
+Group: Development/Libraries
+Requires: %{name} = %{version}-%{release}
+%description devel
+Development files for %{name}
+
+
+
+
+%prep
+%setup -q
+
+
+%build
+cmake . -DCMAKE_INSTALL_PREFIX=/usr
+
+
+make %{?jobs:-j%jobs}
+
+%install
+rm -rf %{buildroot}
+%make_install
+
+
+%post -p /sbin/ldconfig
+%postun -p /sbin/ldconfig
+
+
+
+
+
+%files
+%defattr(-,root,root,-)
+%{_libdir}/*.so
+
+%files devel
+%defattr(-,root,root,-)
+%{_includedir}/agent-framework/*
+%{_libdir}/*.so
+%{_libdir}/pkgconfig/sync-agent-framework.pc
diff --git a/pkg_build.sh b/pkg_build.sh
new file mode 100755
index 0000000..3c043d5
--- /dev/null
+++ b/pkg_build.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+sbs -e dpkg-buildpackage -b
+
diff --git a/pkg_clean.sh b/pkg_clean.sh
new file mode 100755
index 0000000..58acc1f
--- /dev/null
+++ b/pkg_clean.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+find . -name CMakeFiles -exec rm -rf {} \;
+find . -name CMakeCache.txt -exec rm -rf {} \;
+find . -name Makefile -exec rm -rf {} \;
+find . -name cmake_install.cmake -exec rm -rf {} \;
+find . -name install_manifest.txt -exec rm -rf {} \;
+find . -name *.pc -exec rm -rf {} \;
+
+find . -name *.so -exec rm -rf {} \;
+
+rm -rf ./framework/fw-test
+
+rm -rf ./debian/PKG
+rm -rf ./debian/libsync-agent-framework
+rm -rf ./debian/libsync-agent-framework-dbg
+rm -rf ./debian/libsync-agent-framework-dev
+rm -rf ./debian/tmp
+rm -rf ./debian/files
+rm -rf ./debian/*.log
+rm -rf ./debian/*.debhelper
+rm -rf ./debian/*.substvars
+
+rm -rf ../libsync-agent-framework-dbg_0.1.9_armel.deb
+rm -rf ../libsync-agent-framework-dev_0.1.9_armel.deb
+rm -rf ../libsync-agent-framework_0.1.9_armel.deb
+rm -rf ../libsync-agent-framework_0.1.9_armel.changes
+
diff --git a/pkg_install.sh b/pkg_install.sh
new file mode 100755
index 0000000..3e2e636
--- /dev/null
+++ b/pkg_install.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+dpkg -i ../libsync-agent-framework_0.1.9_armel.deb
+dpkg -i ../libsync-agent-framework-dev_0.1.9_armel.deb
+dpkg -i ../libsync-agent-framework-dbg_0.1.9_armel.deb
+
diff --git a/pkg_uninstall.sh b/pkg_uninstall.sh
new file mode 100755
index 0000000..56569cf
--- /dev/null
+++ b/pkg_uninstall.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+dpkg -P libsync-agent-framework-dbg
+dpkg -P libsync-agent-framework-dev
+dpkg -P libsync-agent-framework
+
diff --git a/sync-agent-framework.pc.in b/sync-agent-framework.pc.in
new file mode 100755
index 0000000..562a61a
--- /dev/null
+++ b/sync-agent-framework.pc.in
@@ -0,0 +1,19 @@
+prefix=@PREFIX@
+exec_prefix=@PREFIX@
+libdir=@PREFIX@/usr/lib
+includedir=@PREFIX@/usr/include
+
+Name: libsync-agent-framework
+Description: Integrated Framework Library Package
+Requires:
+Version: @VERSION@
+Libs: -L${libdir} -lsync-agent-framework
+Cflags: -I${includedir}/agent-framework
+
+
+
+
+
+
+
+