From abb1370ac78324b7a3ceacbd606a5a6858fd4231 Mon Sep 17 00:00:00 2001 From: Sehong Na Date: Sat, 31 May 2014 12:47:29 +0900 Subject: Initialize Tizen 2.3 --- CMakeLists.txt | 56 +++++++ LICENSE | 206 +++++++++++++++++++++++++ include/CModule.h | 49 ++++++ include/c-abi.h | 50 ++++++ include/debug.h | 19 +++ include/dlist.h | 43 ++++++ include/livebox-cpp.h | 49 ++++++ include/livebox-cpp_PG.h | 0 include/livebox-impl.h | 41 +++++ livebox-cpp.pc.in | 11 ++ packaging/liblivebox-cpp.manifest | 5 + packaging/liblivebox-cpp.spec | 66 ++++++++ src/CModule.cpp | 205 +++++++++++++++++++++++++ src/dlist.cpp | 160 ++++++++++++++++++++ src/livebox.cpp | 311 ++++++++++++++++++++++++++++++++++++++ 15 files changed, 1271 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 LICENSE create mode 100644 include/CModule.h create mode 100644 include/c-abi.h create mode 100644 include/debug.h create mode 100644 include/dlist.h create mode 100644 include/livebox-cpp.h create mode 100644 include/livebox-cpp_PG.h create mode 100644 include/livebox-impl.h create mode 100644 livebox-cpp.pc.in create mode 100644 packaging/liblivebox-cpp.manifest create mode 100644 packaging/liblivebox-cpp.spec create mode 100644 src/CModule.cpp create mode 100644 src/dlist.cpp create mode 100644 src/livebox.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..3909e69 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,56 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(livebox-cpp CXX) + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(EXEC_PREFIX "\${prefix}") +SET(PROJECT_NAME "${PROJECT_NAME}") +SET(LIBDIR "\${exec_prefix}/lib") +SET(INCLUDEDIR "\${prefix}/include/${PROJECT_NAME}") +SET(VERSION_MAJOR 0) +SET(VERSION "${VERSION_MAJOR}.0.1") + +set(CMAKE_SKIP_BUILD_RPATH true) + +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) + +INCLUDE(FindPkgConfig) +pkg_check_modules(pkgs REQUIRED + dlog + livebox + livebox-service + evas +) + +FOREACH(flag ${pkgs_CXXFLAGS}) + SET(EXTRA_CXXFLAGS "${EXTRA_CXXFLAGS} ${flag}") +ENDFOREACH(flag) + +FOREACH(flag ${pkgs_CFLAGS}) + SET(EXTRA_CXXFLAGS "${EXTRA_CXXFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(EXTRA_CXXFLAGS "${EXTRA_CXXFLAGS} -fvisibility=hidden -fPIC -g") + +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXXFLAGS} -g") + +ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") +ADD_DEFINITIONS("-DLOG_TAG=\"LIVEBOX_CPP\"") +ADD_DEFINITIONS("-DNDEBUG") + +ADD_LIBRARY(${PROJECT_NAME} SHARED + src/dlist.cpp + src/livebox.cpp + src/CModule.cpp +) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES SOVERSION ${VERSION_MAJOR}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES VERSION ${VERSION}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} "-ldl") + +CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY) +SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${PROJECT_NAME}.pc") + +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION lib) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig) +INSTALL(FILES ${CMAKE_SOURCE_DIR}/include/livebox-cpp.h DESTINATION include/${PROJECT_NAME}) +INSTALL(FILES ${CMAKE_SOURCE_DIR}/include/livebox-cpp_PG.h DESTINATION /usr/share/doc/${PROJECT_NAME}) +INSTALL(FILES ${CMAKE_SOURCE_DIR}/LICENSE DESTINATION /usr/share/license RENAME "lib${PROJECT_NAME}") diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..571fe79 --- /dev/null +++ b/LICENSE @@ -0,0 +1,206 @@ +Flora License + +Version 1.1, April, 2013 + +http://floralicense.org/license/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, +and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by +the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and +all other entities that control, are controlled by, or are +under common control with that entity. For the purposes of +this definition, "control" means (i) the power, direct or indirect, +to cause the direction or management of such entity, +whether by contract or otherwise, or (ii) ownership of fifty percent (50%) +or more of the outstanding shares, or (iii) beneficial ownership of +such entity. + +"You" (or "Your") shall mean an individual or Legal Entity +exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, +including but not limited to software source code, documentation source, +and configuration files. + +"Object" form shall mean any form resulting from mechanical +transformation or translation of a Source form, including but +not limited to compiled object code, generated documentation, +and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, +made available under the License, as indicated by a copyright notice +that is included in or attached to the work (an example is provided +in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, +that is based on (or derived from) the Work and for which the editorial +revisions, annotations, elaborations, or other modifications represent, +as a whole, an original work of authorship. For the purposes of this License, +Derivative Works shall not include works that remain separable from, +or merely link (or bind by name) to the interfaces of, the Work and +Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original +version of the Work and any modifications or additions to that Work or +Derivative Works thereof, that is intentionally submitted to Licensor +for inclusion in the Work by the copyright owner or by an individual or +Legal Entity authorized to submit on behalf of the copyright owner. +For the purposes of this definition, "submitted" means any form of +electronic, verbal, or written communication sent to the Licensor or +its representatives, including but not limited to communication on +electronic mailing lists, source code control systems, and issue +tracking systems that are managed by, or on behalf of, the Licensor +for the purpose of discussing and improving the Work, but excluding +communication that is conspicuously marked or otherwise designated +in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity +on behalf of whom a Contribution has been received by Licensor and +subsequently incorporated within the Work. + +"Tizen Certified Platform" shall mean a software platform that complies +with the standards set forth in the Tizen Compliance Specification +and passes the Tizen Compliance Tests as defined from time to time +by the Tizen Technical Steering Group and certified by the Tizen +Association or its designated agent. + +2. Grant of Copyright License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the +Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +(except as stated in this section) patent license to make, have made, +use, offer to sell, sell, import, and otherwise transfer the Work +solely as incorporated into a Tizen Certified Platform, where such +license applies only to those patent claims licensable by such +Contributor that are necessarily infringed by their Contribution(s) +alone or by combination of their Contribution(s) with the Work solely +as incorporated into a Tizen Certified Platform to which such +Contribution(s) was submitted. If You institute patent litigation +against any entity (including a cross-claim or counterclaim +in a lawsuit) alleging that the Work or a Contribution incorporated +within the Work constitutes direct or contributory patent infringement, +then any patent licenses granted to You under this License for that +Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the +Work or Derivative Works thereof pursuant to the copyright license +above, in any medium, with or without modifications, and in Source or +Object form, provided that You meet the following conditions: + + 1. You must give any other recipients of the Work or Derivative Works + a copy of this License; and + 2. You must cause any modified files to carry prominent notices stating + that You changed the files; and + 3. You must retain, in the Source form of any Derivative Works that + You distribute, all copyright, patent, trademark, and attribution + notices from the Source form of the Work, excluding those notices + that do not pertain to any part of the Derivative Works; and + 4. If the Work includes a "NOTICE" text file as part of its distribution, + then any Derivative Works that You distribute must include a readable + copy of the attribution notices contained within such NOTICE file, + excluding those notices that do not pertain to any part of + the Derivative Works, in at least one of the following places: + within a NOTICE text file distributed as part of the Derivative Works; + within the Source form or documentation, if provided along with the + Derivative Works; or, within a display generated by the Derivative Works, + if and wherever such third-party notices normally appear. + The contents of the NOTICE file are for informational purposes only + and do not modify the License. You may add Your own attribution notices + within Derivative Works that You distribute, alongside or as an addendum + to the NOTICE text from the Work, provided that such additional attribution + notices cannot be construed as modifying the License. You may add Your own + copyright statement to Your modifications and may provide additional or + different license terms and conditions for use, reproduction, or + distribution of Your modifications, or for any such Derivative Works + as a whole, provided Your use, reproduction, and distribution of + the Work otherwise complies with the conditions stated in this License + and your own copyright statement or terms and conditions do not conflict + the conditions stated in the License including section 3. + +5. Submission of Contributions. Unless You explicitly state otherwise, +any Contribution intentionally submitted for inclusion in the Work +by You to the Licensor shall be under the terms and conditions of +this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify +the terms of any separate license agreement you may have executed +with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade +names, trademarks, service marks, or product names of the Licensor, +except as required for reasonable and customary use in describing the +origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or +agreed to in writing, Licensor provides the Work (and each +Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied, including, without limitation, any warranties or conditions +of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any +risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, +whether in tort (including negligence), contract, or otherwise, +unless required by applicable law (such as deliberate and grossly +negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, +incidental, or consequential damages of any character arising as a +result of this License or out of the use or inability to use the +Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all +other commercial damages or losses), even if such Contributor +has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing +the Work or Derivative Works thereof, You may choose to offer, +and charge a fee for, acceptance of support, warranty, indemnity, +or other liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only +on Your own behalf and on Your sole responsibility, not on behalf +of any other Contributor, and only if You agree to indemnify, +defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason +of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Flora License to your work + +To apply the Flora License to your work, attach the following +boilerplate notice, with the fields enclosed by brackets "[]" +replaced with your own identifying information. (Don't include +the brackets!) The text should be enclosed in the appropriate +comment syntax for the file format. We also recommend that a +file or class name and description of purpose be included on the +same "printed page" as the copyright notice for easier +identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Flora License, Version 1.1 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://floralicense.org/license/ + + 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. + diff --git a/include/CModule.h b/include/CModule.h new file mode 100644 index 0000000..f7c66ac --- /dev/null +++ b/include/CModule.h @@ -0,0 +1,49 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + +class CModule +{ +private: + static const char *m_sModulePath; + static struct dlist *m_pModuleList; + + void *m_pHandle; + void *(*m_fNew)(void); + char *m_sPkgname; + struct dlist *m_pList; + int (*m_fNeedToCreate)(const char *cluster, const char *category); + int (*m_fInitialize)(const char *pkgname); + int (*m_fFinalize)(void); + + CModule(char *pkgname) : m_pHandle(NULL), m_fNew(NULL), m_sPkgname(pkgname), m_pList(NULL), m_fNeedToCreate(NULL), m_fInitialize(NULL), m_fFinalize(NULL) {} + virtual ~CModule() {} + +public: + static CModule *FindModule(const char *pkgname); + + static CModule *Load(const char *pkgname); + int Unload(void); + + int Create(const char *filename, const char *content, const char *cluster, const char *category); + int NeedToCreate(const char *cluster, const char *category); + int Destroy(CLiveBoxImpl *inst); + + CLiveBoxImpl *FindLiveBox(const char *filename); + + const char *PackageName(void) { return m_sPkgname; } +}; + +/* End of a file */ diff --git a/include/c-abi.h b/include/c-abi.h new file mode 100644 index 0000000..d0a0666 --- /dev/null +++ b/include/c-abi.h @@ -0,0 +1,50 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + +#ifdef __cplusplus +extern "C" { +#endif +extern int livebox_initialize(const char *pkgname); +extern int livebox_finalize(const char *pkgname); + +extern int livebox_create(const char *pkgname, const char *filename, const char *content, const char *cluster, const char *category); +extern int livebox_destroy(const char *pkgname, const char *filename); +extern int livebox_need_to_update(const char *pkgname, const char *filename); +extern int livebox_need_to_destroy(const char *pkgname, const char *filename); +extern int livebox_update_content(const char *pkgname, const char *filename); + +/*! + * \param[in] event "clicked" only + */ +extern int livebox_clicked(const char *pkgname, const char *filename, const char *event, double timestamp, double x, double y); + +/*! + * if "source" == "filename", emission could be "pd,show", "pd,hide", "lb,show", "lb,hide". + */ +extern int livebox_content_event(const char *pkgname, const char *filename, const char *emission, const char *source, struct event_info *event_info); +extern int livebox_resize(const char *pkgname, const char *filename, int type); +extern int livebox_change_group(const char *pkgname, const char *filename, const char *cluster, const char *category); +extern int livebox_get_info(const char *pkgname, const char *filename, int *w, int *h, double *priority, char **content, char **title); +extern int livebox_need_to_create(const char *pkgname, const char *cluster, const char *category); +extern char *livebox_pinup(const char *pkgname, const char *filename, int pinup); +extern int livebox_is_pinned_up(const char *pkgname, const char *filename); +extern int livebox_system_event(const char *pkgname, const char *filename, int event); + +#ifdef __cplusplus +} +#endif + +/* End of a file */ diff --git a/include/debug.h b/include/debug.h new file mode 100644 index 0000000..6f5df3f --- /dev/null +++ b/include/debug.h @@ -0,0 +1,19 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + +#define DbgPrint(format, arg...) SECURE_LOGD(format, ##arg) +#define ErrPrint(format, arg...) SECURE_LOGE(format, ##arg) +/* End of a file */ diff --git a/include/dlist.h b/include/dlist.h new file mode 100644 index 0000000..6ce75e0 --- /dev/null +++ b/include/dlist.h @@ -0,0 +1,43 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + +#define dlist_remove_data(list, data) do { \ + struct dlist *l; \ + l = dlist_find_data(list, data); \ + list = dlist_remove(list, l); \ +} while (0) + +#define dlist_foreach(list, l, data) \ + for ((l) = (list); ((data) = dlist_data(l)); (l) = dlist_next(l)) + +#define dlist_foreach_safe(list, l, n, data) \ + for ((l) = (list), (n) = dlist_next(l); \ + ((data) = dlist_data(l)); \ + (l) = (n), (n) = dlist_next(l)) + +struct dlist; + +extern struct dlist *dlist_append(struct dlist *list, void *data); +extern struct dlist *dlist_prepend(struct dlist *list, void *data); +extern struct dlist *dlist_remove(struct dlist *list, struct dlist *l); +extern struct dlist *dlist_find_data(struct dlist *list, void *data); +extern void *dlist_data(struct dlist *l); +extern struct dlist *dlist_next(struct dlist *l); +extern struct dlist *dlist_prev(struct dlist *l); +extern int dlist_count(struct dlist *l); +extern struct dlist *dlist_nth(struct dlist *l, int nth); + +/* End of a file */ diff --git a/include/livebox-cpp.h b/include/livebox-cpp.h new file mode 100644 index 0000000..37a8f51 --- /dev/null +++ b/include/livebox-cpp.h @@ -0,0 +1,49 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + +/* Pure virtual class */ +class CLiveBox +{ +public: + CLiveBox(void) {}; + virtual ~CLiveBox(void) {} + + virtual int Create(const char *filename, const char *content, const char *cluster, const char *category) = 0; + virtual int Destroy(void) = 0; + + virtual int NeedToUpdate(void) = 0; + virtual int NeedToDestroy(void) = 0; + virtual int UpdateContent(void) = 0; + + /*! + * \param[in] event "clicked" only + */ + virtual int Clicked(const char *event, double timestamp, double x, double y) = 0; + virtual int ContentEvent(const char *emission, const char *source, struct event_info *info) = 0; + + /*! + * if "source" == "filename", emission could be "pd,show", "pd,hide", "lb,show", "lb,hide". + */ + virtual int Resize(int type) = 0; + virtual int ChangeGroup(const char *cluster, const char *category) = 0; + virtual int GetInfo(int *w, int *h, double *priority, char **content, char **title) = 0; + virtual char *PinUp(int on_pin) = 0; + virtual const char *Filename(void) = 0; + virtual int IsPinnedUp(void) = 0; + virtual int SystemEvent(int event) = 0; +}; + +/* End of a file */ diff --git a/include/livebox-cpp_PG.h b/include/livebox-cpp_PG.h new file mode 100644 index 0000000..e69de29 diff --git a/include/livebox-impl.h b/include/livebox-impl.h new file mode 100644 index 0000000..82a28f6 --- /dev/null +++ b/include/livebox-impl.h @@ -0,0 +1,41 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + +class CLiveBoxImpl : public CLiveBox +{ +public: + CLiveBoxImpl(void); + virtual ~CLiveBoxImpl(void); + + int Create(const char *filename, const char *content, const char *cluster, const char *category); + int Destroy(void); + + int NeedToCreate(void); + int UpdateContent(void); + + int Clicked(const char *event, double timestamp, double x, double y); + int ContentEvent(const char *emission, const char *source, struct event_info *info); + + int Resize(int type); + int ChangeGroup(const char *cluster, const char *category); + int GetInfo(int *w, int *h, double *priority, char **content, char **title); + char *PinUp(int on_pin); + const char *Filename(void); + int IsPinnedUp(void); + int SystemEvent(int event); +}; + +// End of a file diff --git a/livebox-cpp.pc.in b/livebox-cpp.pc.in new file mode 100644 index 0000000..66e1c50 --- /dev/null +++ b/livebox-cpp.pc.in @@ -0,0 +1,11 @@ +prefix=@PREFIX@ +exec_prefix=@EXEC_PREFIX@ +libdir=@LIBDIR@ +includedir=@INCLUDEDIR@ + +Name: livebox-cpp +Description: livebox CPP supporting library +Version: @VERSION@ +Libs: -L${libdir} -llivebox-cpp +Cflags: -I${includedir} +cppflags: -I${includedir} diff --git a/packaging/liblivebox-cpp.manifest b/packaging/liblivebox-cpp.manifest new file mode 100644 index 0000000..a76fdba --- /dev/null +++ b/packaging/liblivebox-cpp.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/packaging/liblivebox-cpp.spec b/packaging/liblivebox-cpp.spec new file mode 100644 index 0000000..246912f --- /dev/null +++ b/packaging/liblivebox-cpp.spec @@ -0,0 +1,66 @@ +Name: liblivebox-cpp +Summary: C++ adaptor for a livebox +Version: 0.2.8 +Release: 1 +VCS: magnolia/apps/livebox/livebox-cpp#livebox-cpp_0.2.4-19-g18d4a8671e59384424cf0c3c189e598a8ab2aed2 +Group: HomeTF/Livebox +License: Flora +Source0: %{name}-%{version}.tar.gz +Source1001: %{name}.manifest +BuildRequires: cmake, gettext-tools, coreutils +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(livebox) +BuildRequires: pkgconfig(evas) +BuildRequires: pkgconfig(livebox-service) + +%description +Livebox development library (C++) + +%package devel +Summary: Files for livebox development +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + +%description devel +Livebox development library (C++) (dev) + +%prep +%setup -q +cp %{SOURCE1001} . + +%build +%if 0%{?sec_build_binary_debug_enable} +export CFLAGS="$CFLAGS -DTIZEN_DEBUG_ENABLE" +export CXXFLAGS="$CXXFLAGS -DTIZEN_DEBUG_ENABLE" +export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE" +%endif + +%if 0%{?tizen_build_binary_release_type_eng} +export CFLAGS="${CFLAGS} -DTIZEN_ENGINEER_MODE" +export CXXFLAGS="${CXXFLAGS} -DTIZEN_ENGINEER_MODE" +export FFLAGS="${FFLAGS} -DTIZEN_ENGINEER_MODE" +%endif +%cmake . +make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +%make_install +mkdir -p %{buildroot}/%{_datarootdir}/license + +%post + +%files -n liblivebox-cpp +%manifest %{name}.manifest +%defattr(-,root,root,-) +%{_libdir}/*.so* +%{_datarootdir}/license/* + +%files devel +%manifest %{name}.manifest +%defattr(-,root,root,-) +%{_includedir}/livebox-cpp/livebox-cpp.h +%{_datarootdir}/doc/livebox-cpp/livebox-cpp_PG.h +%{_libdir}/pkgconfig/*.pc + +# End of a file diff --git a/src/CModule.cpp b/src/CModule.cpp new file mode 100644 index 0000000..8f8c967 --- /dev/null +++ b/src/CModule.cpp @@ -0,0 +1,205 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "debug.h" +#include "livebox-cpp.h" +#include "livebox-impl.h" +#include "CModule.h" +#include "dlist.h" + +const char *CModule::m_sModulePath = "/opt/usr/live/%s/libexec/liblive-%s.so"; +struct dlist *CModule::m_pModuleList = NULL; + +CModule *CModule::Load(const char *pkgname) +{ + CModule *inst; + char *tmp; + char *module_path; + int ret; + + tmp = strdup(pkgname); + if (!tmp) { + ErrPrint("Memory: %s\n", strerror(errno)); + return NULL; + } + + try { + inst = new CModule(tmp); + } catch (...) { + ErrPrint("Memory\n"); + free(tmp); + return NULL; + } + + module_path = livebox_service_libexec(pkgname); + if (!module_path) { + delete inst; + free(tmp); + return NULL; + } + + inst->m_pHandle = dlopen(module_path, RTLD_LOCAL | RTLD_NOW | RTLD_DEEPBIND); + free(module_path); + + if (!inst->m_pHandle) { + ErrPrint("dlopen: %s\n", dlerror()); + delete inst; + free(tmp); + return NULL; + } + + inst->m_fNew = (void *(*)(void))dlsym(inst->m_pHandle, "livebox_new"); + if (!inst->m_fNew) { + ErrPrint("symbol: livebox_new is not found: %s\n", dlerror()); + dlclose(inst->m_pHandle); + delete inst; + free(tmp); + return NULL; + } + + inst->m_fNeedToCreate = (int (*)(const char *, const char *))dlsym(inst->m_pHandle, "livebox_need_to_create"); + if (!inst->m_fNeedToCreate) { + DbgPrint("%s has no livebox_need_to_create\n", pkgname); + } + + inst->m_fInitialize = (int (*)(const char *))dlsym(inst->m_pHandle, "livebox_initialize"); + if (!inst->m_fInitialize) { + DbgPrint("%s has no livebox_initialize\n", pkgname); + } else { + ret = inst->m_fInitialize(pkgname); + if (ret < 0) { + ErrPrint("livebox_finalize(%s) returns %d\n", pkgname, ret); + dlclose(inst->m_pHandle); + delete inst; + free(tmp); + return NULL; + } + } + + inst->m_fFinalize = (int (*)(void))dlsym(inst->m_pHandle, "livebox_finalize"); + if (!inst->m_fFinalize) { + DbgPrint("%s has no livebox_finalize\n", pkgname); + } + + m_pModuleList = dlist_append(m_pModuleList, inst); + return inst; +} + +int CModule::Unload(void) +{ + struct dlist *l; + + l = dlist_find_data(m_pModuleList, this); + m_pModuleList = dlist_remove(m_pModuleList, l); + + if (m_fFinalize) { + int ret; + ret = m_fFinalize(); + DbgPrint("livebox_finalize of %s returns %d\n", m_sPkgname, ret); + } + + dlclose(m_pHandle); + free(m_sPkgname); + delete this; + return LB_STATUS_SUCCESS; +} + +int CModule::Create(const char *filename, const char *content, const char *cluster, const char *category) +{ + CLiveBoxImpl *inst; + + inst = (CLiveBoxImpl *)m_fNew(); + if (inst) { + int ret; + ret = inst->Create(filename, content, cluster, category); + if (ret < 0) { + delete inst; + return ret; + } + + m_pList = dlist_append(m_pList, inst); + return 0; + } + + return LB_STATUS_ERROR_FAULT; +} + +int CModule::Destroy(CLiveBoxImpl *inst) +{ + struct dlist *l; + + l = dlist_find_data(m_pList, inst); + if (!l) { + return LB_STATUS_ERROR_NOT_EXIST; + } + + m_pList = dlist_remove(m_pList, l); + delete inst; + return LB_STATUS_SUCCESS; +} + +CLiveBoxImpl *CModule::FindLiveBox(const char *filename) +{ + struct dlist *l; + void *item; + CLiveBoxImpl *box; + + dlist_foreach(m_pList, l, item) { + box = (CLiveBoxImpl *)item; + if (!strcmp(filename, box->Filename())) { + return box; + } + } + + return NULL; +} + +int CModule::NeedToCreate(const char *cluster, const char *category) +{ + if (!m_fNeedToCreate) { + return 0; + } + + return m_fNeedToCreate(cluster, category); +} + +CModule *CModule::FindModule(const char *pkgname) +{ + struct dlist *l; + void *item; + CModule *module; + + dlist_foreach(m_pModuleList, l, item) { + module = (CModule *)item; + if (!strcmp(pkgname, module->PackageName())) { + return module; + } + } + + return NULL; +} + +/* End of a file */ diff --git a/src/dlist.cpp b/src/dlist.cpp new file mode 100644 index 0000000..678afaa --- /dev/null +++ b/src/dlist.cpp @@ -0,0 +1,160 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + +#include +#include +#include + +#include "dlist.h" + +struct dlist { + struct dlist *next; + struct dlist *prev; + void *data; +}; + +struct dlist *dlist_append(struct dlist *list, void *data) +{ + struct dlist *item; + + item = (struct dlist *)malloc(sizeof(*item)); + if (!item) { + return NULL; + } + + item->next = NULL; + item->data = data; + + if (!list) { + item->prev = item; + + list = item; + } else { + item->prev = list->prev; + item->prev->next = item; + + list->prev = item; + } + + assert(!list->prev->next && "item NEXT"); + + return list; +} + +struct dlist *dlist_prepend(struct dlist *list, void *data) +{ + struct dlist *item; + + item = (struct dlist *)malloc(sizeof(*item)); + if (!item) { + return NULL; + } + + if (!list) { + item->prev = item; + item->next = NULL; + } else { + item->prev = list->prev; + list->prev = item; + item->next = list; + } + + return item; +} + +struct dlist *dlist_remove(struct dlist *list, struct dlist *l) +{ + if (!list || !l) { + return NULL; + } + + if (l == list) { + l->prev = list->prev; + list = l->next; + } else { + l->prev->next = l->next; + } + + if (l->next) { + l->next->prev = l->prev; + } + + free(l); + return list; +} + +struct dlist *dlist_find_data(struct dlist *list, void *data) +{ + struct dlist *l; + void *_data; + + dlist_foreach(list, l, _data) { + if (data == _data) { + return l; + } + } + + return NULL; +} + +void *dlist_data(struct dlist *l) +{ + return l ? l->data : NULL; +} + +struct dlist *dlist_next(struct dlist *l) +{ + return l ? l->next : NULL; +} + +struct dlist *dlist_prev(struct dlist *l) +{ + return l ? l->prev : NULL; +} + +int dlist_count(struct dlist *l) +{ + register int i; + struct dlist *n; + void *data; + + i = 0; + dlist_foreach(l, n, data) { + i++; + } + + return i; +} + +struct dlist *dlist_nth(struct dlist *l, int nth) +{ + register int i; + struct dlist *n; + void *data; + + i = 0; + dlist_foreach(l, n, data) { + if (i == nth) { + return l; + } + + i++; + } + + return NULL; +} + +/* End of a file */ diff --git a/src/livebox.cpp b/src/livebox.cpp new file mode 100644 index 0000000..4f0006c --- /dev/null +++ b/src/livebox.cpp @@ -0,0 +1,311 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + +#include +#include + +#include +#include +#include + +#include "livebox-cpp.h" +#include "livebox-impl.h" +#include "CModule.h" +#include "c-abi.h" + +#define EAPI __attribute__((visibility("default"))) + +EAPI int livebox_initialize(const char *pkgname) +{ + CModule *module; + + module = CModule::FindModule(pkgname); + if (module) { + return LB_STATUS_SUCCESS; + } + + module = CModule::Load(pkgname); + if (!module) { + return LB_STATUS_ERROR_FAULT; + } + + return LB_STATUS_SUCCESS; +} + +EAPI int livebox_finalize(const char *pkgname) +{ + CModule *module; + + module = CModule::FindModule(pkgname); + if (!module) { + return LB_STATUS_ERROR_NOT_EXIST; + } + + module->Unload(); + return LB_STATUS_SUCCESS; +} + +EAPI int livebox_create(const char *pkgname, const char *filename, const char *content, const char *cluster, const char *category) +{ + CLiveBoxImpl *box; + CModule *module; + int ret; + + module = CModule::FindModule(pkgname); + if (!module) { + return LB_STATUS_ERROR_INVALID; + } + + box = module->FindLiveBox(filename); + if (box) { + return LB_STATUS_ERROR_NOT_EXIST; + } + + ret = module->Create(filename, content, cluster, category); + return ret; +} + +EAPI int livebox_destroy(const char *pkgname, const char *filename) +{ + CModule *module; + CLiveBoxImpl *box; + int ret; + + module = CModule::FindModule(pkgname); + if (!module) { + return LB_STATUS_ERROR_INVALID; + } + + box = module->FindLiveBox(filename); + if (!box) { + return LB_STATUS_ERROR_NOT_EXIST; + } + + ret = module->Destroy(box); + return ret; +} + +EAPI int livebox_need_to_update(const char *pkgname, const char *filename) +{ + CLiveBoxImpl *box; + CModule *module; + + module = CModule::FindModule(pkgname); + if (!module) { + return LB_STATUS_ERROR_INVALID; + } + + box = module->FindLiveBox(filename); + if (!box) { + return LB_STATUS_ERROR_NOT_EXIST; + } + + return box->NeedToUpdate(); +} + +EAPI int livebox_need_to_destroy(const char *pkgname, const char *filename) +{ + CLiveBoxImpl *box; + CModule *module; + + module = CModule::FindModule(pkgname); + if (!module) { + return LB_STATUS_ERROR_INVALID; + } + + box = module->FindLiveBox(filename); + if (!box) { + return LB_STATUS_ERROR_NOT_EXIST; + } + + return box->NeedToDestroy(); +} + +EAPI int livebox_update_content(const char *pkgname, const char *filename) +{ + CLiveBoxImpl *box; + CModule *module; + + module = CModule::FindModule(pkgname); + if (!module) { + return LB_STATUS_ERROR_INVALID; + } + + box = module->FindLiveBox(filename); + if (!box) { + return LB_STATUS_ERROR_NOT_EXIST; + } + + return box->UpdateContent(); +} + +EAPI int livebox_clicked(const char *pkgname, const char *filename, const char *event, double timestamp, double x, double y) +{ + CLiveBoxImpl *box; + CModule *module; + + module = CModule::FindModule(pkgname); + if (!module) { + return LB_STATUS_ERROR_INVALID; + } + + box = module->FindLiveBox(filename); + if (!box) { + return LB_STATUS_ERROR_NOT_EXIST; + } + + return box->Clicked(event, timestamp, x, y); +} + +EAPI int livebox_content_event(const char *pkgname, const char *filename, const char *emission, const char *source, struct event_info *event_info) +{ + CLiveBoxImpl *box; + CModule *module; + + module = CModule::FindModule(pkgname); + if (!module) { + return LB_STATUS_ERROR_INVALID; + } + + box = module->FindLiveBox(filename); + if (!box) { + return LB_STATUS_ERROR_NOT_EXIST; + } + + return box->ContentEvent(emission, source, event_info); +} + +EAPI int livebox_resize(const char *pkgname, const char *filename, int type) +{ + CLiveBoxImpl *box; + CModule *module; + + module = CModule::FindModule(pkgname); + if (!module) { + return LB_STATUS_ERROR_INVALID; + } + + box = module->FindLiveBox(filename); + if (!box) { + return LB_STATUS_ERROR_NOT_EXIST; + } + + return box->Resize(type); +} + +EAPI int livebox_change_group(const char *pkgname, const char *filename, const char *cluster, const char *category) +{ + CLiveBoxImpl *box; + CModule *module; + + module = CModule::FindModule(pkgname); + if (!module) { + return LB_STATUS_ERROR_INVALID; + } + + box = module->FindLiveBox(filename); + if (!box) { + return LB_STATUS_ERROR_NOT_EXIST; + } + + return box->ChangeGroup(cluster, category); +} + +EAPI int livebox_get_info(const char *pkgname, const char *filename, int *w, int *h, double *priority, char **content, char **title) +{ + CLiveBoxImpl *box; + CModule *module; + + module = CModule::FindModule(pkgname); + if (!module) { + return LB_STATUS_ERROR_INVALID; + } + + box = module->FindLiveBox(filename); + if (!box) { + return LB_STATUS_ERROR_NOT_EXIST; + } + + return box->GetInfo(w, h, priority, content, title); +} + +EAPI int livebox_need_to_create(const char *pkgname, const char *cluster, const char *category) +{ + CModule *module; + + module = CModule::FindModule(pkgname); + if (!module) { + return LB_STATUS_ERROR_INVALID; + } + + return module->NeedToCreate(cluster, category); +} + +EAPI char *livebox_pinup(const char *pkgname, const char *filename, int pinup) +{ + CLiveBoxImpl *box; + CModule *module; + + module = CModule::FindModule(pkgname); + if (!module) { + return NULL; + } + + box = module->FindLiveBox(filename); + if (!box) { + return NULL; + } + + return box->PinUp(pinup); +} + +EAPI int livebox_is_pinned_up(const char *pkgname, const char *filename) +{ + CLiveBoxImpl *box; + CModule *module; + + module = CModule::FindModule(pkgname); + if (!module) { + return NULL; + } + + box = module->FindLiveBox(filename); + if (!box) { + return NULL; + } + + return box->IsPinnedUp(); +} + +EAPI int livebox_system_event(const char *pkgname, const char *filename, int event) +{ + CLiveBoxImpl *box; + CModule *module; + + module = CModule::FindModule(pkgname); + if (!module) { + return NULL; + } + + box = module->FindLiveBox(filename); + if (!box) { + return NULL; + } + + return box->SystemEvent(event); +} + +/* End of a file */ -- cgit v1.2.3