Initial release of status lib(tagging) 2.0alpha master 2.0_alpha submit/master/20120920.151040
authoryoungsub ko <ys4610.ko@samsung.com>
Tue, 21 Aug 2012 09:26:04 +0000 (18:26 +0900)
committeryoungsub ko <ys4610.ko@samsung.com>
Tue, 21 Aug 2012 12:31:04 +0000 (21:31 +0900)
Change-Id: If119550084ec71ea2c0374bd3fcce610446da07b

23 files changed:
CMakeLists.txt [new file with mode: 0644]
LICENSE [new file with mode: 0755]
debian/changelog [new file with mode: 0644]
debian/compat [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/dirs [new file with mode: 0644]
debian/libstatus-dev.install.in [new file with mode: 0644]
debian/libstatus.install.in [new file with mode: 0644]
debian/libstatus.postinst.in [new file with mode: 0644]
debian/rules [new file with mode: 0755]
include/status-internal.h [new file with mode: 0755]
include/status-monitor.h [new file with mode: 0755]
include/status-type.h [new file with mode: 0755]
include/status.h [new file with mode: 0755]
include/status_log.h [new file with mode: 0755]
packaging/status.spec [new file with mode: 0755]
src/status-monitor.c [new file with mode: 0755]
src/status.c [new file with mode: 0755]
status-monitor.pc.in [new file with mode: 0644]
status.pc.in [new file with mode: 0644]
test/Makefile [new file with mode: 0644]
test/monitor_test.c [new file with mode: 0755]
test/post_test.c [new file with mode: 0755]

diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644 (file)
index 0000000..88c724f
--- /dev/null
@@ -0,0 +1,61 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+PROJECT(status C)
+
+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)
+
+SET(INSTALL_HEADERS
+       status.h
+       status-type.h
+       status-monitor.h
+)
+
+SET(SUBMODULES
+       status
+       status-monitor
+)
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include)
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs REQUIRED
+       dlog
+       vconf
+       aul
+)
+
+FOREACH(flag ${pkgs_CFLAGS})
+       SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden -g -Wall -O2")
+
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
+
+ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"")
+ADD_DEFINITIONS("-DSTATUS_USE_DLOG")
+
+FOREACH(lib_file ${SUBMODULES})
+       ADD_LIBRARY(${lib_file} SHARED src/${lib_file}.c)
+       TARGET_LINK_LIBRARIES(${lib_file} ${pkgs_LDFLAGS})
+       SET_TARGET_PROPERTIES(${lib_file} PROPERTIES SOVERSION ${VERSION_MAJOR})
+       SET_TARGET_PROPERTIES(${lib_file} PROPERTIES VERSION ${VERSION})
+       INSTALL(TARGETS ${lib_file} DESTINATION lib COMPONENT RuntimeLibraries)
+ENDFOREACH(lib_file)
+
+FOREACH(pcfile ${SUBMODULES})
+       CONFIGURE_FILE(${pcfile}.pc.in ${pcfile}.pc @ONLY)
+       SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${pcfile}.pc")
+       INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${pcfile}.pc DESTINATION lib/pkgconfig)
+ENDFOREACH(pcfile)
+
+FOREACH(hfile ${INSTALL_HEADERS})
+       INSTALL(FILES ${CMAKE_SOURCE_DIR}/include/${hfile} DESTINATION include/${PROJECT_NAME})
+ENDFOREACH(hfile)
+
diff --git a/LICENSE b/LICENSE
new file mode 100755 (executable)
index 0000000..a06208b
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,204 @@
+Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   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.
+
+   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,
+      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 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 in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) 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
+
+      (d) 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.
+
+   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 Apache License to your work.
+
+      To apply the Apache 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 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.
+
diff --git a/debian/changelog b/debian/changelog
new file mode 100644 (file)
index 0000000..d242148
--- /dev/null
@@ -0,0 +1,7 @@
+status (0.0.1-1) unstable; urgency=low
+
+  * Initial Release.
+  * Git: slp/pkgs/s/status
+  * Tag: status_0.0.1-1
+
+ -- Jeonghoon Park <jh1979.park@samsung.com>  Mon, 27 Feb 2012 14:14:00 +0900
diff --git a/debian/compat b/debian/compat
new file mode 100644 (file)
index 0000000..7ed6ff8
--- /dev/null
@@ -0,0 +1 @@
+5
diff --git a/debian/control b/debian/control
new file mode 100644 (file)
index 0000000..bb9ac6f
--- /dev/null
@@ -0,0 +1,25 @@
+Source: status
+Section: libs
+Priority: optional
+Maintainer: Jeonghoon Park <jh1979.park@samsung.com>, Young-joo Park <yjoo93.park@samsung.com>
+Build-Depends: debhelper (>= 5), dlog-dev, libslp-setting-dev, libaul-1-dev
+Standards-Version: 3.7.2
+
+Package: libstatus
+Section: libs
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: Status supporting library (shared object)
+
+Package: libstatus-dev
+Section: libs
+Architecture: any
+Depends: libstatus (= ${Source-Version})
+Description: Status supporting library (development)
+
+Package: libstatus-dbg
+Section: debug
+Architecture: any
+Depends: ${misc:Depends}, libstatus (= ${Source-Version})
+Description: Status supporting library (unstripped)
+
diff --git a/debian/dirs b/debian/dirs
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/debian/libstatus-dev.install.in b/debian/libstatus-dev.install.in
new file mode 100644 (file)
index 0000000..1bc0c16
--- /dev/null
@@ -0,0 +1,2 @@
+@PREFIX@/include/@PROJECT_NAME@/*.h
+@PREFIX@/lib/pkgconfig/*.pc
diff --git a/debian/libstatus.install.in b/debian/libstatus.install.in
new file mode 100644 (file)
index 0000000..bf766f0
--- /dev/null
@@ -0,0 +1 @@
+@PREFIX@/lib/*.so*
diff --git a/debian/libstatus.postinst.in b/debian/libstatus.postinst.in
new file mode 100644 (file)
index 0000000..c203d4f
--- /dev/null
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+if [ ${USER} = "root" ]
+then
+    vconftool set -t int memory/private/libstatus/music/state 0 -i -u 5000
+    vconftool set -t int memory/private/libstatus/radio/state 0 -i -u 5000
+    vconftool set -t int memory/private/libstatus/vr/state 0 -i -u 5000
+    vconftool set -t int memory/private/libstatus/music/pid -1 -i -u 5000
+    vconftool set -t int memory/private/libstatus/radio/pid -1 -i -u 5000
+    vconftool set -t int memory/private/libstatus/vr/pid -1 -i -u 5000
+    vconftool set -t string memory/private/libstatus/message "" -i -u 5000
+fi
+
diff --git a/debian/rules b/debian/rules
new file mode 100755 (executable)
index 0000000..29c3de4
--- /dev/null
@@ -0,0 +1,114 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+CFLAGS ?= -Wall -Werror -Winline
+LDFLAGS ?=
+PREFIX ?= /usr
+DATADIR ?= /opt
+PROJECT_NAME ?= status
+
+BUILDDIR ?= $(CURDIR)/cmake-tmp
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+       CFLAGS += -O0
+else
+       CFLAGS += -O2
+endif
+
+LDFLAGS += -Wl,--rpath=$(PREFIX)/lib -Wl,--as-needed -lm
+
+configure: configure-stamp
+configure-stamp:
+       dh_testdir
+       # Add here commands to configure the package.
+       mkdir -p $(BUILDDIR) && cd $(BUILDDIR) && CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" cmake .. -DCMAKE_INSTALL_PREFIX=$(PREFIX)
+
+       touch configure-stamp
+
+build: build-stamp
+
+build-stamp: configure-stamp
+       dh_testdir
+
+       # Add here commands to compile the package.
+       cd $(BUILDDIR) && $(MAKE)
+
+       for f in `find $(CURDIR)/debian/ -name "*.in"`; do \
+               cat $$f > $${f%.in}; \
+               sed -i -e "s#@PREFIX@#$(PREFIX)#g" $${f%.in}; \
+               sed -i -e "s#@PROJECT_NAME@#$(PROJECT_NAME)#g" $${f%.in}; \
+               sed -i -e "s#@DATADIR@#$(DATADIR)#g" $${f%.in}; \
+       done
+
+
+       touch $@
+
+clean:
+       dh_testdir
+       dh_testroot
+       rm -f build-stamp configure-stamp
+
+       # Add here commands to clean up after the build process.
+       rm -rf $(BUILDDIR)
+       #rm -rf CMakeCache.txt CMakeFiles cmake_install.cmake Makefile install_manifest.txt
+
+       for f in `find $(CURDIR)/debian/ -name "*.in"`; do \
+               rm -f $${f%.in}; \
+       done
+
+       dh_clean
+
+install: build
+       dh_testdir
+       dh_testroot
+       dh_clean -k
+       dh_installdirs
+
+       cd $(BUILDDIR) && $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install
+
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+       dh_testdir
+       dh_testroot
+#      dh_installchangelogs
+#      dh_installdocs
+       dh_installexamples
+       dh_install --sourcedir=debian/tmp
+#      dh_installmenu
+#      dh_installdebconf
+#      dh_installlogrotate
+#      dh_installemacsen
+#      dh_installpam
+#      dh_installmime
+#      dh_python
+#      dh_installinit
+#      dh_installcron
+#      dh_installinfo
+       dh_installman
+       dh_link
+       dh_strip --dbg-package=libstatus-dbg
+       dh_compress
+       dh_fixperms
+#      dh_perl
+       dh_makeshlibs
+       dh_installdeb
+       dh_shlibdeps
+       dh_gencontrol
+       dh_md5sums
+       dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install configure
diff --git a/include/status-internal.h b/include/status-internal.h
new file mode 100755 (executable)
index 0000000..619ec6f
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ *  libstatus
+ *
+ * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Youngjoo Park <yjoo93.park@samsung.com>,
+ *     Seungtaek Chung <seungtaek.chung@samsung.com>, Youngsub Ko <ys4610.ko@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.
+ *
+ */
+
+#ifndef __STATUS_INTERNAL_DEF_H__
+#define __STATUS_INTERNAL_DEF_H__
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#define STATUS_MESSAGE_KEY "memory/private/libstatus/message"
+#define STATUS_BG_MUSIC_STATE_KEY "memory/private/libstatus/music/state"
+#define STATUS_BG_MUSIC_PID_KEY "memory/private/libstatus/music/pid"
+#define STATUS_BG_RADIO_STATE_KEY "memory/private/libstatus/radio/state"
+#define STATUS_BG_RADIO_PID_KEY "memory/private/libstatus/radio/pid"
+#define STATUS_BG_VR_STATE_KEY "memory/private/libstatus/vr/state"
+#define STATUS_BG_VR_PID_KEY "memory/private/libstatus/vr/pid"
+
+static const char *background_state_keys[STATUS_BACKGROUND_TYPE_NUM] = {
+       [STATUS_BACKGROUND_TYPE_MUSIC] = STATUS_BG_MUSIC_STATE_KEY,
+       [STATUS_BACKGROUND_TYPE_RADIO] = STATUS_BG_RADIO_STATE_KEY,
+       [STATUS_BACKGROUND_TYPE_VOICE_RECORDING] = STATUS_BG_VR_STATE_KEY,
+};
+
+static const char *background_pid_keys[STATUS_BACKGROUND_TYPE_NUM] = {
+       [STATUS_BACKGROUND_TYPE_MUSIC] = STATUS_BG_MUSIC_PID_KEY,
+       [STATUS_BACKGROUND_TYPE_RADIO] = STATUS_BG_RADIO_PID_KEY,
+       [STATUS_BACKGROUND_TYPE_VOICE_RECORDING] = STATUS_BG_VR_PID_KEY,
+};
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __STATUS_INTERNAL_DEF_H__ */
+
diff --git a/include/status-monitor.h b/include/status-monitor.h
new file mode 100755 (executable)
index 0000000..3afc293
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ *  libstatus
+ *
+ * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Youngjoo Park <yjoo93.park@samsung.com>,
+ *     Seungtaek Chung <seungtaek.chung@samsung.com>, Youngsub Ko <ys4610.ko@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.
+ *
+ */
+
+#ifndef __STATUS_MONITOR_DEF_H__
+#define __STATUS_MONITOR_DEF_H__
+
+#include <status-type.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @defgroup STATUS_MONITOR_LIBRARY notification status monitor Library
+ * @brief This notification status monitor library used to display simple plain message on indicator
+ */
+
+/**
+ * @ingroup STATUS_MONITOR_LIBRARY
+ * @defgroup STATUS_MONITOR_TYPE notification status monitor type
+ * @brief notification status monitor side type
+ */
+
+/**
+ * @addtogroup STATUS_MONITOR_TYPE
+ * @{
+ */
+
+ /**
+ * @brief Called when new message is posted
+ * @param[in] message The message posted
+ * @param[in] data user data
+ * @pre status_monitor_message_cb_set() used to register this callback
+ * @see status_monitor_message_cb_set()
+ */
+typedef void (*status_message_cb)(const char *message, void *data);
+
+/**
+* @brief This callback type will be deprecated
+*/
+typedef void (*status_background_state_cb)(const status_background_type_e type,
+                       status_background_state_e state, void *data);
+
+/**
+ * @addtogroup STATUS_MONITOR_LIBRARY
+ * @{
+ */
+
+/**
+* @brief register callback for receiving message
+* @param[in] callback The callback function
+* @param[in] data user_data
+*/
+int status_monitor_message_cb_set(status_message_cb callback, void *user_data);
+
+/**
+* @brief This function will be deprecated
+*/
+int status_monitor_state_cb_set(const status_background_type_e type,
+               status_background_state_cb callback, void *user_data);
+
+/**
+* @brief unregister callback for receiving message
+* @param[in] callback The callback function
+* @param[in] data user_data
+*/
+int status_monitor_message_cb_unset(void);
+
+/**
+* @brief This function will be deprecated
+*/
+int status_monitor_state_cb_unset(const status_background_type_e type);
+
+/**
+* @brief This function will be deprecated
+*/
+int status_monitor_state_get(const status_background_type_e type,
+               status_background_state_e *state);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __STATUS_MONITOR_DEF_H__ */
+
diff --git a/include/status-type.h b/include/status-type.h
new file mode 100755 (executable)
index 0000000..8139add
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ *  libstatus
+ *
+ * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Youngjoo Park <yjoo93.park@samsung.com>,
+ *     Seungtaek Chung <seungtaek.chung@samsung.com>, Youngsub Ko <ys4610.ko@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.
+ *
+ */
+
+#ifndef __STATUS_TYPE_DEF_H__
+#define __STATUS_TYPE_DEF_H__
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @defgroup STATUS_LIBRARY_TYPE notification status type
+ * @brief Tnotification status type.
+ */
+
+/**
+ * @addtogroup STATUS_LIBRARY_TYPE
+ * @{
+ */
+
+/**
+ * @breief This enumeration type will be deprecated
+ */
+typedef enum _status_background_type_e {
+       STATUS_BACKGROUND_TYPE_MUSIC = 0,
+       STATUS_BACKGROUND_TYPE_RADIO,
+       STATUS_BACKGROUND_TYPE_VOICE_RECORDING,
+       STATUS_BACKGROUND_TYPE_NUM,
+} status_background_type_e;
+
+/**
+ * @breief This enumeration type will be deprecated
+ */
+typedef enum _status_background_state_e {
+       STATUS_BACKGROUND_STATE_STOP = 0,
+       STATUS_BACKGROUND_STATE_PAUSE,
+       STATUS_BACKGROUND_STATE_RUN,
+       STATUS_BACKGROUND_STATE_NUM,
+} status_background_state_e;
+
+/**
+ * @breief Enumeration describing error code of notification library
+ */
+enum _status_error_e {
+       STATUS_ERROR_NONE = 0,                  /**< Success */
+       STATUS_ERROR_INVALID_PARAMETER = -1,    /**< Invalid parameter */
+       STATUS_ERROR_IO_ERROR = -2,             /**< I/O error */
+};
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __STATUS_TYPE_DEF_H__ */
+
diff --git a/include/status.h b/include/status.h
new file mode 100755 (executable)
index 0000000..5f3c13b
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ *  libstatus
+ *
+ * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Youngjoo Park <yjoo93.park@samsung.com>,
+ *     Seungtaek Chung <seungtaek.chung@samsung.com>, Youngsub Ko <ys4610.ko@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.
+ *
+ */
+
+#ifndef __STATUS_DEF_H__
+#define __STATUS_DEF_H__
+
+#include <status-type.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @defgroup STATUS_CLIENT_LIBRARY notification status client Library
+ * @brief This notification status client library used to post simple plain message on indicator
+ */
+
+/**
+ * @addtogroup STATUS_CLIENT_LIBRARY
+ * @{
+ */
+
+/**
+ * @brief This function send string(message) to status monitor
+ * @details Send the message to notification status monitor.
+ * @param[in] message messages you want to post
+ * @return #STATUS_ERROR_NONE if success, other value if failure
+ * @see #_status_error_e
+ */
+int status_message_post(const char *message);
+
+/**
+* @brief This function will be deprecated
+*/
+int status_background_status_post(const status_background_type_e type,
+               const status_background_state_e state);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __STATUS_DEF_H__ */
+
diff --git a/include/status_log.h b/include/status_log.h
new file mode 100755 (executable)
index 0000000..8c385f3
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ *  libstatus
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Youngjoo Park <yjoo93.park@samsung.com>,
+ *     Seungtaek Chung <seungtaek.chung@samsung.com>, Youngsub Ko <ys4610.ko@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.
+ *
+ */
+
+
+#ifndef __STATUS_LOG_DEF_H__
+#define __STATUS_LOG_DEF_H__
+
+#ifdef STATUS_USE_DLOG
+
+#include <dlog.h>
+
+#define DBG(fmt , args...) \
+       do{ \
+               LOGD("[%s : %d] "fmt"\n",__func__,__LINE__,##args ); \
+       } while(0)
+
+#define INFO(fmt , args...) \
+       do{ \
+               LOGI("[%s : %d] "fmt"\n",__func__,__LINE__,##args ); \
+       } while(0)
+
+#define WARN(fmt , args...) \
+       do{ \
+               LOGI("[%s : %d] "fmt"\n",__func__,__LINE__,##args ); \
+       } while(0)
+
+#define ERR(fmt , args...) \
+       do{ \
+               LOGI("[%s : %d] "fmt"\n",__func__,__LINE__,##args ); \
+       } while(0)
+
+#else /* STATUS_USE_DLOG */
+
+#include <stdio.h>
+
+#define DBG(fmt , args...) \
+       do{ \
+               printf("[D][%s : %d] "fmt"\n", __func__,__LINE__,##args ); \
+       } while(0)
+
+#define INFO(fmt , args...) \
+       do{ \
+               printf("[I][%s : %d] "fmt"\n", __func__,__LINE__,##args ); \
+       } while(0)
+
+#define WARN(fmt , args...) \
+       do{ \
+               printf("[W][%s : %d] "fmt"\n", __func__,__LINE__,##args ); \
+       } while(0)
+
+#define ERR(fmt , args...) \
+       do{ \
+               printf("[E][%s : %d] "fmt"\n", __func__,__LINE__,##args ); \
+       } while(0)
+
+#endif /* STATUS_USE_DLOG */
+
+#endif /* __STATUS_LOG_DEF_H__ */
diff --git a/packaging/status.spec b/packaging/status.spec
new file mode 100755 (executable)
index 0000000..3211490
--- /dev/null
@@ -0,0 +1,63 @@
+Name:       status
+Summary:    status library
+Version:    0.0.1
+Release:    1
+Group:      TBD
+License:    Apache-2.0
+Source0:    %{name}-%{version}.tar.gz
+BuildRequires: pkgconfig(dbus-1)
+BuildRequires: pkgconfig(dlog)
+BuildRequires: pkgconfig(vconf)
+BuildRequires: pkgconfig(aul)
+BuildRequires: cmake
+Requires(post): /sbin/ldconfig
+requires(postun): /sbin/ldconfig
+%description
+Status library.
+
+%prep
+%setup -q
+
+%package devel
+Summary:    Status library (devel)
+Group:      Development/Libraries
+Requires:   %{name} = %{version}-%{release}
+
+%description devel
+Status library (devel).
+
+%build
+export LDFLAGS+="-Wl,--rpath=%{_prefix}/lib -Wl,--as-needed"
+LDFLAGS="$LDFLAGS" cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix}
+make %{?jobs:-j%jobs}
+
+%install
+%make_install
+
+
+%post
+init_vconf()
+{
+    vconftool set -t int memory/private/libstatus/music/state 0 -i -g 5000
+    vconftool set -t int memory/private/libstatus/radio/state 0 -i -g 5000
+    vconftool set -t int memory/private/libstatus/vr/state 0 -i -g 5000
+    vconftool set -t int memory/private/libstatus/music/pid -1 -i -g 5000
+    vconftool set -t int memory/private/libstatus/radio/pid -1 -i -g 5000
+    vconftool set -t int memory/private/libstatus/vr/pid -1 -i -g 5000
+    vconftool set -t string memory/private/libstatus/message "" -i -g 5000
+}
+
+/sbin/ldconfig
+init_vconf
+
+%postun -p /sbin/ldconfig
+
+%files
+%defattr(-,root,root,-)
+%{_libdir}/*.so*
+
+%files devel
+%defattr(-,root,root,-)
+%{_includedir}/%{name}/*.h
+%{_libdir}/pkgconfig/*.pc
+
diff --git a/src/status-monitor.c b/src/status-monitor.c
new file mode 100755 (executable)
index 0000000..56b18c2
--- /dev/null
@@ -0,0 +1,388 @@
+/*
+ *  libstatus
+ *
+ * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Youngjoo Park <yjoo93.park@samsung.com>,
+ *     Seungtaek Chung <seungtaek.chung@samsung.com>, Youngsub Ko <ys4610.ko@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.
+ *
+ */
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <vconf.h>
+#include <aul.h>
+
+#include "status-type.h"
+#include "status_log.h"
+#include "status-monitor.h"
+#include "status-internal.h"
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+#define LOG_TAG "status-monitor"
+
+#ifndef EXPORT_API
+#define EXPORT_API __attribute__ ((visibility("default")))
+#endif
+
+struct _message_cb_data {
+       status_message_cb callback;
+       void *data;
+};
+
+struct _state_cb_data {
+       status_background_state_cb callback;
+       void *data;
+};
+
+static struct _message_cb_data md;
+static struct _state_cb_data sd[STATUS_BACKGROUND_TYPE_NUM];
+static int state_pid[STATUS_BACKGROUND_TYPE_NUM] = {
+       [STATUS_BACKGROUND_TYPE_MUSIC] = -1,
+       [STATUS_BACKGROUND_TYPE_RADIO] = -1,
+       [STATUS_BACKGROUND_TYPE_VOICE_RECORDING] = -1,
+};
+static int dead_tracker_initialize;
+
+static void __status_message_change_cb(keynode_t *node, void *user_data)
+{
+       int type;
+       char *message = NULL;
+
+       if (!node) {
+               ERR("key node is NULL");
+               return;
+       }
+
+       if (!md.callback)
+               return;
+
+       type = vconf_keynode_get_type(node);
+       if (type != VCONF_TYPE_STRING) {
+               ERR("invail node type : %d", type);
+               return;
+       }
+
+       message = vconf_keynode_get_str(node);
+       if (!message) {
+               ERR("fail to get message");
+               return;
+       }
+
+       if (strlen(message) <= 0){
+               DBG("message has only NULL");
+               return;
+       }
+
+       DBG("message : %s", message);
+       md.callback(message, md.data);
+}
+
+EXPORT_API
+int status_monitor_message_cb_set(status_message_cb callback, void *user_data)
+{
+       int ret = 0;
+       if (!callback)
+               return STATUS_ERROR_INVALID_PARAMETER;
+
+       ret = vconf_notify_key_changed(STATUS_MESSAGE_KEY,
+                               __status_message_change_cb, NULL);
+       if (ret && errno != EALREADY) {
+               ERR("fail to set message cb");
+               return STATUS_ERROR_IO_ERROR;
+       }
+
+
+       md.callback = callback;
+       md.data = user_data;
+
+       return STATUS_ERROR_NONE;
+}
+
+EXPORT_API
+int status_monitor_message_cb_unset(void)
+{
+       vconf_ignore_key_changed(STATUS_MESSAGE_KEY,
+                               __status_message_change_cb);
+       md.callback = NULL;
+       md.data = NULL;
+
+       return STATUS_ERROR_NONE;
+}
+
+static int __status_state_reset(status_background_type_e type)
+{
+       int ret = 0;
+       const int pid = -1;
+       const int state = STATUS_BACKGROUND_STATE_STOP;
+
+       if (type < STATUS_BACKGROUND_TYPE_MUSIC
+               || type >= STATUS_BACKGROUND_TYPE_NUM) {
+               ERR("invaild type : %d", type);
+               return STATUS_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = vconf_set_int(background_pid_keys[type], pid);
+       if (ret) {
+               ERR("fail to reset [%s]", background_pid_keys[type]);
+               return STATUS_ERROR_IO_ERROR;
+       }
+       ret = vconf_set_int(background_state_keys[type], state);
+       if (ret) {
+               ERR("fail to reset [%s]", background_state_keys[type]);
+               return STATUS_ERROR_IO_ERROR;
+       }
+
+       return STATUS_ERROR_NONE;
+}
+
+
+static int __state_get_val(const status_background_type_e type,
+               status_background_state_e *state)
+{
+       int k_state = 0;
+       int ret = 0;
+
+       if (!state)
+               return STATUS_ERROR_INVALID_PARAMETER;
+
+       ret = vconf_get_int(background_state_keys[type], &k_state);
+       if (ret) {
+               ERR("fail to get state of [%s]", background_state_keys[type]);
+               return STATUS_ERROR_IO_ERROR;
+       }
+
+       *state = k_state;
+
+       return STATUS_ERROR_NONE;
+}
+
+static inline int __state_cb_call(keynode_t *node,
+                       const status_background_type_e type)
+{
+       status_background_state_e state = STATUS_BACKGROUND_STATE_STOP;
+       int ret = 0;
+
+       if (!sd[type].callback)
+               return 0;
+
+       if (node == NULL) {
+               ret = __state_get_val(type, &state);
+               if (ret)
+                       return ret;
+       } else {
+               int type;
+               type = vconf_keynode_get_type(node);
+               if (type != VCONF_TYPE_INT) {
+                       ERR("invail node type : %d", type);
+                       return -1;
+               }
+               state = vconf_keynode_get_int(node);
+               if (state < 0) {
+                       ERR("fail to get state : %d", state);
+                       return -1;
+               }
+       }
+
+       DBG("type[%d], state[%d]", type, state);
+       sd[type].callback(type, state, sd[type].data);
+
+       return 0;
+}
+
+static void __status_music_change_cb(keynode_t *node, void *user_data)
+{
+       __state_cb_call(node, STATUS_BACKGROUND_TYPE_MUSIC);
+}
+
+static void __status_radio_change_cb(keynode_t *node, void *user_data)
+{
+       __state_cb_call(node, STATUS_BACKGROUND_TYPE_RADIO);
+}
+
+static void __status_vr_change_cb(keynode_t *node, void *user_data)
+{
+       __state_cb_call(node, STATUS_BACKGROUND_TYPE_VOICE_RECORDING);
+}
+
+static vconf_callback_fn state_cbs[STATUS_BACKGROUND_TYPE_NUM] = {
+       [STATUS_BACKGROUND_TYPE_MUSIC] = __status_music_change_cb,
+       [STATUS_BACKGROUND_TYPE_RADIO] = __status_radio_change_cb,
+       [STATUS_BACKGROUND_TYPE_VOICE_RECORDING] = __status_vr_change_cb,
+
+};
+
+static int _dead_tracker(const int pid, void *data)
+{
+       int i = 0;
+
+       DBG("pid[%d] is dead", pid);
+       for (i = 0; i < STATUS_BACKGROUND_TYPE_NUM; i++) {
+               if (state_pid[i] == pid) {
+                       DBG("type[%d] - pid[%d] is dead", i, pid);
+                       __status_state_reset(i);
+               }
+       }
+
+       return 0;
+}
+
+static inline void __update_stored_pid(status_background_type_e type,
+                               keynode_t *node)
+{
+       int pid = -1;
+       if (!node)
+               return;
+
+       pid = vconf_keynode_get_int(node);
+
+       state_pid[type] = pid;
+       DBG("pid[%d], type[%d]", pid, type);
+}
+
+static void _music_pid_changed_cb(keynode_t *node, void *user_data)
+{
+       __update_stored_pid(STATUS_BACKGROUND_TYPE_MUSIC, node);
+}
+
+static void _radio_pid_changed_cb(keynode_t *node, void *user_data)
+{
+       __update_stored_pid(STATUS_BACKGROUND_TYPE_RADIO, node);
+}
+
+static void _vr_pid_changed_cb(keynode_t *node, void *user_data)
+{
+       __update_stored_pid(STATUS_BACKGROUND_TYPE_VOICE_RECORDING, node);
+}
+
+static vconf_callback_fn _pid_cbs[STATUS_BACKGROUND_TYPE_NUM] = {
+       [STATUS_BACKGROUND_TYPE_MUSIC] = _music_pid_changed_cb,
+       [STATUS_BACKGROUND_TYPE_RADIO] = _radio_pid_changed_cb,
+       [STATUS_BACKGROUND_TYPE_VOICE_RECORDING] = _vr_pid_changed_cb,
+};
+
+static int __dead_tracker_init(void)
+{
+       int ret = 0;
+
+       if (dead_tracker_initialize)
+               return 0;
+
+       ret = aul_listen_app_dead_signal(_dead_tracker, NULL);
+       if (ret != AUL_R_OK) {
+               ERR("fail to aul_listen_app_dead_signal() - %d", ret);
+               return -1;
+       }
+
+       dead_tracker_initialize = 1;
+
+       return 0;
+}
+
+static void __dead_tracker_fini(void)
+{
+       int i = 0;
+       int all_cb_removed = 1;
+
+       if (!dead_tracker_initialize)
+               return;
+
+       for (i = 0; i < STATUS_BACKGROUND_TYPE_NUM; i++)
+               all_cb_removed &= !(sd[i].callback);
+
+       if (all_cb_removed) {
+               aul_listen_app_dead_signal(NULL, NULL);
+               dead_tracker_initialize = 0;
+       }
+
+       return;
+}
+
+EXPORT_API
+int status_monitor_state_cb_set(const status_background_type_e type,
+               status_background_state_cb callback, void *user_data)
+{
+       int ret = 0;
+       int pid = -1;
+
+       if (type < STATUS_BACKGROUND_TYPE_MUSIC
+               || type >= STATUS_BACKGROUND_TYPE_NUM) {
+               ERR("invaild type : %d", type);
+               return STATUS_ERROR_INVALID_PARAMETER;
+       }
+
+       if (!callback)
+               return STATUS_ERROR_INVALID_PARAMETER;
+
+       ret = vconf_notify_key_changed(background_state_keys[type],
+                               state_cbs[type], NULL);
+       if (ret && errno != EALREADY) {
+               ERR("fail to cb set for [%d]", type);
+               return STATUS_ERROR_IO_ERROR;
+       }
+
+       ret = vconf_notify_key_changed(background_pid_keys[type],
+                       _pid_cbs[type], NULL);
+       if (ret && errno != EALREADY)
+               ERR("fail to set pid cb for [%d]", type);
+
+       vconf_get_int(background_pid_keys[type], &pid);
+       state_pid[type] = pid;
+
+       __dead_tracker_init();
+
+       sd[type].callback = callback;
+       sd[type].data = user_data;
+
+       return STATUS_ERROR_NONE;
+}
+
+EXPORT_API
+int status_monitor_state_cb_unset(const status_background_type_e type)
+{
+       if (type < STATUS_BACKGROUND_TYPE_MUSIC
+               || type >= STATUS_BACKGROUND_TYPE_NUM) {
+               ERR("invaild type : %d", type);
+               return STATUS_ERROR_INVALID_PARAMETER;
+       }
+
+       vconf_ignore_key_changed(background_state_keys[type], state_cbs[type]);
+       vconf_ignore_key_changed(background_pid_keys[type], _pid_cbs[type]);
+       sd[type].callback = NULL;
+       sd[type].data = NULL;
+       state_pid[type] = -1;
+
+       __dead_tracker_fini();
+
+       return STATUS_ERROR_NONE;
+}
+
+EXPORT_API
+int status_monitor_state_get(const status_background_type_e type,
+                       status_background_state_e *state)
+{
+       if (type < STATUS_BACKGROUND_TYPE_MUSIC
+               || type >= STATUS_BACKGROUND_TYPE_NUM) {
+               ERR("invaild type : %d", type);
+               return STATUS_ERROR_INVALID_PARAMETER;
+       }
+
+       return __state_get_val(type, state);
+}
+
diff --git a/src/status.c b/src/status.c
new file mode 100755 (executable)
index 0000000..a86ca56
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ *  libstatus
+ *
+ * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Youngjoo Park <yjoo93.park@samsung.com>,
+ *     Seungtaek Chung <seungtaek.chung@samsung.com>, Youngsub Ko <ys4610.ko@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.
+ *
+ */
+#include <sys/types.h>
+#include <unistd.h>
+#include <string.h>
+#include <vconf.h>
+
+#include "status-type.h"
+#include "status_log.h"
+#include "status.h"
+#include "status-internal.h"
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+#define LOG_TAG "status"
+
+#ifndef EXPORT_API
+#define EXPORT_API __attribute__ ((visibility("default")))
+#endif
+
+EXPORT_API
+int status_message_post(const char *message)
+{
+       int ret = 0;
+
+       if (!message) {
+               ERR("message is NULL");
+               return STATUS_ERROR_INVALID_PARAMETER;
+       }
+
+       if (strlen(message) <= 0) {
+               ERR("message has only NULL");
+               return STATUS_ERROR_INVALID_PARAMETER;
+       }
+
+
+       ret = vconf_set_str(STATUS_MESSAGE_KEY, message);
+       if (ret) {
+               ERR("fail to set message [%s]", message);
+               return STATUS_ERROR_IO_ERROR;
+       }
+
+       return STATUS_ERROR_NONE;
+}
+
+EXPORT_API
+int status_background_status_post(const status_background_type_e type,
+               const status_background_state_e state)
+{
+       int pid = -1;
+       int ret = 0;
+
+       if (type < STATUS_BACKGROUND_TYPE_MUSIC
+               || type >= STATUS_BACKGROUND_TYPE_NUM) {
+               ERR("invaild type [%d]", type);
+               return STATUS_ERROR_INVALID_PARAMETER;
+       }
+
+       if (state < STATUS_BACKGROUND_STATE_STOP
+               || state >= STATUS_BACKGROUND_STATE_NUM) {
+               ERR("invaild state [%d]", state);
+               return STATUS_ERROR_INVALID_PARAMETER;
+       }
+
+       if (state != STATUS_BACKGROUND_STATE_STOP)
+               pid = getpid();
+
+       ret = vconf_set_int(background_pid_keys[type], pid);
+       if (ret) {
+               ERR("fail to set [%s], pid[%d]",
+                       background_pid_keys[type], pid);
+               return STATUS_ERROR_IO_ERROR;
+       }
+
+       ret = vconf_set_int(background_state_keys[type], state);
+       if (ret) {
+               ERR("fail to set [%s], state[%d]",
+                       background_state_keys[type], state);
+               return STATUS_ERROR_IO_ERROR;
+       }
+
+       return STATUS_ERROR_NONE;
+}
+
diff --git a/status-monitor.pc.in b/status-monitor.pc.in
new file mode 100644 (file)
index 0000000..19d00bb
--- /dev/null
@@ -0,0 +1,11 @@
+prefix=@PREFIX@
+exec_prefix=@EXEC_PREFIX@
+libdir=@LIBDIR@
+includedir=@INCLUDEDIR@
+
+Name: status-monitor
+Description: status monitor supporting library
+Version: @VERSION@
+Requires:
+Libs: -L${libdir} -lstatus-monitor
+Cflags: -I${includedir}
diff --git a/status.pc.in b/status.pc.in
new file mode 100644 (file)
index 0000000..897c7d0
--- /dev/null
@@ -0,0 +1,11 @@
+prefix=@PREFIX@
+exec_prefix=@EXEC_PREFIX@
+libdir=@LIBDIR@
+includedir=@INCLUDEDIR@
+
+Name: status
+Description: status supporting library
+Version: @VERSION@
+Requires:
+Libs: -L${libdir} -lstatus
+Cflags: -I${includedir}
diff --git a/test/Makefile b/test/Makefile
new file mode 100644 (file)
index 0000000..ec1aacb
--- /dev/null
@@ -0,0 +1,3 @@
+all:
+       gcc -Wall post_test.c -o post_test `pkg-config status glib-2.0 --libs --cflags` -I.
+       gcc -Wall monitor_test.c -o monitor_test `pkg-config status-monitor glib-2.0 --libs --cflags` -I.
diff --git a/test/monitor_test.c b/test/monitor_test.c
new file mode 100755 (executable)
index 0000000..a3fd7da
--- /dev/null
@@ -0,0 +1,267 @@
+/*
+ *  libstatus
+ *
+ * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Youngjoo Park <yjoo93.park@samsung.com>,
+ *     Seungtaek Chung <seungtaek.chung@samsung.com>, Youngsub Ko <ys4610.ko@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.
+ *
+ */
+
+#include <stdio.h>
+#include <glib.h>
+#include <status-monitor.h>
+
+#define MAX_STRING_LEN 256
+#define CLEAR_STDIN {gint ch; while((ch=getchar())!=EOF&&ch!='\n'); }
+
+static GIOChannel *stdin_channel;
+static GMainLoop *loop;
+
+typedef void (*menu_cb)(void);
+
+struct menu_item {
+       gchar *cmd;
+       gchar *desc;
+       menu_cb func;
+};
+
+static void _monitor_message_cb(const char *message, void *data)
+{
+       printf("new message received : %s\n", message);
+}
+
+static void _monitor_state_cb(status_background_type_e type,
+               status_background_state_e state, void *data)
+{
+       switch (type) {
+       case STATUS_BACKGROUND_TYPE_MUSIC:
+               printf("music state changed : state[%d]\n", state);
+               break;
+       case STATUS_BACKGROUND_TYPE_RADIO:
+               printf("radio state changed : state[%d]\n", state);
+               break;
+       case STATUS_BACKGROUND_TYPE_VOICE_RECORDING:
+               printf("voice recorder state changed : state[%d]\n", state);
+               break;
+       default:
+               printf("unknown type - [%d] \n", type);
+               break;
+       }
+
+}
+
+static void do_quit(void)
+{
+       g_main_loop_quit(loop);
+}
+
+static void do_message_monitor_set(void)
+{
+       int ret = 0;
+
+       ret = status_monitor_message_cb_set(_monitor_message_cb, NULL);
+       if (ret != STATUS_ERROR_NONE) {
+               printf("fail to status_monitor_message_cb_set - %d \n", ret);
+               return;
+       }
+
+       printf("success to status_monitor_message_cb_set\n");
+}
+
+static void do_message_monitor_unset(void)
+{
+       int ret = 0;
+
+       ret = status_monitor_message_cb_unset();
+       if (ret != STATUS_ERROR_NONE) {
+               printf("fail to status_monitor_message_cb_unset - %d \n", ret);
+               return;
+       }
+
+       printf("success to status_monitor_message_cb_unset\n");
+}
+
+static int _get_type(status_background_type_e *type)
+{
+       int input_type;
+       int ret;
+       int pass = 0;
+       do {
+               g_print("Select type : \n");
+               g_print("0. Music\n");
+               g_print("1. Radio\n");
+               g_print("2. Voice recorder\n");
+               ret = scanf("%d", &input_type);
+               if (ret <= 0) {
+                       g_print("invaild input\n\n");
+                       input_type = -1;
+               }
+               CLEAR_STDIN;
+
+               if (input_type >= 0 && input_type <= 2)
+                       pass = 1;
+       } while (pass != 1);
+
+       if (type)
+               *type = (status_background_type_e)input_type;
+
+       return 0;
+}
+
+static void do_state_monitor_set(void)
+{
+       int ret = 0;
+       status_background_type_e type;
+
+       if (_get_type(&type)) {
+               g_print("fail to get type \n");
+               return;
+       }
+
+       ret = status_monitor_state_cb_set(type, _monitor_state_cb, NULL);
+       if (ret != STATUS_ERROR_NONE) {
+               printf("fail to status_monitor_state_cb_set"\
+                       "- type[%d], err[%d] \n", type, ret);
+               return;
+       }
+
+       printf("success to status_monitor_state_cb_set - type[%d]\n", type);
+}
+
+static void do_state_monitor_unset(void)
+{
+       int ret = 0;
+       status_background_type_e type;
+
+       if (_get_type(&type)) {
+               g_print("fail to get type \n");
+               return;
+       }
+
+       ret = status_monitor_state_cb_unset(type);
+       if (ret != STATUS_ERROR_NONE) {
+               printf("fail to status_monitor_state_cb_unset"\
+                       "- type[%d], err[%d] \n", type, ret);
+               return;
+       }
+
+       printf("success to status_monitor_state_cb_unset - type[%d]\n", type);
+}
+
+static void do_state_get(void)
+{
+       int ret = 0;
+       status_background_type_e type;
+       status_background_state_e state = STATUS_BACKGROUND_STATE_STOP;
+
+       if (_get_type(&type)) {
+               g_print("fail to get type \n");
+               return;
+       }
+
+       ret = status_monitor_state_get(type, &state);
+       if (ret != STATUS_ERROR_NONE) {
+               printf("fail to status_monitor_state_get"\
+                       "- type[%d], err[%d] \n", type, ret);
+               return;
+       }
+       printf("success to status_monitor_state_get \n");
+       printf("type[%d], state[%d]\n", type, state);
+
+}
+
+static struct menu_item g_monitor_menu[] = {
+       {"q", "quit", do_quit},
+       {"w", "test message monitor set", do_message_monitor_set},
+       {"e", "test message monitor unset", do_message_monitor_unset},
+       {"s", "test background state monitor set", do_state_monitor_set},
+       {"a", "test background state monitor unset", do_state_monitor_unset},
+       {"g", "test background state get", do_state_get},
+       {NULL, NULL, NULL},
+};
+
+static void
+monitor_display_menu(void)
+{
+       gint i = 0;
+
+       g_print("\n");
+
+       g_print("select commands \n");
+       while (g_monitor_menu[i].cmd) {
+               g_print("[%s] %s\n", g_monitor_menu[i].cmd,
+                               g_monitor_menu[i].desc);
+               i++;
+       }
+
+       g_print("\n");
+       g_print(">>> ");
+
+}
+
+static void
+_monitor_parse_command(gchar *cmd)
+{
+       gint i = 0;
+
+       while (g_monitor_menu[i].cmd) {
+               if (g_strcmp0(g_monitor_menu[i].cmd, cmd) == 0) {
+                       if (g_monitor_menu[i].func)
+                               g_monitor_menu[i].func();
+                       return;
+               }
+               i++;
+       }
+       monitor_display_menu();
+
+}
+
+
+static gboolean
+_monitor_input_cb(GIOChannel *channel)
+{
+       gchar buf[MAX_STRING_LEN+3];
+       gsize len;
+
+       g_io_channel_read(channel, buf, MAX_STRING_LEN, &len);
+       buf[len] = 0x00;
+       g_strstrip(buf);
+
+       _monitor_parse_command(buf);
+
+       return TRUE;
+
+}
+
+int main(int argc, char **argv)
+{
+       loop = g_main_loop_new(NULL, FALSE);
+
+       stdin_channel = g_io_channel_unix_new (0);
+       g_io_add_watch(stdin_channel, G_IO_IN,
+                       (GIOFunc)_monitor_input_cb, NULL);
+
+       monitor_display_menu();
+
+       g_main_loop_run(loop);
+
+       g_io_channel_unref(stdin_channel);
+       g_main_loop_unref(loop);
+
+       return 0;
+}
+
+
diff --git a/test/post_test.c b/test/post_test.c
new file mode 100755 (executable)
index 0000000..7932180
--- /dev/null
@@ -0,0 +1,223 @@
+/*
+ *  libstatus
+ *
+ * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Youngjoo Park <yjoo93.park@samsung.com>,
+ *     Seungtaek Chung <seungtaek.chung@samsung.com>, Youngsub Ko <ys4610.ko@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.
+ *
+ */
+
+#include <stdio.h>
+#include <glib.h>
+#include <status.h>
+
+#define MAX_STRING_LEN 256
+#define CLEAR_STDIN {gint ch; while((ch=getchar())!=EOF&&ch!='\n'); }
+
+static GIOChannel *stdin_channel;
+static GMainLoop *loop;
+
+typedef void (*menu_cb)(void);
+
+struct menu_item {
+       gchar *cmd;
+       gchar *desc;
+       menu_cb func;
+};
+
+static void do_quit(void)
+{
+       g_main_loop_quit(loop);
+}
+
+
+static void do_message_post(void)
+{
+       int ret;
+
+       ret = status_message_post("test status message post && aaa");
+       if (ret) {
+               g_print("fail to status_message_post() : %d\n", ret);
+               return;
+       }
+
+       g_print("success to status_message_post()\n");
+}
+
+static int _get_type(status_background_type_e *type)
+{
+       int input_type;
+       int ret;
+       int pass = 0;
+       do {
+               g_print("Select type : \n");
+               g_print("0. Music\n");
+               g_print("1. Radio\n");
+               g_print("2. Voice recorder\n");
+               ret = scanf("%d", &input_type);
+               if (ret <= 0) {
+                       g_print("invaild input\n\n");
+                       input_type = -1;
+               }
+               CLEAR_STDIN;
+
+               if (input_type >= 0 && input_type <= 2)
+                       pass = 1;
+       } while (pass != 1);
+
+       if (type)
+               *type = (status_background_type_e)input_type;
+
+       return 0;
+}
+
+static int _get_state(status_background_state_e *state)
+{
+       int input_state;
+       int ret;
+       int pass = 0;
+       do {
+               g_print("Select state : \n");
+               g_print("0. STOP \n");
+               g_print("1. PAUSE \n");
+               g_print("2. RUN \n");
+               ret = scanf("%d", &input_state);
+               if (ret <= 0) {
+                       g_print("invaild input\n\n");
+                       input_state = -1;
+               }
+               CLEAR_STDIN;
+
+               if (input_state >= 0 && input_state <= 2)
+                       pass = 1;
+       } while (pass != 1);
+
+       if (state)
+               *state = (status_background_state_e)input_state;
+
+       return 0;
+}
+
+
+static void do_background_state_post(void)
+{
+       int ret;
+       status_background_type_e type;
+       status_background_state_e state;
+
+       if (_get_type(&type)) {
+               g_print("fail to get type \n");
+               return;
+       }
+
+       if (_get_state(&state)) {
+               g_print("fail to get state \n");
+               return;
+       }
+
+       ret = status_background_status_post(type, state);
+       if (ret) {
+               g_print("fail to status_background_status_post() "\
+                       "[%d][%d]: %d\n", type, state, ret);
+               return;
+       }
+
+       g_print("success to status_background_status_post()\n");
+}
+
+
+static struct menu_item g_post_menu[] = {
+       {"q", "quit", do_quit},
+       {"m", "test message post", do_message_post},
+       {"s", "test background state post", do_background_state_post},
+       {NULL, NULL, NULL},
+};
+
+static void
+post_display_menu(void)
+{
+       gint i = 0;
+
+       g_print("\n");
+
+       g_print("select commands \n");
+       while (g_post_menu[i].cmd) {
+               g_print("[%s] %s\n", g_post_menu[i].cmd, g_post_menu[i].desc);
+               i++;
+       }
+
+       g_print("\n");
+       g_print(">>> ");
+
+}
+
+static void
+_post_parse_command(gchar *cmd)
+{
+       gint i = 0;
+
+       while (g_post_menu[i].cmd) {
+               if (g_strcmp0(g_post_menu[i].cmd, cmd) == 0) {
+                       if (g_post_menu[i].func)
+                               g_post_menu[i].func();
+                       return;
+               }
+               i++;
+       }
+       post_display_menu();
+
+}
+
+
+static gboolean
+_post_input_cb(GIOChannel *channel)
+{
+       gchar buf[MAX_STRING_LEN+3];
+       gsize len;
+
+       g_io_channel_read(channel, buf, MAX_STRING_LEN, &len);
+       buf[len] = 0x00;
+       g_strstrip(buf);
+
+       _post_parse_command(buf);
+
+       return TRUE;
+
+}
+
+int main(int argc, char **argv)
+{
+       int i = 0;
+       status_background_state_e state = STATUS_BACKGROUND_STATE_STOP;
+       loop = g_main_loop_new(NULL, FALSE);
+
+       stdin_channel = g_io_channel_unix_new (0);
+       g_io_add_watch(stdin_channel, G_IO_IN, (GIOFunc)_post_input_cb, NULL);
+
+       post_display_menu();
+
+       g_main_loop_run(loop);
+
+       for (i = 0; i < STATUS_BACKGROUND_TYPE_NUM; i++)
+               status_background_status_post(i, state);
+
+       g_io_channel_unref(stdin_channel);
+       g_main_loop_unref(loop);
+
+       return 0;
+}
+
+