Git init
authorKibum Kim <kb0929.kim@samsung.com>
Fri, 6 Jan 2012 15:50:05 +0000 (00:50 +0900)
committerKibum Kim <kb0929.kim@samsung.com>
Fri, 6 Jan 2012 15:50:05 +0000 (00:50 +0900)
49 files changed:
LICENSE [new file with mode: 0644]
Makefile.am [new file with mode: 0755]
autogen.sh [new file with mode: 0755]
build-aux/depcomp [new file with mode: 0755]
build-aux/install-sh [new file with mode: 0755]
build-aux/missing [new file with mode: 0755]
common/include/media-server-common.h [new file with mode: 0755]
common/include/media-server-error.h [new file with mode: 0755]
common/include/media-server-global.h [new file with mode: 0755]
common/include/media-server-hibernation.h [new file with mode: 0755]
common/include/media-server-inotify-internal.h [new file with mode: 0755]
common/include/media-server-inotify.h [new file with mode: 0755]
common/include/media-server-scan-internal.h [new file with mode: 0755]
common/include/media-server-scan.h [new file with mode: 0755]
common/include/media-server-socket.h [new file with mode: 0755]
common/include/media-server-thumb.h [new file with mode: 0755]
common/include/media-server-types.h [new file with mode: 0755]
common/media-server-common.c [new file with mode: 0755]
common/media-server-hibernation.c [new file with mode: 0755]
common/media-server-inotify-internal.c [new file with mode: 0755]
common/media-server-inotify.c [new file with mode: 0755]
common/media-server-main.c [new file with mode: 0755]
common/media-server-scan-internal.c [new file with mode: 0755]
common/media-server-scan.c [new file with mode: 0755]
common/media-server-socket.c [new file with mode: 0755]
common/media-server-thumb.c [new file with mode: 0755]
config.in [new file with mode: 0644]
configure.ac [new file with mode: 0755]
data/mediasvr [new file with mode: 0755]
debian/changelog [new file with mode: 0755]
debian/compat [new file with mode: 0644]
debian/control [new file with mode: 0755]
debian/copyright [new file with mode: 0644]
debian/libmedia-utils-dev.install.in [new file with mode: 0755]
debian/libmedia-utils.install.in [new file with mode: 0755]
debian/libmedia-utils.postinst.in [new file with mode: 0755]
debian/media-server.install.in [new file with mode: 0644]
debian/media-server.postinst.in [new file with mode: 0755]
debian/prerm.in [new file with mode: 0755]
debian/rules [new file with mode: 0755]
lib/include/media-util-dbg.h [new file with mode: 0755]
lib/include/media-util-err.h [new file with mode: 0755]
lib/include/media-util-internal.h [new file with mode: 0755]
lib/include/media-util-noti.h [new file with mode: 0755]
lib/include/media-util-register.h [new file with mode: 0755]
lib/media-util-noti.c [new file with mode: 0755]
lib/media-util-register.c [new file with mode: 0755]
libmedia-utils.pc.in [new file with mode: 0755]
packaging/media-server.spec [new file with mode: 0644]

diff --git a/LICENSE b/LICENSE
new file mode 100644 (file)
index 0000000..f94008a
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,206 @@
+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/Makefile.am b/Makefile.am
new file mode 100755 (executable)
index 0000000..df4cd48
--- /dev/null
@@ -0,0 +1,91 @@
+ACLOCAL_AMFLAGS = -I m4
+
+SUBDIRS = . 
+
+AM_CPPFLAGS = $(FMS_DEBUG_FLAGS)
+
+AM_LDFLAGS=-Wl,--as-needed --hash-style=both
+
+### pkgconfig ###
+pkgconfigdir = $(libdir)/pkgconfig
+dist_pkgconfig_DATA = libmedia-utils.pc
+
+nor_directory = /etc/rc.d/rc3.d
+hib_directory = /etc/rc.d/rc5.d
+
+install-data-hook:
+       mkdir $(DESTDIR)$(nor_directory) -p
+       ln -s ../init.d/mediasvr S48mediasvr
+       mv ./S48mediasvr $(DESTDIR)$(nor_directory)
+       mkdir $(DESTDIR)$(hib_directory) -p
+       ln -s ../init.d/mediasvr S48mediasvr
+       mv ./S48mediasvr $(DESTDIR)$(hib_directory)
+
+# init.d script
+fmsvcdir = /etc/rc.d/init.d
+dist_fmsvc_DATA = ./data/mediasvr
+
+### libmedia-utils.la ###
+lib_LTLIBRARIES = libmedia-utils.la
+libmedia_utils_la_SOURCES = lib/media-util-noti.c \
+                            lib/media-util-register.c
+
+libmedia_utils_la_CFLAGS = -I${srcdir}/lib/include \
+                             $(MEDIA_INFO_CFLAGS) \
+                              $(GLIB_CFLAGS) \
+                             $(DLOG_CFLAGS)
+
+libmedia_utils_la_LIBADD  =  $(MEDIA_INFO_LIBS) \
+                              $(GLIB_LIBS) \
+                              $(DLOG_LIBS)
+
+
+### file-manager-server ###
+bin_PROGRAMS = media-server
+
+media_server_SOURCES = common/media-server-common.c \
+                       common/media-server-thumb.c \
+                       common/media-server-inotify-internal.c \
+                       common/media-server-inotify.c \
+                       common/media-server-scan-internal.c \
+                       common/media-server-scan.c \
+                       common/media-server-socket.c \
+                       common/media-server-main.c 
+
+media_server_CFLAGS = -I${srcdir}/common/include \
+                      -I${srcdir}/lib/include \
+                             $(GTHREAD_CFLAGS) \
+                             $(GLIB_CFLAGS) \
+                            $(MM_FILEINFO_CFLAGS) \
+                             $(MEDIA_INFO_CFLAGS) \
+                             $(PHONESTATUS_CFLAGS) \
+                             $(UTIL_CFLAGS) \
+                             $(DLOG_CFLAGS) \
+                             $(DRM_SERVICE_CFLAGS) \
+                             $(DB_UTIL_CFLAGS) \
+                            $(AUL_CFLAG)\
+                            $(DBUS_CFLAGS)\
+                            $(LIBPMCONTROL_CFLAGS)\
+                             $(THUMB_GEN_CFLAGS)
+#                             $(LIBQUICKPANEL_CFLAGS)
+
+media_server_LDADD = $(GLIB_LIBS) \
+                              $(GTHREAD_LIBS) \
+                              $(MM_FILEINFO_LIBS) \
+                             $(MEDIA_INFO_LIBS) \
+                              $(PHONESTATUS_LIBS) \
+                              $(UTIL_LIBS) \
+                              $(DLOG_LIBS) \
+                              $(DRM_SERVICE_LIBS) \
+                              $(DB_UTIL_LIBS) \
+                             $(AUL_LIBS)\
+                             $(DBUS_LIBS)\
+                             $(LIBPMCONTROL_LIBS)\
+                             $(THUMB_GEN_LIBS)
+#                              $(LIBQUICKPANEL_LIBS)
+
+### includeheaders ###
+includeheadersdir = $(includedir)/media-utils
+includeheaders_HEADERS = lib/include/media-util-noti.h \
+                         lib/include/media-util-register.h \
+                         lib/include/media-util-err.h
diff --git a/autogen.sh b/autogen.sh
new file mode 100755 (executable)
index 0000000..a9d7ee4
--- /dev/null
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+rm -rf autom4te.cache
+rm -f aclocal.m4 ltmain.sh
+mkdir -p m4
+
+echo "Running aclocal..." ; aclocal $ACLOCAL_FLAGS -I m4 || exit 1
+echo "Running autoheader..." ; autoheader || exit 1
+echo "Running autoconf..." ; autoconf || exit 1
+echo "Running libtoolize..." ; (libtoolize --copy --automake --force || glibtoolize --automake) || exit 1
+echo "Running automake..." ; automake --add-missing --copy --foreign --force-missing || exit 1
+echo "You can now compile and build package."
diff --git a/build-aux/depcomp b/build-aux/depcomp
new file mode 100755 (executable)
index 0000000..df8eea7
--- /dev/null
@@ -0,0 +1,630 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
+# Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by `PROGRAMS ARGS'.
+  object      Object file output by `PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputing dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+   # This is just like dashmstdout with a different argument.
+   dashmflag=-xM
+   depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+   # This is just like msvisualcpp but w/o cygpath translation.
+   # Just convert the backslash-escaped backslashes to single forward
+   # slashes to satisfy depend.m4
+   cygpath_u="sed s,\\\\\\\\,/,g"
+   depmode=msvisualcpp
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+  tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'.  On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like `#:fec' to the end of the
+    # dependency line.
+    tr ' ' '
+' < "$tmpdepfile" \
+    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+    tr '
+' ' ' >> "$depfile"
+    echo >> "$depfile"
+
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' '
+' < "$tmpdepfile" \
+   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+   >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form `foo.o: dependent.h'.
+    # Do two passes, one to just change these to
+    # `$object: dependent.h' and one to simply `dependent.h:'.
+    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+    # That's a tab and a space in the [].
+    sed -e 's,^.*\.[a-z]*:[     ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+icc)
+  # Intel's C compiler understands `-MD -MF file'.  However on
+  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # ICC 7.0 will fill foo.d with something like
+  #    foo.o: sub/foo.c
+  #    foo.o: sub/foo.h
+  # which is wrong.  We want:
+  #    sub/foo.o: sub/foo.c
+  #    sub/foo.o: sub/foo.h
+  #    sub/foo.c:
+  #    sub/foo.h:
+  # ICC 7.1 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using \ :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+    sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add `dependent.h:' lines.
+    sed -ne '2,${
+              s/^ *//
+              s/ \\*$//
+              s/$/:/
+              p
+            }' "$tmpdepfile" >> "$depfile"
+  else
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+   # The Tru64 compiler uses -MD to generate dependencies as a side
+   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+   # dependencies in `foo.d' instead, so we check for that too.
+   # Subdirectories are respected.
+   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+   test "x$dir" = "x$object" && dir=
+   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+   if test "$libtool" = yes; then
+      # With Tru64 cc, shared objects can also be used to make a
+      # static library.  This mechanism is used in libtool 1.4 series to
+      # handle both shared and static libraries in a single compilation.
+      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+      #
+      # With libtool 1.5 this exception was removed, and libtool now
+      # generates 2 separate objects for the 2 libraries.  These two
+      # compilations output dependencies in $dir.libs/$base.o.d and
+      # in $dir$base.o.d.  We have to check for both files, because
+      # one of the two compilations can be disabled.  We should prefer
+      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+      # automatically cleaned when .libs/ is deleted, while ignoring
+      # the former would cause a distcleancheck panic.
+      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
+      tmpdepfile2=$dir$base.o.d          # libtool 1.5
+      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
+      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
+      "$@" -Wc,-MD
+   else
+      tmpdepfile1=$dir$base.o.d
+      tmpdepfile2=$dir$base.d
+      tmpdepfile3=$dir$base.d
+      tmpdepfile4=$dir$base.d
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+      exit $stat
+   fi
+
+   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+   do
+     test -f "$tmpdepfile" && break
+   done
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      # That's a tab and a space in the [].
+      sed -e 's,^.*\.[a-z]*:[   ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for `:'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  "$@" $dashmflag |
+    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E |
+    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+       set fnord "$@"
+       shift
+       shift
+       ;;
+    *)
+       set fnord "$@" "$arg"
+       shift
+       shift
+       ;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::     \1 \\:p' >> "$depfile"
+  echo "       " >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/install-sh b/build-aux/install-sh
new file mode 100755 (executable)
index 0000000..6781b98
--- /dev/null
@@ -0,0 +1,520 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2009-04-28.21; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" ""       $nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+       shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+       case $mode in
+         *' '* | *'    '* | *'
+'*       | *'*'* | *'?'* | *'['*)
+           echo "$0: invalid mode: $mode" >&2
+           exit 1;;
+       esac
+       shift;;
+
+    -o) chowncmd="$chownprog $2"
+       shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+       shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)        shift
+       break;;
+
+    -*)        echo "$0: invalid option: $1" >&2
+       exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  trap '(exit $?); exit' 1 2 13 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+       u_plus_rw=
+      else
+       u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+       u_plus_rw=
+      else
+       u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dst_arg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+       echo "$0: $dst_arg: Is a directory" >&2
+       exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+       (dirname "$dst") 2>/dev/null ||
+       expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+            X"$dst" : 'X\(//\)[^/]' \| \
+            X"$dst" : 'X\(//\)$' \| \
+            X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+       echo X"$dst" |
+           sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\/\)[^/].*/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\/\)$/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\).*/{
+                  s//\1/
+                  q
+                }
+                s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+       # Create intermediate dirs using mode 755 as modified by the umask.
+       # This is like FreeBSD 'install' as of 1997-10-28.
+       umask=`umask`
+       case $stripcmd.$umask in
+         # Optimize common cases.
+         *[2367][2367]) mkdir_umask=$umask;;
+         .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+         *[0-7])
+           mkdir_umask=`expr $umask + 22 \
+             - $umask % 100 % 40 + $umask % 20 \
+             - $umask % 10 % 4 + $umask % 2
+           `;;
+         *) mkdir_umask=$umask,go-w;;
+       esac
+
+       # With -d, create the new directory with the user-specified mode.
+       # Otherwise, rely on $mkdir_umask.
+       if test -n "$dir_arg"; then
+         mkdir_mode=-m$mode
+       else
+         mkdir_mode=
+       fi
+
+       posix_mkdir=false
+       case $umask in
+         *[123567][0-7][0-7])
+           # POSIX mkdir -p sets u+wx bits regardless of umask, which
+           # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+           ;;
+         *)
+           tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+           trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+           if (umask $mkdir_umask &&
+               exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+           then
+             if test -z "$dir_arg" || {
+                  # Check for POSIX incompatibilities with -m.
+                  # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                  # other-writeable bit of parent directory when it shouldn't.
+                  # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                  ls_ld_tmpdir=`ls -ld "$tmpdir"`
+                  case $ls_ld_tmpdir in
+                    d????-?r-*) different_mode=700;;
+                    d????-?--*) different_mode=755;;
+                    *) false;;
+                  esac &&
+                  $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+                    ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+                    test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                  }
+                }
+             then posix_mkdir=:
+             fi
+             rmdir "$tmpdir/d" "$tmpdir"
+           else
+             # Remove any dirs left behind by ancient mkdir implementations.
+             rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+           fi
+           trap '' 0;;
+       esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+       umask $mkdir_umask &&
+       $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+       /*) prefix='/';;
+       -*) prefix='./';;
+       *)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+       test -z "$d" && continue
+
+       prefix=$prefix$d
+       if test -d "$prefix"; then
+         prefixes=
+       else
+         if $posix_mkdir; then
+           (umask=$mkdir_umask &&
+            $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+           # Don't fail if two instances are running concurrently.
+           test -d "$prefix" || exit 1
+         else
+           case $prefix in
+             *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+             *) qprefix=$prefix;;
+           esac
+           prefixes="$prefixes '$qprefix'"
+         fi
+       fi
+       prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+       # Don't fail if two instances are running concurrently.
+       (umask $mkdir_umask &&
+        eval "\$doit_exec \$mkdirprog $prefixes") ||
+         test -d "$dstdir" || exit 1
+       obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"    2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+       # Now remove or move aside any old file at destination location.
+       # We try this two ways since rm can't unlink itself on some
+       # systems and the destination file might be busy for other
+       # reasons.  In this case, the final cleanup might fail but the new
+       # file should still install successfully.
+       {
+         test ! -f "$dst" ||
+         $doit $rmcmd -f "$dst" 2>/dev/null ||
+         { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+           { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+         } ||
+         { echo "$0: cannot unlink or rename $dst" >&2
+           (exit 1); exit 1
+         }
+       } &&
+
+       # Now rename the file to the real destination.
+       $doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/missing b/build-aux/missing
new file mode 100755 (executable)
index 0000000..28055d2
--- /dev/null
@@ -0,0 +1,376 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case $1 in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  autom4te     touch the output file, or create a stub one
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
+\`g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# normalize program name to check for.
+program=`echo "$1" | sed '
+  s/^gnu-//; t
+  s/^gnu//; t
+  s/^g//; t'`
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).  This is about non-GNU programs, so use $1 not
+# $program.
+case $1 in
+  lex*|yacc*)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  tar*)
+    if test -n "$run"; then
+       echo 1>&2 "ERROR: \`tar' requires --run"
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       exit 1
+    fi
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $program in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case $f in
+      *:*) touch_files="$touch_files "`echo "$f" |
+                                      sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+          sed 's/\.am$/.in/' |
+          while read f; do touch "$f"; done
+    ;;
+
+  autom4te*)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+       touch $file
+    else
+       test -z "$file" || exec >$file
+       echo "#! /bin/sh"
+       echo "# Created by GNU Automake missing as a replacement of"
+       echo "#  $ $@"
+       echo "exit 0"
+       chmod +x $file
+       exit 1
+    fi
+    ;;
+
+  bison*|yacc*)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+       case $LASTARG in
+       *.y)
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+           if test -f "$SRCFILE"; then
+                cp "$SRCFILE" y.tab.c
+           fi
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+           if test -f "$SRCFILE"; then
+                cp "$SRCFILE" y.tab.h
+           fi
+         ;;
+       esac
+    fi
+    if test ! -f y.tab.h; then
+       echo >y.tab.h
+    fi
+    if test ! -f y.tab.c; then
+       echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex*|flex*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+       case $LASTARG in
+       *.l)
+           SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+           if test -f "$SRCFILE"; then
+                cp "$SRCFILE" lex.yy.c
+           fi
+         ;;
+       esac
+    fi
+    if test ! -f lex.yy.c; then
+       echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+        you modified a dependency of a manual page.  You may need the
+        \`Help2man' package in order for those modifications to take
+        effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+       touch $file
+    else
+       test -z "$file" || exec >$file
+       echo ".ab help2man is required to generate this page"
+       exit $?
+    fi
+    ;;
+
+  makeinfo*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    # The file to touch is that specified with -o ...
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -z "$file"; then
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '
+       /^@setfilename/{
+         s/.* \([^ ]*\) *$/\1/
+         p
+         q
+       }' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+    fi
+    # If the file does not exist, the user really needs makeinfo;
+    # let's fail without touching anything.
+    test -f $file || exit 1
+    touch $file
+    ;;
+
+  tar*)
+    shift
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar "$@" && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar "$@" && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+       case $firstarg in
+       *o*)
+           firstarg=`echo "$firstarg" | sed s/o//`
+           tar "$firstarg" "$@" && exit 0
+           ;;
+       esac
+       case $firstarg in
+       *h*)
+           firstarg=`echo "$firstarg" | sed s/h//`
+           tar "$firstarg" "$@" && exit 0
+           ;;
+       esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/common/include/media-server-common.h b/common/include/media-server-common.h
new file mode 100755 (executable)
index 0000000..68daba6
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ *  Media Server
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-server-common.h
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief
+ */
+
+#ifndef __FEXPLORER_ENGINE_DB_PUBLIC_H__
+#define __FEXPLORER_ENGINE_DB_PUBLIC_H__
+
+#include <sqlite3.h>
+#include "media-server-global.h"
+
+#define MS_SQL_MAX_LEN 4096
+
+int ms_update_valid_type(char *path);
+
+int ms_set_db_status(ms_db_status_type_t status);
+
+int ms_db_init(bool need_db_create);
+
+int ms_media_db_open(void);
+
+int ms_media_db_close(void);
+
+int ms_update_mmc_info(void);
+
+void ms_mmc_removed_handler(void);
+
+void ms_mmc_vconf_cb(void *data);
+
+bool ms_is_mmc_supported(void);
+
+ms_dir_scan_type_t ms_get_mmc_state(void);
+
+void ms_usb_vconf_cb(void *data);
+
+void ms_register_start(void);
+
+void ms_register_end(void);
+
+int ms_register_file(const char *path, GAsyncQueue* queue);
+
+int ms_register_scanfile(const char *path);
+
+int ms_start(bool need_db_create);
+
+void ms_end(void);
+
+int ms_get_full_path_from_node(ms_dir_scan_info * const node, char *ret_path);
+
+ms_store_type_t ms_get_store_type_by_full(const char *path);
+
+int ms_strappend(char *res, const int size, const char *pattern,
+                const char *str1, const char *str2);
+
+int ms_strcopy(char *res, const int size, const char *pattern,
+              const char *str1);
+
+#ifdef _WITH_SETTING_AND_NOTI_
+bool ms_config_get_int(const char *key, int *value);
+
+bool ms_config_set_int(const char *key, int value);
+
+bool ms_config_get_str(const char *key, char *value);
+
+bool ms_config_set_str(const char *key, const char *value);
+#endif
+
+void ms_check_db_updating(void);
+
+int ms_get_category_from_mime(const char *path, int *category);
+
+bool fex_make_default_path(void);
+
+bool fex_make_default_path_mmc(void);
+
+/****************************************************************************************************
+LIBMEDIA_INFO
+*****************************************************************************************************/
+#ifdef _WITH_MP_PB_
+
+void ms_update_valid_type_start(void);
+
+void ms_update_valid_type_end(void);
+
+int ms_change_valid_type(ms_store_type_t table_id, bool validation);
+#ifdef THUMB_THREAD
+int ms_media_db_insert_with_thumb(const char *path, int category);
+#endif
+int ms_media_db_insert(const char *path, int category, bool bulk);
+
+int ms_check_file_exist_in_db(const char *file_full_path);
+
+int ms_media_db_delete(const char *full_file_path);
+
+void ms_media_db_move_start(void);
+
+void ms_media_db_move_end(void);
+
+int ms_media_db_move(ms_store_type_t src_store_type,
+                    ms_store_type_t dest_store_type,
+                    const char *src_file_full_path,
+                    const char *dest_file_full_path);
+
+bool ms_delete_all_record(ms_store_type_t store_type);
+
+#ifdef FMS_PERF
+void ms_check_start_time(struct timeval *start_time);
+
+void ms_check_end_time(struct timeval *end_time);
+
+void ms_check_time_diff(struct timeval *start_time, struct timeval *end_time);
+#endif                         /*FMS_PERF */
+#endif/*_WITH_MP_PB_*/
+
+#ifdef PROGRESS
+struct quickpanel;
+
+void ms_create_quickpanel(struct quickpanel *ms_quickpanel);
+
+void ms_update_progress(struct quickpanel *ms_quickpanel, double progress);
+
+void ms_delete_quickpanel(struct quickpanel *ms_quickpanel);
+#endif /*PROGRSS*/
+/**
+ * @}
+ */
+#endif                         /*__FEXPLORER_ENGINE_DB_PUBLIC_H__*/
+
diff --git a/common/include/media-server-error.h b/common/include/media-server-error.h
new file mode 100755 (executable)
index 0000000..131a273
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ *  Media Server
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-server-error.h
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief              
+ */
+
+#ifndef _FEXPLORER_ENGINE_ERROR_H_
+#define _FEXPLORER_ENGINE_ERROR_H_
+
+#define ERROR_MASKL16       0xFFFF
+#define ERROR(X)        (X & ERROR_MASKL16)
+
+#define MID_CONTENTS_MGR_ERROR  0      /*MID_CONTENTS_MGR_SERVICE */
+
+#define MS_ERR_NONE 0
+
+/*internal operation error*/
+#define MS_ERR_ARG_INVALID                                     (MID_CONTENTS_MGR_ERROR - ERROR(0x01))     /**< invalid argument */
+#define MS_ERR_ALLOCATE_MEMORY_FAIL            (MID_CONTENTS_MGR_ERROR - ERROR(0x02))     /**< exception of memory allocation */
+#define MS_ERR_OUT_OF_RANGE                          (MID_CONTENTS_MGR_ERROR - ERROR(0x03))
+#define MS_ERR_INVALID_DIR_PATH                (MID_CONTENTS_MGR_ERROR - ERROR(0x04))     /**< exception of invalid dir path */
+#define MS_ERR_INVALID_FILE_PATH                       (MID_CONTENTS_MGR_ERROR - ERROR(0x05))     /**< exception of invalid file path */
+#define MS_ERR_NOW_REGISTER_FILE                       (MID_CONTENTS_MGR_ERROR - ERROR(0x06))     /**< exception of invalid file path */
+
+/*directory operation error*/
+#define MS_ERR_DIR_OPEN_FAIL                           (MID_CONTENTS_MGR_ERROR - ERROR(0x10))     /**< exception of dir open*/
+#define MS_ERR_DIR_NOT_FOUND                           (MID_CONTENTS_MGR_ERROR - ERROR(0x11))     /**< exception of dir doesn't exist*/
+#define MS_ERR_DIR_READ_FAIL                                   (MID_CONTENTS_MGR_ERROR - ERROR(0x13))    /**< exception of dir read*/
+
+/*file operation error*/
+#define MS_ERR_FILE_NOT_FOUND                          (MID_CONTENTS_MGR_ERROR - ERROR(0x20))     /**< exception of file doesn't exist*/
+#define MS_ERR_FILE_OPEN_FAIL                          (MID_CONTENTS_MGR_ERROR - ERROR(0x21))     /**< exception of file doesn't exist*/
+
+/*db operation error*/
+#define MS_ERR_DB_TRUNCATE_TABLE_FAIL  (MID_CONTENTS_MGR_ERROR - ERROR(0x30))     /**< truncating table fails */
+#define MS_ERR_DB_INSERT_RECORD_FAIL           (MID_CONTENTS_MGR_ERROR - ERROR(0x31))     /**< inserting record fails */
+#define MS_ERR_DB_DELETE_RECORD_FAIL           (MID_CONTENTS_MGR_ERROR - ERROR(0x32))     /**< deleting record fails */
+#define MS_ERR_DB_UPDATE_RECORD_FAIL           (MID_CONTENTS_MGR_ERROR - ERROR(0x33))     /**< updating record fails */
+#define MS_ERR_DB_CONNECT_FAIL                 (MID_CONTENTS_MGR_ERROR - ERROR(0x34))     /**< connecting database fails */
+#define MS_ERR_DB_DISCONNECT_FAIL                      (MID_CONTENTS_MGR_ERROR - ERROR(0x35))     /**< connecting database fails */
+#define MS_ERR_DB_OPERATION_FAIL                       (MID_CONTENTS_MGR_ERROR - ERROR(0x36))     /**< connecting database fails */
+
+/*drm operation error*/
+#define MS_ERR_DRM_GET_TYPE                            (MID_CONTENTS_MGR_ERROR - ERROR(0x40))     
+#define MS_ERR_DRM_MOVE_FAIL                           (MID_CONTENTS_MGR_ERROR - ERROR(0x41))   /**< can't copy/move drm file because of permission */
+#define MS_ERR_DRM_REGISTER_FAIL                       (MID_CONTENTS_MGR_ERROR - ERROR(0x42))  
+#define MS_ERR_DRM_EXTRACT_FAIL                        (MID_CONTENTS_MGR_ERROR - ERROR(0x43))  
+
+/*IPC operation error*/
+#define MS_ERR_SOCKET_CONN                             (MID_CONTENTS_MGR_ERROR - ERROR(0x50))   /**< Socket connect error */
+#define MS_ERR_SOCKET_BIND                                     (MID_CONTENTS_MGR_ERROR - ERROR(0x51))   /**< Socket connect error */
+#define MS_ERR_SOCKET_MSG                                      (MID_CONTENTS_MGR_ERROR - ERROR(0x52))   /**< Socket message error */
+#define MS_ERR_SOCKET_SEND                             (MID_CONTENTS_MGR_ERROR - ERROR(0x53))   /**< Socket send error */
+#define MS_ERR_SOCKET_RECEIVE                          (MID_CONTENTS_MGR_ERROR - ERROR(0x54))   /**< Socket receive error */
+
+/*ETC*/
+#define MS_ERR_LOW_MEMORY                                      (MID_CONTENTS_MGR_ERROR - ERROR(0x60))   /**< low memory*/
+#define MS_ERR_UNKNOWN_ERROR                           (MID_CONTENTS_MGR_ERROR - ERROR(0x61))   /**< unknow error*/
+#define MS_ERR_VCONF_SET_FAIL                          (MID_CONTENTS_MGR_ERROR - ERROR(0x62))   /**< vconf set fail*/
+#define MS_ERR_VCONF_GET_FAIL                          (MID_CONTENTS_MGR_ERROR - ERROR(0x63))   /**< vconf get fail*/
+#define MS_ERR_NOT_MEDIA_FILE                          (MID_CONTENTS_MGR_ERROR - ERROR(0x64))   /**< not media file*/
+
+#define MS_ERR_MAX                                                     (MID_CONTENTS_MGR_ERROR - ERROR(0xff))   /**< Max count*/
+#endif                         /* _FEXPLORER_ENGINE_ERROR_H_ */
+/**
+ * @}
+ */
diff --git a/common/include/media-server-global.h b/common/include/media-server-global.h
new file mode 100755 (executable)
index 0000000..a3c588e
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ *  Media Server
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-server-global.h
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief              
+ */
+
+#ifndef _FEXPLORER_ENGINEGLOBAL_H_
+#define _FEXPLORER_ENGINEGLOBAL_H_
+#include <malloc.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <time.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <glib.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <sys/file.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/stat.h>
+#include <sys/vfs.h>
+#include <sys/syscall.h>
+#include <dlfcn.h>
+#include <errno.h>
+
+#include <dlog.h>
+
+#include "media-server-error.h"
+#include "media-server-types.h"
+
+#define _WITH_MP_PB_
+#define _WITH_DRM_SERVICE_     /*drm-servic3 */
+#define _WITH_SETTING_AND_NOTI_        /*replace gconf-dbus */
+#define FMS_PERF
+
+/* To enable hibernation callback */
+/*#define _USE_HIB*/
+
+/* To enable progress bar in quickpanel */
+/*#define PROGRESS*/
+
+/* To enable thumbnail thread*/
+/*#define THUMB_THREAD*/
+
+#define FEXPLORER_DEBUG
+#ifndef DEPRECATED             /*temp definition for deprecated */
+#define DEPRECATED __attribute__((deprecated))
+#endif
+
+#ifdef FEXPLORER_DEBUG
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+#define LOG_TAG "MEDIA-SERVER"
+#define MS_DBG_START()              LOGD("[%d, %s-%d] ========[ START ]========\n" , syscall(__NR_gettid), __func__ , __LINE__);
+#define MS_DBG_END()                  LOGD("[%d, %s-%d] ========[  END  ]========\n" ,syscall(__NR_gettid), __func__ , __LINE__);
+#define MS_DBG_FUNC_LINE()      LOGD("[%s-%d] debug\n" , __func__ , __LINE__);
+#define MS_DBG(fmt, args...)        LOGD("[%d, %s-%d] " fmt "\n" , syscall(__NR_gettid), __func__ , __LINE__ , ##args);
+#endif                         /*FEXPLORER_DEBUG */
+
+#define MS_DRM_CONTENT_TYPE_LENGTH 100
+#define MS_REGISTER_COUNT 100 /*For bundle commit*/
+#define MS_VALID_COUNT 100 /*For bundle commit*/
+#define MS_MOVE_COUNT 100 /*For bundle commit*/
+
+/* in case of 32 bytes machine*/
+#define DUMMY_FIELD_LEN_32(n)           ((((n-1) / 8 + 1) * 2) / sizeof(long) + 6)
+
+#define MALLOC(a) malloc(a)
+#define FREE(a) free(a)
+
+#define MS_PHONE_ROOT_PATH     "opt/media"
+#define MS_MMC_ROOT_PATH               "opt/storage/sdcard"
+#define MS_DB_UPDATE_NOTI_PATH "/opt/data/file-manager-service"
+
+#define end_thread 100
+
+/*This macro is used to check the lastest usb mode*/
+#define MS_USB_MODE_KEY "db/Apps/mediaserver/usbmode"
+enum {
+       MS_VCONFKEY_NORMAL_MODE = 0x00,
+       MS_VCONFKEY_MASS_STORAGE_MODE = 0x01
+};
+#define MS_MMC_INFO_KEY "db/Apps/mediaserver/mmc_info"
+
+#define MS_THUMB_STATUS "db/Apps/mediaserver/thumb_status"
+enum {
+       MS_VCONFKEY_THUMB_NONE = 0x00,
+       MS_VCONFKEY_THUMB_PAUSE = 0x01,
+       MS_VCONFKEY_THUMB_RESUME = 0x02
+};
+/**
+ * @}
+ */
+
+#endif /*_FEXPLORER_ENGINEGLOBAL_H_*/
diff --git a/common/include/media-server-hibernation.h b/common/include/media-server-hibernation.h
new file mode 100755 (executable)
index 0000000..53976ce
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ *  Media Server
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-server-hibernation.h
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief              
+ */
+
+#ifdef _USE_HIB
+#ifndef _FEXPLORER_ENGINE_HIB_H_
+#define _FEXPLORER_ENGINE_HIB_H_
+
+int _hibernation_initialize(void);
+
+void _hibernation_fianalize(void);
+
+#endif                         /* _FEXPLORER_ENGINE_HIB_H_ */
+#endif
diff --git a/common/include/media-server-inotify-internal.h b/common/include/media-server-inotify-internal.h
new file mode 100755 (executable)
index 0000000..88548be
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ *  Media Server
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-server-inotify-internal.h
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief              
+ */
+#include <sys/inotify.h>
+#include <sqlite3.h>
+#include <drm-service.h>
+
+#define INOTI_EVENT_SIZE (sizeof(struct inotify_event))
+#define INOTI_BUF_LEN (1024*(INOTI_EVENT_SIZE+16))
+#define INOTI_FOLDER_COUNT_MAX 1024
+
+typedef struct ms_create_file_info {
+       char *name;
+       int wd;
+       struct ms_create_file_info *previous;
+       struct ms_create_file_info *next;
+} ms_create_file_info;
+
+int _ms_inoti_add_create_file_list(int wd, char *name);
+
+int _ms_inoti_delete_create_file_list(ms_create_file_info *node);
+
+ms_create_file_info *_ms_inoti_find_create_file_list(int wd, char *name);
+
+int _fex_is_default_path(const char *path);
+
+bool _ms_inoti_full_path(int wd, char *name, char *path, int sizeofpath);
+
+bool _ms_inoti_get_full_path(int wd, char *name, char *path, int sizeofpath);
+
diff --git a/common/include/media-server-inotify.h b/common/include/media-server-inotify.h
new file mode 100755 (executable)
index 0000000..184a599
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ *  Media Server
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-server-inotify.h
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief
+ */
+
+#ifndef _FEXPLORER_ENGINE_INOTI_H_
+#define _FEXPLORER_ENGINE_INOTI_H_
+
+#include <glib.h>
+
+typedef struct ms_ignore_file_info {
+       char *path;
+       struct ms_ignore_file_info *previous;
+       struct ms_ignore_file_info *next;
+} ms_ignore_file_info;
+
+int ms_inoti_init(void);
+
+gboolean ms_inoti_thread(gpointer data);
+
+void ms_inoti_add_watch(char *path);
+
+int ms_inoti_add_watch_with_node(ms_dir_scan_info * const current_node);
+
+void ms_inoti_remove_watch_recursive(char *path);
+
+void ms_inoti_remove_watch(char *path);
+
+void ms_inoti_modify_watch(char *path_from, char *path_to);
+
+int ms_inoti_add_ignore_file(const char *path);
+
+int ms_inoti_delete_ignore_file(ms_ignore_file_info * delete_node);
+
+ms_ignore_file_info *ms_inoti_find_ignore_file(const char *path);
+
+void ms_inoti_delete_mmc_ignore_file(void);
+#endif                         /* _FEXPLORER_ENGINE_INOTI_H_ */
diff --git a/common/include/media-server-scan-internal.h b/common/include/media-server-scan-internal.h
new file mode 100755 (executable)
index 0000000..7837792
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ *  Media Server
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-server-scan-internal.h
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief
+ */
+#include "media-server-global.h"
+#include "media-server-types.h"
+
+#ifdef PROGRESS
+struct quickpanel;
+void _ms_dir_scan(ms_scan_data_t * scan_data, struct quickpanel *ms_quickpanel);
+#else
+void _ms_dir_scan(ms_scan_data_t * scan_data);
+#endif
diff --git a/common/include/media-server-scan.h b/common/include/media-server-scan.h
new file mode 100755 (executable)
index 0000000..1cea90b
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ *  Media Server
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-server-scan.h
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief
+ */
+
+gboolean ms_scan_thread(void *data);
diff --git a/common/include/media-server-socket.h b/common/include/media-server-socket.h
new file mode 100755 (executable)
index 0000000..934c0bd
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ *  Media Server
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-server-thumb.c
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief
+ */
+ #include "media-server-global.h"
+#include "media-server-types.h"
+
+gboolean ms_socket_thread(void *data);
+
diff --git a/common/include/media-server-thumb.h b/common/include/media-server-thumb.h
new file mode 100755 (executable)
index 0000000..064c0f9
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ *  Media Server
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-server-thumb.h
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief
+ */
+#include "media-server-global.h"
+#include "media-server-types.h"
+
+#ifdef THUMB_THREAD
+gboolean ms_thumb_thread(void *data);
+#endif
diff --git a/common/include/media-server-types.h b/common/include/media-server-types.h
new file mode 100755 (executable)
index 0000000..da63a7c
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ *  Media Server
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-server-types.h
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief
+ */
+
+#include <stdbool.h>
+#include <glib.h>
+
+#ifndef _FEXPLORER_TYPES_H_
+#define _FEXPLORER_TYPES_H_
+
+#if !defined(__TYPEDEF_INT64__)
+#define __TYPEDEF_INT64__
+typedef long long int64;
+#endif
+
+/*System default folder definition*/
+#define FAT_FILENAME_LEN_MAX          255      /* not inc null */
+#define FAT_FILEPATH_LEN_MAX          4096     /* inc null */
+#define FAT_DIRECTORY_LEN_MAX         244
+
+/* The following MACROs(TAF_XXX) are defined in "fs-limit.h"*/
+#define MS_FILE_NAME_LEN_MAX     FAT_FILENAME_LEN_MAX           /**< File name max length on file system */
+#define MS_FILE_PATH_LEN_MAX     FAT_FILEPATH_LEN_MAX           /**< File path max length (include file name) on file system */
+
+#define MS_CATEGORY_UNKNOWN    0x00000000      /**< Default */
+#define MS_CATEGORY_ETC                0x00000001      /**< ETC category */
+#define MS_CATEGORY_IMAGE              0x00000002      /**< Image category */
+#define MS_CATEGORY_VIDEO              0x00000004      /**< Video category */
+#define MS_CATEGORY_MUSIC      0x00000008      /**< Music category */
+#define MS_CATEGORY_SOUND      0x00000010      /**< Sound category */
+#define MS_CATEGORY_DRM                0x00000020      /**< DRM category */
+
+typedef enum {
+       MS_PHONE,    /**< Stored only in phone */
+       MS_MMC,      /**< Stored only in MMC */
+} ms_store_type_t;
+
+typedef enum {
+       MS_SCAN_NONE,
+       MS_SCAN_VALID,
+       MS_SCAN_PART,
+       MS_SCAN_ALL,
+} ms_dir_scan_type_t;
+
+typedef enum {
+       MS_DB_UPDATING = 0,
+       MS_DB_UPDATED = 1
+} ms_db_status_type_t;
+
+typedef struct ms_dir_scan_info {
+       char *name;
+       struct ms_dir_scan_info *parent;
+       struct ms_dir_scan_info *Rbrother;
+       struct ms_dir_scan_info *next;
+} ms_dir_scan_info;
+
+typedef struct {
+       ms_store_type_t db_type;
+       ms_dir_scan_type_t scan_type;
+} ms_scan_data_t;
+
+typedef struct ms_dir_data {
+       char *name;
+       int wd;
+       bool db_updated;
+       struct ms_dir_data *next;
+} ms_dir_data;
+
+/**
+ * @}
+ */
+
+#endif /*_FEXPLORER_TYPES_H_*/
diff --git a/common/media-server-common.c b/common/media-server-common.c
new file mode 100755 (executable)
index 0000000..3f007cd
--- /dev/null
@@ -0,0 +1,1780 @@
+/*
+ *  Media Server
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-server-common.c
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief       This file implements main database operation.
+ */
+#include <media-svc.h>
+#include <media-thumbnail.h>
+#include <audio-svc-error.h>
+#include <audio-svc.h>
+#include <db-util.h>
+#include <pmapi.h>
+#include <vconf.h>
+#include <drm-service.h>
+#ifdef PROGRESS
+#include <quickpanel.h>
+#endif
+#include <aul/aul.h>
+#include <mmf/mm_file.h>
+
+#include "media-server-global.h"
+#include "media-server-common.h"
+#include "media-server-inotify.h"
+
+#ifdef FMS_PERF
+#include <sys/time.h>
+#define MILLION 1000000L
+#endif
+
+#define CONTENT_TYPE_NUM 4
+#define MUSIC_MIME_NUM 28
+#define SOUND_MIME_NUM 1
+#define MIME_TYPE_LENGTH 255
+#define MIME_LENGTH 50
+#define _3GP_FILE ".3gp"
+#define _MP4_FILE ".mp4"
+#define MMC_INFO_SIZE 256
+
+int mmc_state = 0;
+int ums_mode = 0;
+int current_usb_mode = 0;
+
+extern GAsyncQueue *scan_queue;
+
+struct timeval g_mmc_start_time;
+struct timeval g_mmc_end_time;
+
+typedef struct {
+       char content_type[15];
+       int category_by_mime;
+} fex_content_table_t;
+
+static const fex_content_table_t content_category[CONTENT_TYPE_NUM] = {
+       {"audio", MS_CATEGORY_SOUND},
+       {"image", MS_CATEGORY_IMAGE},
+       {"video", MS_CATEGORY_VIDEO},
+       {"application", MS_CATEGORY_ETC},
+};
+
+static const char music_mime_table[MUSIC_MIME_NUM][MIME_LENGTH] = {
+       /*known mime types of normal files*/
+       "mpeg",
+       "ogg",
+       "x-ms-wma",
+       "x-flac",
+       "mp4",
+       /* known mime types of drm files*/
+       "mp3",
+       "x-mp3", /*alias of audio/mpeg*/
+       "x-mpeg", /*alias of audio/mpeg*/
+       "3gpp",
+       "x-ogg", /*alias of  audio/ogg*/
+       "vnd.ms-playready.media.pya:*.pya", /*playready*/
+       "wma",
+       "aac",
+       "x-m4a", /*alias of audio/mp4*/
+       /* below mimes are rare*/
+       "x-vorbis+ogg",
+       "x-flac+ogg",
+       "x-matroska",
+       "ac3",
+       "mp2",
+       "x-ape",
+       "x-ms-asx",
+       "vnd.rn-realaudio",
+
+       "x-vorbis", /*alias of audio/x-vorbis+ogg*/
+       "vorbis", /*alias of audio/x-vorbis+ogg*/
+       "x-oggflac",
+       "x-mp2", /*alias of audio/mp2*/
+       "x-pn-realaudio", /*alias of audio/vnd.rn-realaudio*/
+       "vnd.m-realaudio", /*alias of audio/vnd.rn-realaudio*/
+};
+
+static const char sound_mime_table[SOUND_MIME_NUM][MIME_LENGTH] = {
+       "x-smaf",
+};
+
+int ms_update_valid_type(char *path)
+{
+       MS_DBG_START();
+
+       int res = MS_ERR_NONE;
+       int err;
+       int category = MS_CATEGORY_UNKNOWN;
+
+       MS_DBG("%s", path);
+
+       err = ms_get_category_from_mime(path, &category);
+       if (err < 0) {
+               MS_DBG("ms_get_category_from_mime fails");
+               return err;
+       }
+
+       /*if music, call mp_svc_set_item_valid() */
+       if (category & MS_CATEGORY_MUSIC || category & MS_CATEGORY_SOUND) {
+               /*check exist in Music DB, If file is not exist, insert data in DB. */
+               err = audio_svc_check_item_exist(path);
+               if (err == AUDIO_SVC_ERROR_DB_NO_RECORD) {
+                       MS_DBG("not exist in Music DB. insert data");
+#ifdef THUMB_THREAD
+                       err = ms_media_db_insert_with_thumb(path, category);
+#else
+                       err = ms_media_db_insert(path, category, true);
+#endif 
+                       if (err != MS_ERR_NONE) {
+                               MS_DBG ("ms_media_db_insert() error %d", err);
+                               res = err;
+                       }
+               }
+               else if (err == AUDIO_SVC_ERROR_NONE) {
+                       /*if meta data of file exist, change valid field to "1" */
+                       MS_DBG("Item exist");
+
+                       err = audio_svc_set_item_valid(path, true);
+                       if (err != AUDIO_SVC_ERROR_NONE)
+                               MS_DBG("audio_svc_set_item_valid() error : %d", err);
+               }
+               else
+               {
+                       MS_DBG("audio_svc_check_item_exist() error : %d", err);
+                       res = MS_ERR_DB_OPERATION_FAIL;
+               }
+       }
+       /*if file is image file, call mb_svc_set_db_item_valid() */
+       else if (category & MS_CATEGORY_VIDEO || category & MS_CATEGORY_IMAGE) {
+               ms_store_type_t store_type;
+               minfo_store_type mb_stroage;
+
+               store_type = ms_get_store_type_by_full(path);
+               mb_stroage = (store_type == MS_MMC) ? MINFO_MMC : MINFO_PHONE;
+
+               err = minfo_set_item_valid(mb_stroage, path, true);
+               if (err != MB_SVC_ERROR_NONE) {
+                       MS_DBG("not exist in Media DB. insert data");
+
+                       ms_update_valid_type_end();
+
+#ifdef THUMB_THREAD
+                       err = ms_media_db_insert_with_thumb(path, category);
+#else
+                       err = ms_media_db_insert(path, category, true);
+#endif 
+                       if (err != MS_ERR_NONE)
+                               MS_DBG("ms_media_db_insert() error : %d", err);
+
+                       ms_update_valid_type_start();
+               }
+               else {
+                       MS_DBG("Item exist");
+               }
+       }
+
+       if (category & MS_CATEGORY_DRM) {
+               DRM_RESULT drm_res;
+
+               ms_inoti_add_ignore_file(path);
+               drm_res = drm_svc_register_file(path);
+               if (drm_res != DRM_RESULT_SUCCESS) {
+                       MS_DBG("drm_svc_register_file error : %d", drm_res);
+                       res = MS_ERR_DRM_REGISTER_FAIL;
+               }
+       }
+
+       MS_DBG_END();
+
+       return res;
+}
+
+static int _ms_set_power_mode(ms_db_status_type_t status)
+{
+       int res = MS_ERR_NONE;
+       int err;
+
+       switch (status) {
+       case MS_DB_UPDATING:
+               err = pm_lock_state(LCD_OFF, STAY_CUR_STATE, 0);
+               if (err != 0)
+                       res = MS_ERR_UNKNOWN_ERROR;
+               break;
+       case MS_DB_UPDATED:
+               err = pm_unlock_state(LCD_OFF, STAY_CUR_STATE);
+               if (err != 0)
+                       res = MS_ERR_UNKNOWN_ERROR;
+               break;
+       default:
+               MS_DBG("Unacceptable type : %d", status);
+               break;
+       }
+
+       return res;
+}
+
+int ms_set_db_status(ms_db_status_type_t status)
+{
+       int res = MS_ERR_NONE;
+       int err = 0;
+
+       if (status == MS_DB_UPDATING) {
+               if (ms_config_set_int(VCONFKEY_FILEMANAGER_DB_STATUS, VCONFKEY_FILEMANAGER_DB_UPDATING))
+                         res = MS_ERR_VCONF_SET_FAIL;
+       } else if (status == MS_DB_UPDATED) {
+               if(ms_config_set_int(VCONFKEY_FILEMANAGER_DB_STATUS,  VCONFKEY_FILEMANAGER_DB_UPDATED))
+                         res = MS_ERR_VCONF_SET_FAIL;
+       }
+
+       err = _ms_set_power_mode(status);
+       if (err != MS_ERR_NONE) {
+               MS_DBG("_ms_set_power_mode fail");
+               res = err;
+       }
+
+       return res;
+}
+
+GMutex * db_mutex;
+
+int ms_db_init(bool need_db_create)
+{
+       MS_DBG_START();
+
+       ms_scan_data_t *phone_scan_data;
+       ms_scan_data_t *mmc_scan_data;
+
+       phone_scan_data = malloc(sizeof(ms_scan_data_t));
+       mmc_scan_data = malloc(sizeof(ms_scan_data_t));
+       MS_DBG("*********************************************************");
+       MS_DBG("*** Begin to check tables of file manager in database ***");
+       MS_DBG("*********************************************************");
+
+       fex_make_default_path();
+
+       phone_scan_data->db_type = MS_PHONE;
+
+       if (need_db_create) {
+               /*insert records */
+               MS_DBG("Create DB");
+
+               phone_scan_data->scan_type = MS_SCAN_ALL;
+       } else {
+               MS_DBG("JUST ADD WATCH");
+               phone_scan_data->scan_type = MS_SCAN_NONE;
+       }
+
+       /*push data to fex_dir_scan_cb */
+       g_async_queue_push(scan_queue, GINT_TO_POINTER(phone_scan_data));
+
+       if (ms_is_mmc_supported()) {
+               mmc_state = VCONFKEY_SYSMAN_MMC_MOUNTED;
+
+#ifdef _WITH_DRM_SERVICE_
+               if (drm_svc_insert_ext_memory() == DRM_RESULT_SUCCESS)
+                       MS_DBG
+                           ("fex_db_service_init : drm_svc_insert_ext_memory OK");
+#endif
+
+               fex_make_default_path_mmc();
+
+               mmc_scan_data->scan_type = ms_get_mmc_state();
+               mmc_scan_data->db_type = MS_MMC;
+
+               MS_DBG("ms_get_mmc_state is %d", mmc_scan_data->scan_type);
+
+               g_async_queue_push(scan_queue, GINT_TO_POINTER(mmc_scan_data));
+       } 
+
+       MS_DBG_END();
+       return 0;
+}
+
+int ms_media_db_open(void)
+{
+       int err;
+
+       /*Lock mutex for openning db*/
+       g_mutex_lock(db_mutex);
+
+       err = minfo_init();
+       if (err != MB_SVC_ERROR_NONE) {
+               MS_DBG("minfo_init() error : %d", err);
+
+               g_mutex_unlock(db_mutex);
+
+               return MS_ERR_DB_CONNECT_FAIL;
+       }
+
+       err = audio_svc_open();
+       if (err != AUDIO_SVC_ERROR_NONE) {
+               MS_DBG("audio_svc_open() error : %d", err);
+               err = minfo_finalize();
+               if (err != MB_SVC_ERROR_NONE)
+                       MS_DBG("minfo_finalize() error: %d", err);
+
+               g_mutex_unlock(db_mutex);
+
+               return MS_ERR_DB_CONNECT_FAIL;
+       }
+       MS_DBG("connect Media DB");
+
+       g_mutex_unlock(db_mutex);
+
+       return MS_ERR_NONE;
+}
+
+int ms_media_db_close(void)
+{
+       int err;
+
+       err = audio_svc_close();
+       if (err != AUDIO_SVC_ERROR_NONE) {
+               MS_DBG("audio_svc_close() error : %d", err);
+               return MS_ERR_DB_DISCONNECT_FAIL;
+       }
+
+       err = minfo_finalize();
+       if (err != MB_SVC_ERROR_NONE) {
+               MS_DBG("minfo_finalize() error: %d", err);
+               return MS_ERR_DB_DISCONNECT_FAIL;
+       }
+
+       MS_DBG("Disconnect Media DB");
+
+       return MS_ERR_NONE;
+}
+
+int
+_ms_update_mmc_info(const char *cid)
+{
+       MS_DBG_START();
+       bool res;
+
+       if (cid == NULL) {
+               MS_DBG("Parameters are invalid");
+               return MS_ERR_ARG_INVALID;
+       }
+
+       res = ms_config_set_str(MS_MMC_INFO_KEY, cid);
+       if (!res) {
+               MS_DBG("fail to get MS_MMC_INFO_KEY");
+               return MS_ERR_VCONF_SET_FAIL;
+       }
+
+       MS_DBG_END();
+
+       return MS_ERR_NONE;
+}
+
+bool
+_ms_check_mmc_info(const char *cid)
+{
+       MS_DBG_START();
+
+       char pre_mmc_info[MMC_INFO_SIZE] = { 0 };
+       bool res = false;
+
+       if (cid == NULL) {
+               MS_DBG("Parameters are invalid");
+               return false;
+       }
+
+       res = ms_config_get_str(MS_MMC_INFO_KEY, pre_mmc_info);
+       if (!res) {
+               MS_DBG("fail to get MS_MMC_INFO_KEY");
+               return false;
+       }
+
+       MS_DBG("Last MMC info   = %s", pre_mmc_info);
+       MS_DBG("Current MMC info = %s", cid);
+
+       if (strcmp(pre_mmc_info, cid) == 0) {
+               return true;
+       }
+
+       MS_DBG_END();
+       return false;
+}
+
+static int _get_contents(const char *filename, char *buf)
+{
+       FILE *fp;
+
+       MS_DBG("%s", filename);
+
+       fp = fopen(filename, "rt");
+       if (fp == NULL) {
+               MS_DBG("fp is NULL");
+               return MS_ERR_FILE_OPEN_FAIL;
+       }
+       fgets(buf, 255, fp);
+
+       fclose(fp);
+
+       return MS_ERR_NONE;
+}
+
+/*need optimize*/
+int _ms_get_mmc_info(char *cid)
+{
+       MS_DBG_START();
+
+       int i;
+       int j;
+       int len;
+       int err = -1;
+       bool getdata = false;
+       bool bHasColon = false;
+       char path[MS_FILE_PATH_LEN_MAX] = { 0 };
+       char mmcpath[MS_FILE_PATH_LEN_MAX] = { 0 };
+
+       DIR *dp;
+       struct dirent ent;
+       struct dirent *res = NULL;
+
+       /* mmcblk0 and mmcblk1 is reserved for movinand */
+       for (j = 1; j < 3; j++) {
+               len = snprintf(mmcpath, MS_FILE_PATH_LEN_MAX, "/sys/class/mmc_host/mmc%d/", j);
+               if (len < 0) {
+                       MS_DBG("FAIL : snprintf");
+                       return MS_ERR_UNKNOWN_ERROR;
+               }
+               else {
+                       mmcpath[len] = '\0';
+               }
+
+               dp = opendir(mmcpath);
+
+               if (dp == NULL) {
+                       MS_DBG("dp is NULL");
+                       {
+                               return MS_ERR_DIR_OPEN_FAIL;
+                       }
+               }
+
+               while (!readdir_r(dp, &ent, &res)) {
+                        /*end of read dir*/
+                       if (res == NULL)
+                               break;
+
+                       bHasColon = false;
+                       if (ent.d_name[0] == '.')
+                               continue;
+
+                       if (ent.d_type == DT_DIR) {
+                               /*ent->d_name is including ':' */
+                               for (i = 0; i < strlen(ent.d_name); i++) {
+                                       if (ent.d_name[i] == ':') {
+                                               bHasColon = true;
+                                               break;
+                                       }
+                               }
+
+                               if (bHasColon) {
+                                       /*check serial */
+                                       err = ms_strappend(path, sizeof(path), "%s%s/cid", mmcpath, ent.d_name);
+                                       if (err < 0) {
+                                               MS_DBG("FAIL : ms_strappend");
+                                               continue;
+                                       }
+
+                                       if (_get_contents(path, cid) != MS_ERR_NONE)
+                                               break;
+                                       else
+                                               getdata = true;
+                                       MS_DBG("MMC serial : %s", cid);
+                               }
+                       }
+               }
+               closedir(dp);
+
+               if (getdata == true) {
+                       break;
+               }
+       }
+       
+       MS_DBG_END();
+
+       return MS_ERR_NONE;
+}
+
+int ms_update_mmc_info(void)
+{
+       int err;
+       char cid[MMC_INFO_SIZE] = { 0 };
+
+       err = _ms_get_mmc_info(cid);
+
+       err = _ms_update_mmc_info(cid);
+
+       /*Active flush */
+       if (malloc_trim(0))
+               MS_DBG("SUCCESS malloc_trim");
+
+       return err;
+}
+
+void ms_mmc_removed_handler(void)
+{
+       ms_scan_data_t *mmc_scan_data;
+
+       mmc_scan_data = malloc(sizeof(ms_scan_data_t));
+
+       mmc_scan_data->scan_type = MS_SCAN_VALID;
+       mmc_scan_data->db_type = MS_MMC;
+
+       g_async_queue_push(scan_queue, GINT_TO_POINTER(mmc_scan_data));
+
+       /*remove added watch descriptors */
+       ms_inoti_remove_watch_recursive(MS_MMC_ROOT_PATH);
+
+       ms_inoti_delete_mmc_ignore_file();
+
+       if (drm_svc_extract_ext_memory() == DRM_RESULT_SUCCESS)
+               MS_DBG("drm_svc_extract_ext_memory OK");
+}
+
+void ms_mmc_vconf_cb(void *data)
+{
+       MS_DBG_START();
+
+       int status = 0;
+       ms_scan_data_t *scan_data;
+
+       MS_DBG("Received MMC noti from vconf : %d", status);
+
+       if (!ms_config_get_int(VCONFKEY_SYSMAN_MMC_STATUS, &status)) {
+               MS_DBG("........Get VCONFKEY_SYSMAN_MMC_STATUS failed........");
+       }
+
+       MS_DBG("ms_config_get_int : VCONFKEY_SYSMAN_MMC_STATUS END = %d",
+              status);
+
+       mmc_state = status;
+
+       if (current_usb_mode != VCONFKEY_USB_STORAGE_STATUS_OFF)
+               return;
+
+       if (mmc_state == VCONFKEY_SYSMAN_MMC_REMOVED ||
+               mmc_state == VCONFKEY_SYSMAN_MMC_INSERTED_NOT_MOUNTED) {
+               ms_mmc_removed_handler();
+       } 
+       else if (mmc_state == VCONFKEY_SYSMAN_MMC_MOUNTED) {
+               scan_data = malloc(sizeof(ms_scan_data_t));
+#ifdef _WITH_DRM_SERVICE_
+               if (drm_svc_insert_ext_memory() == DRM_RESULT_SUCCESS)
+                       MS_DBG("drm_svc_insert_ext_memory OK");
+#endif
+               fex_make_default_path_mmc();
+
+               scan_data->scan_type = ms_get_mmc_state();
+               scan_data->db_type = MS_MMC;
+
+               MS_DBG("ms_get_mmc_state is %d", scan_data->scan_type);
+
+               g_async_queue_push(scan_queue, GINT_TO_POINTER(scan_data));
+       }
+       
+       MS_DBG_END();
+       
+       return;
+}
+
+#ifdef FMS_PERF
+
+void ms_check_start_time(struct timeval *start_time)
+{
+       gettimeofday(start_time, NULL);
+}
+
+void ms_check_end_time(struct timeval *end_time)
+{
+       gettimeofday(end_time, NULL);
+}
+
+void ms_check_time_diff(struct timeval *start_time, struct timeval *end_time)
+{
+       struct timeval time;
+       long difftime;
+
+       time.tv_sec = end_time->tv_sec - start_time->tv_sec;
+       time.tv_usec = end_time->tv_usec - start_time->tv_usec;
+       difftime = MILLION * time.tv_sec + time.tv_usec;
+       MS_DBG("The function_to_time took %ld microseconds or %f seconds.",
+              difftime, difftime / (double)MILLION);
+}
+
+#endif
+
+void ms_usb_vconf_cb(void *data)
+{
+       MS_DBG_START();
+
+       int status = 0;
+
+       MS_DBG("Received usb noti from vconf : %d", status);
+
+       if (!ms_config_get_int(VCONFKEY_USB_STORAGE_STATUS, &status)) {
+               MS_DBG
+                   ("........Get VCONFKEY_USB_STORAGE_STATUS failed........");
+       }
+
+       MS_DBG("ms_config_get_int : VCONFKEY_USB_STORAGE_STATUS END = %d",
+              status);
+       current_usb_mode = status;
+
+       if (current_usb_mode == VCONFKEY_USB_STORAGE_STATUS_OFF) {
+               if (ums_mode != VCONFKEY_USB_STORAGE_STATUS_OFF) {
+                       ms_scan_data_t *int_scan;
+
+                       fex_make_default_path();
+
+                       int_scan = malloc(sizeof(ms_scan_data_t));
+
+                       int_scan->db_type = MS_PHONE;
+                       int_scan->scan_type = MS_SCAN_PART;
+
+                       /*push data to fex_dir_scan_cb */
+                       g_async_queue_push(scan_queue, GINT_TO_POINTER(int_scan));
+
+                       if (ms_is_mmc_supported()) {
+                               ms_scan_data_t *ext_scan;
+
+                               /*prepare to insert drm data and delete previous drm datas */
+                               if (drm_svc_insert_ext_memory() ==
+                                   DRM_RESULT_SUCCESS)
+                                       MS_DBG("drm_svc_insert_ext_memory OK");
+
+                               ext_scan = malloc(sizeof(ms_scan_data_t));
+                               mmc_state = VCONFKEY_SYSMAN_MMC_MOUNTED;
+
+                               ext_scan->db_type = MS_MMC;
+                               ext_scan->scan_type = MS_SCAN_PART;
+
+                               /*push data to fex_dir_scan_cb */
+                               g_async_queue_push(scan_queue, GINT_TO_POINTER(ext_scan));
+                       }
+               }
+               ums_mode = VCONFKEY_USB_STORAGE_STATUS_OFF;
+               ms_config_set_int(MS_USB_MODE_KEY, MS_VCONFKEY_NORMAL_MODE);
+       } 
+       else {
+               if (ums_mode == VCONFKEY_USB_STORAGE_STATUS_OFF) {
+                       MS_DBG("VCONFKEY_USB_STORAGE_STATUS : %d", current_usb_mode);
+                       ms_scan_data_t *int_scan;
+
+                       ums_mode = current_usb_mode;
+
+                       int_scan = malloc(sizeof(ms_scan_data_t));                      
+                       int_scan->scan_type = MS_SCAN_VALID;
+                       int_scan->db_type = MS_PHONE;
+
+                       g_async_queue_push(scan_queue, GINT_TO_POINTER(int_scan));
+
+                       ms_inoti_remove_watch_recursive(MS_PHONE_ROOT_PATH);
+
+                       if (ums_mode == VCONFKEY_USB_STORAGE_STATUS_UMS_MMC_ON) {
+
+                               ms_scan_data_t *ext_scan;
+
+                               ext_scan = malloc(sizeof(ms_scan_data_t));
+                               ext_scan->scan_type = MS_SCAN_VALID;
+                               ext_scan->db_type = MS_MMC;
+
+                               g_async_queue_push(scan_queue, GINT_TO_POINTER(ext_scan));
+                               
+                               ms_inoti_remove_watch_recursive(MS_MMC_ROOT_PATH);
+
+                               /*notify to drm-server */
+                               if (drm_svc_extract_ext_memory() == DRM_RESULT_SUCCESS)
+                                       MS_DBG("drm_svc_extract_ext_memory OK");
+                       }
+
+                       /*delete all drm contect from drm server */
+                       if (drm_svc_unregister_all_contents() == DRM_RESULT_SUCCESS)
+                               MS_DBG("drm_svc_unregister_all_contents OK");
+
+                       ms_config_set_int(MS_USB_MODE_KEY, MS_VCONFKEY_MASS_STORAGE_MODE);
+               }
+       }
+
+       MS_DBG_END();
+       return;
+}
+
+bool ms_is_mmc_supported(void)
+{
+       MS_DBG_START();
+
+       /*TODO-Q: simulator support? */
+       if (0)
+               /* if (strcmp(FEXPLORER_MMC_ROOT_PATH, "/mnt/mmc") == 0) //simulator */
+       {
+               return true;
+       } else {
+               int data = -1;
+               ms_config_get_int(VCONFKEY_SYSMAN_MMC_STATUS, &data);
+               MS_DBG("%s is  %d ", VCONFKEY_SYSMAN_MMC_STATUS, data);
+               if (data != VCONFKEY_SYSMAN_MMC_MOUNTED)
+                       return false;
+               else
+                       return true;
+       }
+
+       MS_DBG_END();
+       return false;
+}
+
+ms_dir_scan_type_t ms_get_mmc_state(void)
+{
+       char cid[MMC_INFO_SIZE] = { 0 };
+       ms_dir_scan_type_t ret = MS_SCAN_ALL;
+
+       /*get new info */
+       _ms_get_mmc_info(cid);
+
+       /*check it's same mmc */
+       if (_ms_check_mmc_info(cid)) {
+               MS_DBG("Detected same MMC! but needs to update the changes...");
+               ret = MS_SCAN_PART;
+       }
+
+       return ret;
+}
+
+GAsyncQueue* soc_queue;
+GArray *reg_list;
+GMutex *list_mutex;
+GMutex *queue_mutex;
+
+void _ms_insert_reg_list(const char *path)
+{
+       char *reg_path = strdup(path);
+
+       g_mutex_lock(list_mutex);
+
+       g_array_append_val(reg_list, reg_path);
+
+       g_mutex_unlock(list_mutex);
+}
+
+bool _ms_find_reg_list(const char *path)
+{
+       int i;
+       int len = reg_list->len;
+       char *data;
+       bool ret = false;
+
+       g_mutex_lock(list_mutex);
+       MS_DBG("array length : %d", len);
+
+       for(i = 0; i < len; i++) {
+               data = g_array_index (reg_list, char*, i);
+               if(!strcmp(data, path))
+                       ret = true;
+       }
+
+       g_mutex_unlock(list_mutex);
+
+       return ret;
+}
+
+void _ms_delete_reg_list(const char *path)
+{
+       int i;
+       int len = reg_list->len;
+       char *data;
+
+       MS_DBG("Delete : %s", path);
+       g_mutex_lock(list_mutex);
+
+       for(i = 0; i < len; i++) {
+               data = g_array_index (reg_list, char*, i);
+               MS_DBG("%s", data);
+               if(!strcmp(data, path)) {
+                       MS_DBG("Delete complete : %s", data);
+                       free(data);
+                       g_array_remove_index(reg_list, i);
+                       break;
+               }
+       }
+
+       g_mutex_unlock(list_mutex);
+}
+
+void ms_register_start(void)
+{
+       minfo_add_media_start(MS_REGISTER_COUNT);
+       audio_svc_insert_item_start(MS_REGISTER_COUNT);
+}
+
+void ms_register_end(void)
+{
+       minfo_add_media_end();
+       audio_svc_insert_item_end();
+}
+
+int ms_register_file(const char *path, GAsyncQueue* queue)
+{
+       MS_DBG_START();
+       MS_DBG("[%d]register file : %s", syscall(__NR_gettid), path);
+
+       int err;
+       int category = MS_CATEGORY_UNKNOWN;
+
+       if (path == NULL) {
+               MS_DBG("path == NULL");
+               return MS_ERR_ARG_INVALID;
+       }
+
+       g_mutex_lock(queue_mutex);
+       /*first request for this file*/
+       if(!_ms_find_reg_list(path)) {
+               /*insert registering file list*/
+               _ms_insert_reg_list(path);
+       } else {
+               MS_DBG("______________________ALREADY INSERTING");
+               if(queue != NULL) {
+                       MS_DBG("Need reply");
+                       soc_queue = queue;
+               }
+               g_mutex_unlock(queue_mutex);
+               return MS_ERR_NOW_REGISTER_FILE;
+       }
+       g_mutex_unlock(queue_mutex);
+
+       err = ms_get_category_from_mime(path, &category);
+       if (err != MS_ERR_NONE) {
+               MS_DBG("ms_get_category_from_mime error : %d", err);
+               goto FREE_RESOURCE;
+       }
+
+       if (category <= MS_CATEGORY_ETC) {
+               MS_DBG("This is not media contents");
+               err = MS_ERR_NOT_MEDIA_FILE;
+               goto FREE_RESOURCE;
+       } else {
+#ifdef THUMB_THREAD
+                       err = ms_media_db_insert_with_thumb(path, category);
+#else
+                       err = ms_media_db_insert(path, category, false);
+#endif 
+               if (err != MS_ERR_NONE) {
+                       MS_DBG("ms_media_db_insert error : %d", err);
+
+                       /*if music, call mp_svc_set_item_valid() */
+                       if (category & MS_CATEGORY_MUSIC || category & MS_CATEGORY_SOUND) {
+                               /*check exist in Music DB, If file is not exist, insert data in DB. */
+                               err = audio_svc_check_item_exist(path);
+                               if (err == AUDIO_SVC_ERROR_NONE) {
+                                       MS_DBG("Audio Item exist");
+                                       err = MS_ERR_NONE;
+                               }
+                       } else if (category & MS_CATEGORY_VIDEO || category & MS_CATEGORY_IMAGE) {
+                               Mitem *mi = NULL;
+
+                               /*get an item based on its url. */
+                               err = minfo_get_item(path, &mi);
+                               if (err == MB_SVC_ERROR_NONE) {
+                                       MS_DBG("Visual Item exist");
+                                       err = MS_ERR_NONE;
+                               }
+
+                               minfo_destroy_mtype_item(mi);
+                       }
+               }
+
+               if (category & MS_CATEGORY_DRM) {
+                       MS_DBG("THIS IS DRM FILE");
+                       DRM_RESULT res;
+
+                       ms_inoti_add_ignore_file(path);
+                       res = drm_svc_register_file(path);
+                       if (res != DRM_RESULT_SUCCESS) {
+                               MS_DBG("drm_svc_register_file error : %d", res);
+                               err = MS_ERR_DRM_REGISTER_FAIL;
+                       }
+               }
+       }
+
+FREE_RESOURCE:
+       g_mutex_lock(queue_mutex);
+       
+       _ms_delete_reg_list(path);
+
+       if (soc_queue != NULL) {
+               MS_DBG("%d", err);
+               g_async_queue_push(soc_queue, GINT_TO_POINTER(err+MS_ERR_MAX));
+               MS_DBG("Return OK");
+       }
+       soc_queue = NULL;
+       g_mutex_unlock(queue_mutex);
+       MS_DBG_END();
+       return err;
+}
+
+int ms_register_scanfile(const char *path)
+{
+       MS_DBG_START();
+       MS_DBG("register scanfile : %s", path);
+
+       int err = MS_ERR_NONE;
+       bool res = false;
+       int category = MS_CATEGORY_UNKNOWN;
+
+       if (path == NULL) {
+               MS_DBG("path == NULL");
+               return MS_ERR_ARG_INVALID;
+       }
+
+       err = ms_get_category_from_mime(path, &category);
+       if (err != MS_ERR_NONE) {
+               MS_DBG("ms_get_category_from_mime error : %d", err);
+               return err;
+       }
+
+       if (category <= MS_CATEGORY_ETC) {
+               MS_DBG("This is not media contents");
+               return MS_ERR_NOT_MEDIA_FILE;
+       }
+
+       err = ms_media_db_insert(path, category, true);
+       if (err != MS_ERR_NONE) {
+               MS_DBG("ms_media_db_insert error : %d", err);
+       }
+
+       if (category & MS_CATEGORY_DRM) {
+               MS_DBG("THIS IS DRM FILE");
+               DRM_RESULT res;
+
+               ms_inoti_add_ignore_file(path);
+
+               res = drm_svc_register_file(path);
+               if (res != DRM_RESULT_SUCCESS) {
+                       MS_DBG("drm_svc_register_file error : %d", err);
+                       err = MS_ERR_DRM_REGISTER_FAIL;
+               }
+       }
+
+       MS_DBG_END();
+       return err;
+}
+
+
+int ms_start(bool need_db_create)
+{
+       int err = 0;
+
+       err = vconf_notify_key_changed(VCONFKEY_SYSMAN_MMC_STATUS,
+                                    (vconf_callback_fn) ms_mmc_vconf_cb, NULL);
+       if (err == -1)
+               MS_DBG("add call back function for event %s fails",
+                      VCONFKEY_SYSMAN_MMC_STATUS);
+
+       err = vconf_notify_key_changed(VCONFKEY_USB_STORAGE_STATUS,
+                                    (vconf_callback_fn) ms_usb_vconf_cb, NULL);
+       if (err == -1)
+               MS_DBG("add call back function for event %s fails",
+                      VCONFKEY_USB_STORAGE_STATUS);
+
+       ms_db_init(need_db_create);
+
+       malloc_trim(0);
+
+       return err;
+}
+
+void ms_end(void)
+{
+       /***********
+       **remove call back functions
+       ************/
+       vconf_ignore_key_changed(VCONFKEY_SYSMAN_MMC_STATUS,
+                                (vconf_callback_fn) ms_mmc_vconf_cb);
+       vconf_ignore_key_changed(VCONFKEY_USB_STORAGE_STATUS,
+                                (vconf_callback_fn) ms_usb_vconf_cb);
+
+       /*Clear db mutex variable*/
+       g_mutex_free (db_mutex);
+}
+
+int ms_get_full_path_from_node(ms_dir_scan_info * const node, char *ret_path)
+{
+       int err = 0;
+       ms_dir_scan_info *cur_node;
+       char path[MS_FILE_PATH_LEN_MAX] = { 0 };
+       char tmp_path[MS_FILE_PATH_LEN_MAX] = { 0 };
+
+       cur_node = node;
+       MS_DBG("%s", cur_node->name);
+
+       while (1) {
+               err = ms_strappend(path, sizeof(path), "/%s%s", cur_node->name, tmp_path);
+               if (err < 0) {
+                       MS_DBG("ms_strappend error : %d", err);
+                       return err;
+               }
+
+               strncpy(tmp_path, path, MS_FILE_PATH_LEN_MAX);
+
+               if (cur_node->parent == NULL)
+                       break;
+
+               cur_node = cur_node->parent;
+               memset(path, 0, MS_FILE_PATH_LEN_MAX);
+       }
+
+       strncpy(ret_path, path, MS_FILE_PATH_LEN_MAX);
+
+       return err;
+}
+
+ms_store_type_t ms_get_store_type_by_full(const char *path)
+{
+       if (strncmp(path + 1, MS_PHONE_ROOT_PATH, strlen(MS_PHONE_ROOT_PATH)) == 0) {
+               return MS_PHONE;
+       } else
+           if (strncmp(path + 1, MS_MMC_ROOT_PATH, strlen(MS_MMC_ROOT_PATH)) == 0) {
+               return MS_MMC;
+       } else
+               return MS_ERR_INVALID_FILE_PATH;
+}
+
+int
+ms_strappend(char *res, const int size, const char *pattern,
+            const char *str1, const char *str2)
+{
+       int len = 0;
+       int real_size = size - 1;
+
+       if (!res ||!pattern || !str1 ||!str2 )
+               return MS_ERR_ARG_INVALID;
+
+       if (real_size < (strlen(str1) + strlen(str2)))
+               return MS_ERR_OUT_OF_RANGE;
+
+       len = snprintf(res, real_size, pattern, str1, str2);
+       if (len < 0) {
+               MS_DBG("MS_ERR_ARG_INVALID");
+               return MS_ERR_ARG_INVALID;
+       }
+
+       res[len] = '\0';
+
+       return MS_ERR_NONE;
+}
+
+int
+ms_strcopy(char *res, const int size, const char *pattern, const char *str1)
+{
+       int len = 0;
+       int real_size = size - 1;
+
+       if (!res || !pattern || !str1)
+               return MS_ERR_ARG_INVALID;
+
+       if (real_size < strlen(str1))
+               return MS_ERR_OUT_OF_RANGE;
+
+       len = snprintf(res, real_size, pattern, str1);
+       if (len < 0) {
+               MS_DBG("MS_ERR_ARG_INVALID");
+               return MS_ERR_ARG_INVALID;
+       }
+
+       res[len] = '\0';
+
+       return MS_ERR_NONE;
+}
+
+#ifdef _WITH_SETTING_AND_NOTI_
+bool ms_config_get_int(const char *key, int *value)
+{
+       int err;
+
+       if (!key || !value) {
+               MS_DBG("Arguments key or value is NULL");
+               return false;
+       }
+
+       err = vconf_get_int(key, value);
+       if (err == 0)
+               return true;
+       else if (err == -1)
+               return false;
+       else
+               MS_DBG("Unexpected error code: %d", err);
+
+       return false;
+}
+
+bool ms_config_set_int(const char *key, int value)
+{
+       int err;
+
+       if (!key) {
+               MS_DBG("Arguments key is NULL");
+               return false;
+       }
+
+       err = vconf_set_int(key, value);
+       if (err == 0)
+               return true;
+       else if (err == -1)
+               return false;
+       else
+               MS_DBG("Unexpected error code: %d", err);
+
+       return false;
+}
+
+bool ms_config_get_str(const char *key, char *value)
+{
+       char *res;
+       if (!key || !value) {
+               MS_DBG("Arguments key or value is NULL");
+               return false;
+       }
+
+       res = vconf_get_str(key);
+       if (res) {
+               strncpy(value, res, strlen(res) + 1);
+               return true;
+       }
+
+       return false;
+}
+
+bool ms_config_set_str(const char *key, const char *value)
+{
+       int err;
+
+       if (!key || !value) {
+               MS_DBG("Arguments key or value is NULL");
+               return false;
+       }
+
+       err = vconf_set_str(key, value);
+       if (err == 0)
+               return true;
+       else
+               MS_DBG("fail to vconf_set_str %d", err);
+
+       return false;
+}
+#endif                         /* _WITH_SETTING_AND_NOTI_ */
+
+bool fex_make_default_path(void)
+{
+       int i = 0;
+       int ret = 0;
+       bool create_flag = false;
+       DIR *dp = NULL;
+
+       char default_path[10][256] = {
+               {"/opt/media/Images and videos"},
+               {"/opt/media/Images and videos/Wallpapers"},
+               {"/opt/media/Sounds and music"},
+               {"/opt/media/Sounds and music/Music"},
+               {"/opt/media/Sounds and music/Ringtones"},
+               {"/opt/media/Sounds and music/Alerts"},
+               {"/opt/media/Sounds and music/FM Radio"},
+               {"/opt/media/Sounds and music/Voice recorder"},
+               {"/opt/media/Downloads"},
+               {"/opt/media/Camera shots"}
+       };
+
+       for (i = 0; i < 10; ++i) {
+               dp = opendir(default_path[i]);
+               if (dp == NULL) {
+                       ret = mkdir(default_path[i], 0777);
+                       if (ret < 0) {
+                               MS_DBG("make fail");
+                       } else {
+                               create_flag = true;
+                               ms_inoti_add_watch(default_path[i]);
+                       }
+               } else {
+                       closedir(dp);
+               }
+       }
+
+       return create_flag;
+}
+
+bool fex_make_default_path_mmc(void)
+{
+       MS_DBG_START();
+
+       int i = 0;
+       int ret = 0;
+       bool create_flag = false;
+       DIR *dp = NULL;
+
+       char default_path[10][256] = {
+               {"/opt/storage/sdcard/Images and videos"},
+               {"/opt/storage/sdcard/Images and videos/Wallpapers"},
+               {"/opt/storage/sdcard/Sounds and music"},
+               {"/opt/storage/sdcard/Sounds and music/Music"},
+               {"/opt/storage/sdcard/Sounds and music/Ringtones"},
+               {"/opt/storage/sdcard/Sounds and music/Alerts"},
+               {"/opt/storage/sdcard/Sounds and music/FM Radio"},
+               {"/opt/storage/sdcard/Sounds and music/Voice recorder"},
+               {"/opt/storage/sdcard/Downloads"},
+               {"/opt/storage/sdcard/Camera shots"}
+       };
+
+       for (i = 0; i < 10; ++i) {
+               dp = opendir(default_path[i]);
+               if (dp == NULL) {
+                       ret = mkdir(default_path[i], 0777);
+                       if (ret < 0) {
+                               MS_DBG("make fail");
+                       } else {
+                               create_flag = true;
+                               ms_inoti_add_watch(default_path[i]);
+                       }
+               } else {
+                       closedir(dp);
+               }
+       }
+
+       MS_DBG_END();
+
+       return create_flag;
+}
+
+static int _ms_get_mime_by_drm_info(const char *path, char *mime)
+{
+#ifdef _WITH_DRM_SERVICE_
+       int res = MS_ERR_NONE;
+       drm_content_info_t contentInfo = { 0 };
+
+       if (path == NULL || mime == NULL)
+               return MS_ERR_ARG_INVALID;
+
+       res = drm_svc_get_content_info(path, &contentInfo);
+       if (res != DRM_RESULT_SUCCESS) {
+               MS_DBG("drm_svc_get_content_info() fails. ");
+               return res;
+       }
+
+       strncpy(mime, contentInfo.contentType, MS_DRM_CONTENT_TYPE_LENGTH);
+
+       return res;
+#else
+       return MS_ERR_NONE;
+#endif
+}
+
+int ms_get_category_from_mime(const char *path, int *category)
+{
+       int i = 0;
+       int err = 0;
+       char mimetype[MIME_TYPE_LENGTH];
+
+       if (path == NULL || category == NULL)
+               return MS_ERR_ARG_INVALID;
+
+       *category = MS_CATEGORY_UNKNOWN;
+
+       /*get content type and mime type from file. */
+       /*in case of drm file. */
+       if (drm_svc_is_drm_file(path) == DRM_TRUE) {
+               DRM_FILE_TYPE drm_type = DRM_FILE_TYPE_NONE;
+               drm_type = drm_svc_get_drm_type(path);
+               if (drm_type == DRM_FILE_TYPE_NONE) {
+                       *category = MS_CATEGORY_UNKNOWN;
+                       return err;
+               } 
+               else {
+                       err =  _ms_get_mime_by_drm_info(path, mimetype);
+                       if (err < 0) {
+                               *category = MS_CATEGORY_UNKNOWN;
+                               return err;
+                       }
+                       *category |= MS_CATEGORY_DRM;
+               }
+       } 
+       else {
+               /*in case of normal files */
+               if (aul_get_mime_from_file(path, mimetype, sizeof(mimetype)) < 0) {
+                       MS_DBG("aul_get_mime_from_file fail");
+                       *category = MS_CATEGORY_UNKNOWN;
+                       return MS_ERR_ARG_INVALID;
+               }
+       }
+
+       MS_DBG("mime type : %s", mimetype);
+
+       /*categorize from mimetype */
+       for (i = 0; i < CONTENT_TYPE_NUM; i++) {
+               if (strstr(mimetype, content_category[i].content_type) != NULL) {
+                       *category = (*category | content_category[i].category_by_mime);
+                       break;
+               }
+       }
+
+       /*in application type, exitst sound file ex) x-smafs */
+       if (*category & MS_CATEGORY_ETC) {
+               int prefix_len = strlen(content_category[0].content_type);
+
+               for (i = 0; i < SOUND_MIME_NUM; i++) {
+                       if (strstr(mimetype + prefix_len, sound_mime_table[i]) != NULL) {
+                               *category ^= MS_CATEGORY_ETC;
+                               *category |= MS_CATEGORY_SOUND;
+                               break;
+                       }
+               }
+       }
+
+       /*check music file in soun files. */
+       if (*category & MS_CATEGORY_SOUND) {
+               int prefix_len = strlen(content_category[0].content_type) + 1;
+
+               MS_DBG("mime_type : %s", mimetype + prefix_len);
+
+               for (i = 0; i < MUSIC_MIME_NUM; i++) {
+                       if (strcmp(mimetype + prefix_len, music_mime_table[i]) == 0) {
+                               *category ^= MS_CATEGORY_SOUND;
+                               *category |= MS_CATEGORY_MUSIC;
+                               break;
+                       }
+               }
+       } else if (*category & MS_CATEGORY_VIDEO) {
+               /*some video files don't have video stream. in this case it is categorize as music. */
+               char *ext;
+               /*"3gp" and "mp4" must check video stream and then categorize in directly. */
+               ext = strrchr(path, '.');
+               if (ext != NULL) {
+                       if ((strncasecmp(ext, _3GP_FILE, 4) == 0) || (strncasecmp(ext, _MP4_FILE, 5) == 0)) {
+                               int audio = 0;
+                               int video = 0;
+
+                               err = mm_file_get_stream_info(path, &audio, &video);
+                               if (err == 0) {
+                                       if (audio > 0 && video == 0) {
+                                               *category ^= MS_CATEGORY_VIDEO;
+                                               *category |= MS_CATEGORY_MUSIC;
+                                       }
+                               }
+                       }
+               }
+       }
+
+       MS_DBG("category_from_ext : %d", *category);
+
+       return err;
+}
+
+void ms_check_db_updating(void)
+{
+       int vconf_value = 0;
+
+       /*wait if phone init is not finished. */
+       while (1) {
+               ms_config_get_int(VCONFKEY_FILEMANAGER_DB_STATUS, &vconf_value);
+
+               if (vconf_value != VCONFKEY_FILEMANAGER_DB_UPDATED) {
+                       MS_DBG("iNoti waits till init_phone finishes...");
+                       sleep(2);
+               } else {
+                       return;
+               }
+       }
+}
+
+/****************************************************************************************************
+LIBMEDIA_INFO
+*****************************************************************************************************/
+
+#ifdef _WITH_MP_PB_
+void ms_update_valid_type_start(void)
+{
+       audio_svc_set_item_valid_start(MS_VALID_COUNT);
+       minfo_set_item_valid_start(MS_VALID_COUNT);
+}
+
+void ms_update_valid_type_end(void)
+{
+       audio_svc_set_item_valid_end();
+       minfo_set_item_valid_end();
+}
+
+int ms_change_valid_type(ms_store_type_t store_type, bool validation)
+{
+       MS_DBG_START();
+       int res = MS_ERR_NONE;
+       int err;
+
+       audio_svc_storage_type_e audio_storage;
+       minfo_store_type visual_storage;
+
+       audio_storage = (store_type == MS_PHONE) 
+               ? AUDIO_SVC_STORAGE_PHONE : AUDIO_SVC_STORAGE_MMC;
+       visual_storage = (store_type == MS_PHONE) 
+               ? MINFO_PHONE : MINFO_MMC;
+
+       err = audio_svc_set_db_valid(audio_storage, validation);
+       if (err < AUDIO_SVC_ERROR_NONE) {
+               MS_DBG("audio_svc_set_db_valid error :%d", err);
+               res = MS_ERR_DB_OPERATION_FAIL;
+       }
+
+       err = minfo_set_db_valid(visual_storage, validation);
+       if (err < MB_SVC_ERROR_NONE) {
+               MS_DBG("minfo_set_db_valid : error %d", err);
+               res = MS_ERR_DB_OPERATION_FAIL;
+       }
+
+       MS_DBG_END();
+
+       return res;
+}
+
+#ifdef THUMB_THREAD
+int ms_media_db_insert_with_thumb(const char *path, int category)
+{
+       MS_DBG_START();
+       MS_DBG("%s", path);
+
+       int ret = MS_ERR_NONE;
+       int err;
+       ms_store_type_t store_type;
+       audio_svc_category_type_e audio_category;
+       minfo_file_type visual_category;
+       audio_svc_storage_type_e storage;
+
+       if (category & MS_CATEGORY_VIDEO ||category & MS_CATEGORY_IMAGE) {
+               visual_category = (category & MS_CATEGORY_IMAGE)
+                       ? MINFO_ITEM_IMAGE : MINFO_ITEM_VIDEO;
+               err = minfo_add_media(path, visual_category);
+               if (err < 0) {
+                       MS_DBG(" minfo_add_media error %d", err);
+                       ret = MS_ERR_DB_INSERT_RECORD_FAIL;
+               } else {
+                       char thumb_path[1024];
+
+                       err = thumbnail_request_from_db(path, thumb_path, sizeof(thumb_path));
+                       if (err < 0) {
+                               MS_DBG("thumbnail_request_from_db falied: %d", err);
+                       } else {
+                               MS_DBG("thumbnail_request_from_db success: %s", thumb_path);
+                       }
+               }
+               
+               MS_DBG("IMAGE");
+       } 
+       else if (category & MS_CATEGORY_SOUND || category & MS_CATEGORY_MUSIC) {
+               store_type = ms_get_store_type_by_full(path);
+
+               storage = (store_type == MS_MMC)
+                       ? AUDIO_SVC_STORAGE_MMC : AUDIO_SVC_STORAGE_PHONE;
+               audio_category = (category & MS_CATEGORY_SOUND)
+                       ? AUDIO_SVC_CATEGORY_SOUND : AUDIO_SVC_CATEGORY_MUSIC;
+
+               err = audio_svc_insert_item(storage, path, audio_category);
+               if (err < 0) {
+                       MS_DBG("mp_svc_insert_item fails error %d", err);
+                       ret = MS_ERR_DB_INSERT_RECORD_FAIL;
+               }
+               MS_DBG("SOUND");
+       }
+
+       MS_DBG_END();
+       return ret;
+}
+#endif
+
+int ms_media_db_insert(const char *path, int category, bool bulk)
+{
+       MS_DBG_START();
+       MS_DBG("%s", path);
+
+       int ret = MS_ERR_NONE;
+       int err;
+       ms_store_type_t store_type;
+       audio_svc_category_type_e audio_category;
+       minfo_file_type visual_category;
+       audio_svc_storage_type_e storage;
+
+       if (category & MS_CATEGORY_VIDEO ||category & MS_CATEGORY_IMAGE) {
+               visual_category = (category & MS_CATEGORY_IMAGE)
+                       ? MINFO_ITEM_IMAGE : MINFO_ITEM_VIDEO;
+               if(bulk)
+                       err = minfo_add_media_batch(path, visual_category);
+               else
+                       err = minfo_add_media(path, visual_category);
+               if (err < 0) {
+                       MS_DBG(" minfo_add_media error %d", err);
+                       ret = MS_ERR_DB_INSERT_RECORD_FAIL;
+               } 
+#ifndef THUMB_THREAD           
+               else {
+                       char thumb_path[1024];
+
+                       err = thumbnail_request_from_db(path, thumb_path, sizeof(thumb_path));
+                       if (err < 0) {
+                               MS_DBG("thumbnail_request_from_db falied: %d", err);
+                       } else {
+                               MS_DBG("thumbnail_request_from_db success: %s", thumb_path);
+                       }
+#endif                 
+               }
+
+               MS_DBG("IMAGE");
+       }
+       else if (category & MS_CATEGORY_SOUND || category & MS_CATEGORY_MUSIC) {
+               store_type = ms_get_store_type_by_full(path);
+
+               storage = (store_type == MS_MMC)
+                       ? AUDIO_SVC_STORAGE_MMC : AUDIO_SVC_STORAGE_PHONE;
+               audio_category = (category & MS_CATEGORY_SOUND)
+                       ? AUDIO_SVC_CATEGORY_SOUND : AUDIO_SVC_CATEGORY_MUSIC;
+
+               err = audio_svc_insert_item(storage, path, audio_category);
+               if (err < 0) {
+                       MS_DBG("mp_svc_insert_item fails error %d", err);
+                       ret = MS_ERR_DB_INSERT_RECORD_FAIL;
+               }
+               MS_DBG("SOUND");
+       }
+
+       MS_DBG_END();
+       return ret;
+}
+
+int ms_check_file_exist_in_db(const char *path)
+{
+       int err;
+       int category;
+       Mitem *mi = NULL;
+
+       /*get an item based on its url. */
+       err = minfo_get_item(path, &mi);
+       if (err != MS_ERR_NONE) {
+               err = audio_svc_check_item_exist(path);
+               if (err != MS_ERR_NONE)
+                       category = MS_CATEGORY_UNKNOWN;
+               else
+                       category = MS_CATEGORY_MUSIC;
+       } else {
+               category = MS_CATEGORY_IMAGE;
+       }
+
+       minfo_destroy_mtype_item(mi);
+       MS_DBG("Category : %d", category);
+
+       return category;
+}
+
+int ms_media_db_delete(const char *path)
+{
+       MS_DBG_START();
+       int ret = MS_ERR_NONE;
+       int category;
+       ms_ignore_file_info *ignore_file;
+
+       category = ms_check_file_exist_in_db(path);
+
+       if (category & MS_CATEGORY_VIDEO || category & MS_CATEGORY_IMAGE) {
+               ret = minfo_delete_media(path);
+               if (ret != MS_ERR_NONE) {
+                       MS_DBG("minfo_delete_media error : %d", ret);
+                       return ret;
+               }
+               MS_DBG("VIDEO or IMAGE");
+       } else if (category & MS_CATEGORY_MUSIC || category & MS_CATEGORY_SOUND) {
+               ret = audio_svc_delete_item_by_path(path);
+               if (ret != MS_ERR_NONE) {
+                       MS_DBG("audio_svc_delete_item_by_path error : %d", ret);
+                       return ret;
+               }
+               MS_DBG("MUSIC or SOUND");
+       }
+#ifdef _WITH_DRM_SERVICE_
+       drm_svc_unregister_file(path, false);
+#endif
+
+       ignore_file = ms_inoti_find_ignore_file(path);
+       if (ignore_file != NULL)
+               ms_inoti_delete_ignore_file(ignore_file);
+
+       MS_DBG_END();
+
+       return ret;
+}
+
+void ms_media_db_move_start(void)
+{
+       audio_svc_move_item_start(MS_MOVE_COUNT);
+}
+
+void ms_media_db_move_end(void)
+{
+       audio_svc_move_item_end();
+}
+
+int
+ms_media_db_move(ms_store_type_t src_store, ms_store_type_t dst_store,
+                const char *src_path, const char *dst_path)
+{
+       MS_DBG_START();
+
+       int category = MS_CATEGORY_UNKNOWN;
+       minfo_file_type visual_category;
+       audio_svc_storage_type_e dst_storage;
+       audio_svc_storage_type_e src_storage;
+       int ret = 0;
+
+       ret = ms_get_category_from_mime(dst_path, &category);
+       if (ret != MS_ERR_NONE) {
+               MS_DBG("ms_get_category_from_mime error %d", ret);
+               return ret;
+       }
+
+       MS_DBG("category = %d", category);
+
+       if (category & MS_CATEGORY_IMAGE || category & MS_CATEGORY_VIDEO) {
+               visual_category = (category & MS_CATEGORY_IMAGE) ? MINFO_ITEM_IMAGE : MINFO_ITEM_VIDEO;
+               ret = minfo_move_media(src_path, dst_path, visual_category);
+               if (ret != MB_SVC_ERROR_NONE) {
+                       MS_DBG("minfo_move_media error : %d", ret);
+                       return ret;
+               }
+               MS_DBG("VISUAL");
+       } else if (category & MS_CATEGORY_MUSIC || category & MS_CATEGORY_SOUND) {
+               src_storage = (src_store == MS_MMC) ? AUDIO_SVC_STORAGE_MMC : AUDIO_SVC_STORAGE_PHONE;
+               dst_storage = (dst_store == MS_MMC) ? AUDIO_SVC_STORAGE_MMC : AUDIO_SVC_STORAGE_PHONE;
+
+               ret = audio_svc_move_item(src_storage, src_path, dst_storage, dst_path);
+               if (ret < 0) {
+                       MS_DBG("mp_svc_move_item error : %d", ret);
+                       if (ret == AUDIO_SVC_ERROR_DB_NO_RECORD) {
+                               MS_DBG(" This is a new file, Add DB");
+                               /*if source file does not exist in DB, it is new file. */
+
+                               ret = ms_register_file(dst_path, NULL);
+
+                               if (ret != MS_ERR_NONE) {
+                                       MS_DBG("ms_register_file error : %d", ret);
+                                       return MS_ERR_DB_INSERT_RECORD_FAIL;
+                               }
+                       }
+
+                       return ret;
+               }
+               MS_DBG("AUDIO");
+       }
+
+       MS_DBG_END();
+
+       return ret;
+}
+
+bool ms_delete_all_record(ms_store_type_t store_type)
+{
+       MS_DBG_START();
+       int err = 0;
+       minfo_store_type visual_storage;
+       audio_svc_storage_type_e audio_storage;
+
+       visual_storage = (store_type == MS_PHONE) ? MINFO_PHONE : MINFO_MMC;
+       audio_storage = (store_type == MS_PHONE) ? AUDIO_SVC_STORAGE_PHONE : AUDIO_SVC_STORAGE_MMC;
+
+       /* To reset media db when differnet mmc is inserted. */
+       err = audio_svc_delete_all(audio_storage);
+       if (err != AUDIO_SVC_ERROR_NONE) {
+               MS_DBG("audio_svc_delete_all error : %d\n", err);
+#if 0 /*except temporary*/
+               return false;
+#endif
+       }
+
+       err = minfo_delete_invalid_media_records(visual_storage);
+       if (err != MB_SVC_ERROR_NONE) {
+               MS_DBG("minfo_delete_invalid_media_records error : %d\n", err);
+               return false;
+       }
+
+       MS_DBG_END();
+
+       return true;
+}
+#endif/*_WITH_MP_PB_*/
+
+#ifdef PROGRESS
+void ms_create_quickpanel(struct quickpanel *ms_quickpanel)
+{
+       MS_DBG_START();
+       int type_id;
+       int ret;
+
+       struct quickpanel_type *qp_type;
+
+       ret = quickpanel_get_type_id(NULL,
+                                  "/opt/apps/com.samsung.myfile/res/icons/default/small/com.samsung.myfile.png",
+                                  0);
+       MS_DBG("return value of quickpanel_get_type_id : %d", ret);
+
+       ms_quickpanel->type = ret;
+       ms_quickpanel->priv_id = getpid();
+       ms_quickpanel->group_id = 0;
+       ms_quickpanel->title = "Media scanning";
+       ms_quickpanel->content = NULL;
+       ms_quickpanel->progress = 0;
+       ms_quickpanel->args = NULL;
+       ms_quickpanel->args_group = NULL;
+       ms_quickpanel->evt = QP_E_ONGOING;
+
+       ret = quickpanel_insert(ms_quickpanel);
+       MS_DBG("return value of quickpanel_insert : %d", ret);
+
+       MS_DBG_END();
+}
+
+void ms_update_progress(struct quickpanel *ms_quickpanel, double progress)
+{
+       MS_DBG_START();
+
+       MS_DBG("%lf", progress)
+           quickpanel_update_progress(ms_quickpanel->type,
+                                      ms_quickpanel->priv_id, progress);
+
+       MS_DBG_END();
+}
+
+void ms_delete_quickpanel(struct quickpanel *ms_quickpanel)
+{
+       MS_DBG_START();
+       int ret = 0;
+
+       ret = quickpanel_delete(ms_quickpanel->type, ms_quickpanel->priv_id);
+       MS_DBG("return value of quickpanel_delete : %d", ret);
+
+       MS_DBG_END();
+}
+#endif /*PROGRESS*/
+
diff --git a/common/media-server-hibernation.c b/common/media-server-hibernation.c
new file mode 100755 (executable)
index 0000000..8efe944
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ *  Media Server
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-server-hibernation.c
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief              This file defines api utilities of contents manager engines.
+ */
+#ifdef _USE_HIB
+
+#include <vconf.h>
+#include <heynoti.h>
+
+#include "media-server-common.h"
+#include "media-server-hibernation.h"
+#include "media-server-inotify.h"
+#include "media-server-scan.h"
+extern int hib_fd;
+extern GAsyncQueue *scan_queue;
+extern GMutex *db_mutex;
+
+void _hibernation_leave_callback(void *data)
+{
+       GThread *inoti_tid;
+       GThread *scan_tid;
+       GMainLoop *mainloop = NULL;
+
+       MS_DBG("hibernation leave callback\n");
+       MS_DBG("MEDIA SERVER START[HIB]");
+
+       if (!g_thread_supported()) {
+               g_thread_init(NULL);
+       }
+
+       if (!scan_queue)
+               scan_queue = g_async_queue_new();
+
+       /*Init db mutex variable*/
+       if (!db_mutex)
+               db_mutex = g_mutex_new();
+
+       ms_inoti_init();
+
+       inoti_tid = g_thread_create((GThreadFunc) ms_inoti_thread, NULL, FALSE, NULL);
+       scan_tid = g_thread_create((GThreadFunc) ms_scan_thread, NULL, TRUE, NULL);
+#ifdef THUMB_THREAD
+       /*create making thumbnail thread*/
+       thumb_tid = g_thread_create((GThreadFunc) ms_thumb_thread, NULL, TRUE, NULL);
+#endif
+       mainloop = g_main_loop_new(NULL, FALSE);
+
+       ms_start();
+
+       MS_DBG("*****************************************");
+       MS_DBG("*** Server of File Manager is running ***");
+       MS_DBG("*****************************************");
+
+       g_main_loop_run(mainloop);
+
+       /*free all associated memory */
+       g_main_loop_unref(mainloop);
+
+       if (scan_queue)
+               g_async_queue_unref(scan_queue);
+
+       ms_end();
+       exit(0);
+}
+
+void _hibernation_enter_callback(void *data)
+{
+
+       MS_DBG("[fm-server] hibernation enter callback\n");
+
+       /* IMPORTANT : this is for kill inotify thread 
+        * it is essential for hibernation */
+       ms_scan_data_t *scan_data;
+
+       scan_data = malloc(sizeof(ms_scan_data_t));
+       scan_data->scan_type = end_thread;
+
+       g_async_queue_push(scan_queue, GINT_TO_POINTER(scan_data));
+
+       mkdir("/opt/media/_HIBERNATION_END", 0777);
+       rmdir("/opt/media/_HIBERNATION_END");
+
+       if (scan_queue)
+               g_async_queue_unref(scan_queue);
+
+       ms_end();
+
+       if (hib_fd != 0)
+               heynoti_close(hib_fd);
+}
+
+int _hibernation_initialize(void)
+{
+       hib_fd = heynoti_init();
+       heynoti_subscribe(hib_fd, "HIBERNATION_ENTER",
+                         _hibernation_enter_callback, (void *)hib_fd);
+       heynoti_subscribe(hib_fd, "HIBERNATION_LEAVE",
+                         _hibernation_leave_callback, (void *)hib_fd);
+       heynoti_attach_handler(hib_fd);
+       return hib_fd;
+}
+
+void _hibernation_fianalize(void)
+{
+       heynoti_close(hib_fd);
+}
+#endif
diff --git a/common/media-server-inotify-internal.c b/common/media-server-inotify-internal.c
new file mode 100755 (executable)
index 0000000..78e2d74
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ *  Media Server
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-server-inotify-internal.c
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief23
+ */
+#include "media-server-global.h"
+#include "media-server-common.h"
+#include "media-server-inotify-internal.h"
+
+int inoti_fd;
+ms_create_file_info *latest_create_file;
+extern ms_dir_data *first_inoti_node;
+
+int _ms_inoti_add_create_file_list(int wd, char *name)
+{
+       ms_create_file_info *new_node;
+
+       new_node = malloc(sizeof(ms_create_file_info));
+       new_node->name = strdup(name);
+       new_node->wd = wd;
+
+       /*first created file */
+       if (latest_create_file == NULL) {
+               latest_create_file = malloc(sizeof(ms_create_file_info));
+               new_node->previous = NULL;
+       } else {
+               latest_create_file->next = new_node;
+               new_node->previous = latest_create_file;
+       }
+       new_node->next = NULL;
+
+       latest_create_file = new_node;
+
+       return MS_ERR_NONE;
+}
+
+int _ms_inoti_delete_create_file_list(ms_create_file_info *node)
+{
+       if (node->previous != NULL)
+               node->previous->next = node->next;
+       if (node->next != NULL)
+               node->next->previous = node->previous;
+
+       if (node == latest_create_file) {
+               latest_create_file = node->previous;
+       }
+
+       free(node->name);
+       free(node);
+
+       return MS_ERR_NONE;
+}
+
+ms_create_file_info *_ms_inoti_find_create_file_list(int wd, char *name)
+{
+       ms_create_file_info *node = NULL;
+       node = latest_create_file;
+
+       while (node != NULL) {
+               if ((node->wd == wd) && (strcmp(node->name, name) == 0)) {
+                       return node;
+               }
+
+               node = node->previous;
+       }
+
+       return NULL;
+}
+
+int _fex_is_default_path(const char *path)
+{
+       int ret = false;
+
+       if ((strcmp(path, "Images and videos") == 0) ||
+           (strcmp(path, "Sounds and music") == 0) ||
+           (strcmp(path, "Downloads") == 0) ||
+           (strcmp(path, "Camera shots") == 0) ||
+           (strcmp(path, "Wallpapers") == 0) ||
+           (strcmp(path, "Music") == 0) ||
+           (strcmp(path, "Ringtones and Alerts") == 0) ||
+           (strcmp(path, "FM Radio") == 0) ||
+           (strcmp(path, "Voice recorder") == 0)) {
+               ret = true;
+       }
+
+       return ret;
+}
+
+bool _ms_inoti_get_full_path(int wd, char *name, char *path, int sizeofpath)
+{
+       int err;
+       ms_dir_data *node = NULL;
+
+       if (name == NULL || path == NULL)
+               return false;
+
+       if (first_inoti_node != NULL) {
+               node = first_inoti_node;
+               while (node->next != NULL) {
+                       if (wd == node->wd) {
+                               MS_DBG("find parent directory: %s", node->name);
+                               break;
+                       }
+                       node = node->next;
+               }
+       } else {
+               MS_DBG("first_node is NULL");
+               return false;
+       }
+
+       err = ms_strappend(path, sizeofpath, "%s/%s", node->name, name);
+       if (err != MS_ERR_NONE) {
+               MS_DBG("ms_strappend error : %d", err);
+               return false;
+       }
+       MS_DBG("full path : %s", path);
+       return true;
+}
diff --git a/common/media-server-inotify.c b/common/media-server-inotify.c
new file mode 100755 (executable)
index 0000000..845cfd6
--- /dev/null
@@ -0,0 +1,707 @@
+/*
+ *  Media Server
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-server-inotify.c
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief
+ */
+#include "media-server-global.h"
+#include "media-server-common.h"
+#include "media-server-inotify-internal.h"
+#include "media-server-inotify.h"
+
+extern int inoti_fd;
+ms_dir_data *first_inoti_node;
+ms_ignore_file_info *latest_ignore_file;
+
+int _ms_inoti_directory_scan_and_register_file(char *dir_path)
+{
+       MS_DBG_START();
+       struct dirent ent;
+       struct dirent *res = NULL;
+       DIR *dp = NULL;
+       char path[MS_FILE_PATH_LEN_MAX] = { 0 };
+       int err;
+
+       if (dir_path == NULL)
+               return MS_ERR_INVALID_DIR_PATH;
+
+       dp = opendir(dir_path);
+       if (dp == NULL) {
+               MS_DBG("Fail to open dir");
+               return MS_ERR_DIR_OPEN_FAIL;
+       }
+
+       ms_inoti_add_watch(dir_path);
+
+       while (!readdir_r(dp, &ent, &res)) {
+               if (res == NULL)
+                       break;
+
+               if (ent.d_name[0] == '.')
+                       continue;
+
+               err = ms_strappend(path, sizeof(path), "%s/%s", dir_path, ent.d_name);
+               if (err != MS_ERR_NONE) {
+                       MS_DBG("ms_strappend error : %d", err);
+                       continue;
+               }
+
+               /*in case of directory */
+               if (ent.d_type == DT_DIR) {
+                       _ms_inoti_directory_scan_and_register_file(path);
+               } else {
+
+                       err = ms_register_file(path, NULL);
+                       if (err != MS_ERR_NONE) {
+                               MS_DBG("ms_register_file error : %d", err);
+                               continue;
+                       }
+               }
+       }
+
+       closedir(dp);
+
+       MS_DBG_END();
+
+       return 0;
+}
+
+int _ms_inoti_scan_renamed_folder(char *org_path, char *chg_path)
+{
+       if (org_path == NULL || chg_path == NULL) {
+               MS_DBG("Parameter is wrong");
+               return MS_ERR_ARG_INVALID;
+       }
+
+       MS_DBG_START();
+
+       int err = -1;
+       struct dirent ent;
+       struct dirent *res = NULL;
+
+       DIR *dp = NULL;
+       char path_from[MS_FILE_PATH_LEN_MAX] = { 0 };
+       char path_to[MS_FILE_PATH_LEN_MAX] = { 0 };
+       ms_store_type_t src_storage = 0;
+       ms_store_type_t des_storage = 0;
+
+       dp = opendir(chg_path);
+       if (dp == NULL) {
+               MS_DBG("Fail to open dir");
+               return MS_ERR_DIR_OPEN_FAIL;
+       } else {
+               MS_DBG("Modify added watch");
+               ms_inoti_modify_watch(org_path, chg_path);
+       }
+
+       while (!readdir_r(dp, &ent, &res)) {
+               if (res == NULL)
+                       break;
+
+               if (ent.d_name[0] == '.')
+                       continue;
+
+               err = ms_strappend(path_from, sizeof(path_from), "%s/%s", org_path, ent.d_name);
+               if (err != MS_ERR_NONE) {
+                       MS_DBG("ms_strappend error : %d", err);
+                       continue;
+               }
+
+               err =  ms_strappend(path_to, sizeof(path_to), "%s/%s", chg_path, ent.d_name);
+               if (err != MS_ERR_NONE) {
+                       MS_DBG("ms_strappend error : %d", err);
+                       continue;
+               }
+
+               /*in case of directory */
+               if (ent.d_type == DT_DIR) {
+                       _ms_inoti_scan_renamed_folder(path_from, path_to);
+               }
+
+               /*in case of file */
+               if (ent.d_type == DT_REG) {
+                       src_storage = ms_get_store_type_by_full(path_from);
+                       des_storage = ms_get_store_type_by_full(path_to);
+
+                       if ((src_storage != MS_ERR_INVALID_FILE_PATH)
+                           && (des_storage != MS_ERR_INVALID_FILE_PATH))
+                               ms_media_db_move(src_storage, des_storage, path_from, path_to);
+                       else {
+                               MS_DBG("ms_get_store_type_by_full error");
+                       }
+               }
+       }
+
+       closedir(dp);
+
+       MS_DBG_END();
+       return 0;
+}
+
+int ms_inoti_add_ignore_file(const char *path)
+{
+       ms_ignore_file_info *new_node;
+
+       new_node = malloc(sizeof(ms_ignore_file_info));
+       new_node->path = strdup(path);
+
+       /*first created file */
+       if (latest_ignore_file == NULL) {
+               latest_ignore_file = malloc(sizeof(ms_ignore_file_info));
+               new_node->previous = NULL;
+       } else {
+               latest_ignore_file->next = new_node;
+               new_node->previous = latest_ignore_file;
+       }
+       new_node->next = NULL;
+
+       latest_ignore_file = new_node;
+
+       return MS_ERR_NONE;
+}
+
+int ms_inoti_delete_ignore_file(ms_ignore_file_info * delete_node)
+{
+       MS_DBG("");
+       if (delete_node->previous != NULL)
+               delete_node->previous->next = delete_node->next;
+       if (delete_node->next != NULL)
+               delete_node->next->previous = delete_node->previous;
+
+       if (delete_node == latest_ignore_file) {
+               latest_ignore_file = delete_node->previous;
+       }
+
+       free(delete_node->path);
+       free(delete_node);
+
+       MS_DBG("");
+
+       return MS_ERR_NONE;
+}
+
+ms_ignore_file_info *ms_inoti_find_ignore_file(const char *path)
+{
+       ms_ignore_file_info *node = NULL;
+       
+       node = latest_ignore_file;
+       while (node != NULL) {
+               if (strcmp(node->path, path) == 0) {
+                       return node;
+               }
+
+               node = node->previous;
+       }
+
+       return NULL;
+}
+
+void ms_inoti_delete_mmc_ignore_file(void)
+{
+       MS_DBG_START();
+       ms_ignore_file_info *prv_node = NULL;
+       ms_ignore_file_info *cur_node = NULL;
+       ms_ignore_file_info *del_node = NULL;
+
+       if (latest_ignore_file != NULL) {
+               cur_node = latest_ignore_file;
+               while (cur_node != NULL) {
+                       if (strstr(cur_node->path, MS_MMC_ROOT_PATH) != NULL) {
+                               if (prv_node != NULL) {
+                                       prv_node->previous = cur_node->previous;
+                               }
+
+                               if (cur_node == latest_ignore_file)
+                                       latest_ignore_file = latest_ignore_file->previous;
+
+                               del_node = cur_node;
+                       } else {
+                               prv_node = cur_node;
+                       }
+
+                       cur_node = cur_node->previous;
+
+                       if (del_node != NULL) {
+                               free(del_node->path);
+                               free(del_node);
+                               del_node = NULL;
+                       }
+               }
+       }
+
+       /*active flush */
+       malloc_trim(0);
+
+       MS_DBG_END();
+}
+
+int ms_inoti_init(void)
+{
+       inoti_fd = inotify_init();
+       if (inoti_fd < 0) {
+               perror("inotify_init");
+               MS_DBG("inotify_init failed");
+               return inoti_fd;
+       }
+
+       return MS_ERR_NONE;
+}
+
+void ms_inoti_add_watch(char *path)
+{
+       MS_DBG("");
+       ms_dir_data *current_dir = NULL;
+       ms_dir_data *prv_node = NULL;
+       ms_dir_data *last_node = NULL;
+
+       /*find same folder */
+       if (first_inoti_node != NULL) {
+               MS_DBG("find same folder");
+               last_node = first_inoti_node;
+               while (last_node != NULL) {
+                       if (strcmp(path, last_node->name) == 0) {
+                               MS_DBG("watch is already added: %s", path);
+                               return;
+                       }
+                       prv_node = last_node;
+                       last_node = last_node->next;
+               }
+       }
+
+       MS_DBG("start add watch");
+
+       /*there is no same path. */
+       current_dir = malloc(sizeof(ms_dir_data));
+       current_dir->name = strdup(path);
+       current_dir->wd = inotify_add_watch(inoti_fd, path,
+                             IN_CLOSE_WRITE | IN_CREATE | IN_DELETE |
+                             IN_MOVED_FROM | IN_MOVED_TO);
+       current_dir->next = NULL;
+
+       if (first_inoti_node == NULL) {
+               first_inoti_node = current_dir;
+       } else {
+               /*if next node of current node is NULL, it is the lastest node. */
+               MS_DBG("last_node : %s", prv_node->name);
+               prv_node->next = current_dir;
+       }
+
+       MS_DBG("add watch : %s", path);
+}
+
+int ms_inoti_add_watch_with_node(ms_dir_scan_info * const node)
+{
+       char full_path[MS_FILE_PATH_LEN_MAX] = { 0 };
+       ms_dir_data *current_dir = NULL;
+       ms_dir_data *last_node = NULL;
+
+       ms_get_full_path_from_node(node, full_path);
+
+       /*find same folder */
+       if (first_inoti_node != NULL) {
+               last_node = first_inoti_node;
+               while (last_node->next != NULL) {
+                       if (strcmp(full_path, last_node->name) == 0) {
+                               MS_DBG("watch is already added: %s", full_path);
+                               return MS_ERR_NONE;
+                       }
+                       last_node = last_node->next;
+               }
+       }
+
+       /*there is no same path. */
+       current_dir = malloc(sizeof(ms_dir_data));
+       current_dir->name = strdup(full_path);
+       current_dir->wd =
+           inotify_add_watch(inoti_fd, full_path,
+                             IN_CLOSE_WRITE | IN_CREATE | IN_DELETE |
+                             IN_MOVED_FROM | IN_MOVED_TO);
+       current_dir->next = NULL;
+       current_dir->db_updated = false;
+
+       if (first_inoti_node == NULL) {
+               first_inoti_node = current_dir;
+       } else {
+               /*if next node of current node is NULL, it is the lastest node. */
+               MS_DBG("last_node : %s", last_node->name);
+               last_node->next = current_dir;
+       }
+       MS_DBG("add watch : %s", full_path);
+
+       return MS_ERR_NONE;
+}
+
+void ms_inoti_remove_watch_recursive(char *path)
+{
+       MS_DBG_START();
+       ms_dir_data *prv_node = NULL;
+       ms_dir_data *cur_node = NULL;
+       ms_dir_data *del_node = NULL;
+
+       if (first_inoti_node != NULL) {
+               cur_node = first_inoti_node;
+               while (cur_node != NULL) {
+                       if (strstr(cur_node->name, path) != NULL) {
+                               if (prv_node != NULL) {
+                                       prv_node->next =
+                                           cur_node->next;
+                               }
+
+                               if (cur_node == first_inoti_node)
+                                       first_inoti_node =
+                                           first_inoti_node->next;
+
+                               del_node = cur_node;
+                       } else {
+                               prv_node = cur_node;
+                       }
+
+                       cur_node = cur_node->next;
+
+                       if (del_node != NULL) {
+                               free(del_node->name);
+                               free(del_node);
+                               del_node = NULL;
+                       }
+               }
+       }
+
+       /*active flush */
+        malloc_trim(0);
+
+       MS_DBG_END();
+}
+
+void ms_inoti_remove_watch(char *path)
+{
+       ms_dir_data *del_node = NULL;
+       ms_dir_data *prv_node = NULL;
+
+       if (strcmp(first_inoti_node->name, path) == 0) {
+               del_node = first_inoti_node;
+               first_inoti_node = first_inoti_node->next;
+       } else {
+               /*find same folder */
+               if (first_inoti_node != NULL) {
+                       del_node = first_inoti_node;
+                       while (del_node != NULL) {
+                               MS_DBG("current node %s", del_node->name);
+                               if (strcmp(path, del_node->name) == 0) {
+                                       MS_DBG("find delete node: %s", del_node->name);
+                                       if (prv_node != NULL) {
+                                               MS_DBG("previous_node : %s", prv_node->name);
+                                               prv_node->next = del_node->next;
+                                       }
+                                       /*free deleted node */
+                                       free(del_node->name);
+                                       free(del_node);
+                                       break;
+                               }
+                               prv_node = del_node;
+                               del_node = del_node->next;
+                       }
+               }
+       }
+
+       /*active flush */
+       malloc_trim(0);
+}
+
+void ms_inoti_modify_watch(char *path_from, char *path_to)
+{
+       ms_dir_data *mod_node;
+
+       if (strcmp(first_inoti_node->name, path_from) == 0) {
+               mod_node = first_inoti_node;
+       } else {
+               /*find same folder */
+               if (first_inoti_node != NULL) {
+                       mod_node = first_inoti_node;
+                       while (mod_node->next != NULL) {
+                               if (strcmp(path_from, mod_node->name) == 0) {
+                                       MS_DBG("find change node: %s",
+                                              mod_node->name);
+                                       break;
+                               }
+                               mod_node = mod_node->next;
+                       }
+               }
+       }
+
+       /*free previous name of node */
+       free(mod_node->name);
+       mod_node->name = NULL;
+
+       /*add new name */
+       mod_node->name = strdup(path_to);
+
+       /*active flush */
+       malloc_trim(0);
+}
+
+
+gboolean ms_inoti_thread(void *data)
+{
+       uint32_t i;
+       int length;
+       int err;
+       int prev_mask = 0;
+       int prev_wd = -1;
+       bool res;
+       char name[MS_FILE_NAME_LEN_MAX + 1] = { 0 };
+       char prev_name[MS_FILE_NAME_LEN_MAX + 1] = { 0 };
+       char buffer[INOTI_BUF_LEN] = { 0 };
+       char path[MS_FILE_PATH_LEN_MAX] = { 0 };
+       struct inotify_event *event;
+
+       MS_DBG("START INOTIFY");
+
+       err = ms_media_db_open();
+       if (err != MS_ERR_NONE) {
+               MS_DBG(" INOTIFY : sqlite3_open: ret = %d", err);
+               return false;
+       }
+
+       while (1) {
+               i = 0;
+               length = read(inoti_fd, buffer, sizeof(buffer) - 1);
+
+               if (length < 0 || length > sizeof(buffer)) {    /*this is error */
+                       MS_DBG("fail read");
+                       perror("read");
+                       continue;
+               }
+
+               while (i < length && i < INOTI_BUF_LEN) {
+                       /*it's possible that ums lets reset phone data... */
+                       event = (struct inotify_event *)&buffer[i];
+
+                       /*stop this threadfor hibernation */
+                       if (strcmp(event->name, "_HIBERNATION_END") == 0) {
+                               /*db close before capture hibernatio image */
+                               err = ms_media_db_close();
+                               if (err != MS_ERR_NONE) {
+                                       MS_DBG("failed ms_media_db_close : ret = (%d)", err);
+                               }
+                               return false;
+                       } else if(strcmp(event->name, "_FILEOPERATION_END") == 0) {
+                               /*file operation is end*/
+                               /* announce db is updated*/
+                               ms_set_db_status(MS_DB_UPDATED);
+                               rmdir("/opt/media/_FILEOPERATION_END");
+                               goto NEXT_INOTI_EVENT;
+                       } else if (event->name[0] == '.') {
+                               /*event of hidden folder is ignored */
+                               MS_DBG("Ignore : First character of event->name includes invalid character");
+                               goto NEXT_INOTI_EVENT;
+                       } else if (event->wd < 1) {
+                               /*this is error */
+                               MS_DBG("invalid wd : %d", event->wd);
+                               goto NEXT_INOTI_EVENT;
+                       }
+
+                       /*start of one event */
+                       if (event->len && (event->len <= MS_FILE_NAME_LEN_MAX)) {
+                               /*Add for fixing prevent defect 2011-02-15 */
+                               err = ms_strcopy(name, sizeof(name), "%s", event->name);
+                               if (err != MS_ERR_NONE) {
+                                       MS_DBG("ms_strcopy error : %d", err);
+                                       goto NEXT_INOTI_EVENT;
+                               }
+
+                               /*get full path of file or directory */
+                               res = _ms_inoti_get_full_path(event->wd, name, path, sizeof(path));
+                               if (res == false) {
+                                       MS_DBG("_ms_inoti_get_full_path error");
+                                       goto NEXT_INOTI_EVENT;
+                               }
+
+                               MS_DBG("INOTIFY[%d : %s]", event->wd, name);
+                               if (event->mask & IN_ISDIR) {
+                                       MS_DBG("DIRECTORY INOTIFY");
+                                       
+                                       if (event->mask & IN_MOVED_FROM) {
+                                               MS_DBG("MOVED_FROM");
+
+                                               prev_mask = event->mask;
+                                               prev_wd = event->wd;
+
+                                               err = ms_strcopy(prev_name, sizeof(prev_name), "%s", event->name);
+                                               if (err != MS_ERR_NONE) {
+                                                       MS_DBG("ms_strcopy fail");
+                                                       goto NEXT_INOTI_EVENT;
+                                               }
+                                       } 
+                                       else if (event->mask & IN_MOVED_TO) {
+                                               MS_DBG("MOVED_TO");
+
+                                               char full_path_from[MS_FILE_PATH_LEN_MAX] = { 0 };
+
+                                               res = _ms_inoti_get_full_path(prev_wd, prev_name, full_path_from, sizeof(full_path_from));
+                                               if (res == false) {
+                                                       MS_DBG("_ms_inoti_get_full_path error");
+                                                       goto NEXT_INOTI_EVENT;
+                                               }
+                                               /*enable bundle commit*/
+                                               ms_media_db_move_start();
+
+                                               /*need update file information under renamed directory */
+                                               _ms_inoti_scan_renamed_folder(full_path_from, path);
+
+                                               /*disable bundle commit*/
+                                               ms_media_db_move_end();
+
+                                               if (_fex_is_default_path(prev_name)) {
+                                                       if (strstr(path, MS_PHONE_ROOT_PATH)) {
+                                                               fex_make_default_path();
+                                                       } else {
+                                                               fex_make_default_path_mmc();
+                                                       }
+                                               }
+                                               prev_mask = prev_wd = 0;        /*reset */
+                                       }
+                                       else if (event->mask & IN_CREATE) {
+                                               MS_DBG("CREATE");
+
+                                               _ms_inoti_directory_scan_and_register_file(path);
+                                               prev_mask = event->mask;
+                                       }
+                                       else if (event->mask & IN_DELETE) {
+                                               MS_DBG("DELETE");
+
+                                               ms_inoti_remove_watch(path);
+
+                                               if (_fex_is_default_path(name)) {
+                                                       if (strstr(path, MS_PHONE_ROOT_PATH)) {
+                                                               fex_make_default_path();
+                                                       } else {
+                                                               fex_make_default_path_mmc();
+                                                       }
+                                               }
+                                       }
+                               }
+                               else {
+                                       MS_DBG("FILE INOTIFY");
+
+                                       if (event->mask & IN_MOVED_FROM) {
+                                               MS_DBG("MOVED_FROM");
+
+                                               err = ms_media_db_delete(path);
+                                               if (err != MS_ERR_NONE) {
+                                                       MS_DBG("ms_media_db_delete fail error : %d", err);
+                                               }
+                                       }
+                                       else if (event->mask & IN_MOVED_TO) {
+                                               MS_DBG("MOVED_TO");
+
+                                               err = ms_register_file(path, NULL);
+                                               if (err != MS_ERR_NONE) {
+                                                       MS_DBG("ms_register_file error : %d", err);
+                                               }
+                                       }
+                                       else if (event->mask & IN_CREATE) {
+                                               MS_DBG("CREATE");
+
+                                               _ms_inoti_add_create_file_list(event->wd, name);
+                                       }
+                                       else if (event->mask & IN_DELETE) {
+                                               MS_DBG("DELETE");
+                                               
+                                               err = ms_media_db_delete(path);
+                                               if (err != MS_ERR_NONE) {
+                                                       MS_DBG("ms_media_db_delete error : %d", err);
+                                               }
+                                       }
+                                       else if (event->mask & IN_CLOSE_WRITE) {
+                                               MS_DBG("CLOSE_WRITE");
+
+                                               ms_create_file_info *node;
+                                               node = _ms_inoti_find_create_file_list (event->wd, name);
+
+                                               if (node != NULL || ((prev_mask & IN_ISDIR) & IN_CREATE)) {
+
+                                                       err = ms_register_file(path, NULL);
+                                                       if (err != MS_ERR_NONE) {
+                                                               MS_DBG("ms_register_file error : %d", err);
+                                                       }
+                                                       if (node != NULL)
+                                                               _ms_inoti_delete_create_file_list(node);
+                                               }
+                                               else {
+                                                       /*in case of replace */
+                                                       MS_DBG("This case is replacement or changing meta data.");
+                                                       ms_ignore_file_info  *ignore_file;
+
+                                                       ignore_file = ms_inoti_find_ignore_file(path);
+                                                       if (ignore_file == NULL) {
+                                                               err = ms_media_db_delete(path);
+                                                               if (err != MS_ERR_NONE) {
+                                                                       MS_DBG("ms_media_db_delete error : %d", err);
+                                                               }
+                                                               /*update = delete + regitster */
+                                                               err = ms_register_file(path, NULL);
+                                                               if (err != MS_ERR_NONE) {
+                                                                       MS_DBG("ms_register_file error : %d", err);
+                                                                       goto NEXT_INOTI_EVENT;
+                                                               }
+                                                       } else {
+                                                               MS_DBG(" Ignore this file");
+                                                       }
+                                               }
+                                               prev_mask = prev_wd = 0;        /*reset */
+                                       }
+                               }
+                       } /*end of one event */
+                       else {
+                               MS_DBG("Event length is zero or over MS_FILE_NAME_LEN_MAX");
+                               if (event->mask & IN_IGNORED) {
+                                       MS_DBG("This case is ignored");
+                               }
+                       }
+ NEXT_INOTI_EVENT:     ;
+                       i += INOTI_EVENT_SIZE + event->len;
+               }
+               /*Active flush */
+               sqlite3_release_memory(-1);
+               malloc_trim(0);
+       }
+
+       ms_inoti_remove_watch(MS_DB_UPDATE_NOTI_PATH);
+
+       ms_inoti_remove_watch_recursive(MS_PHONE_ROOT_PATH);
+       ms_inoti_remove_watch_recursive(MS_MMC_ROOT_PATH);
+
+       close(inoti_fd);
+
+       err = ms_media_db_close();
+       if (err != MS_ERR_NONE) {
+               MS_DBG("ms_media_db_close error : %d", err);
+               return false;
+       }
+       MS_DBG("Disconnect MEDIA DB");
+
+       return false;
+}
diff --git a/common/media-server-main.c b/common/media-server-main.c
new file mode 100755 (executable)
index 0000000..1f15753
--- /dev/null
@@ -0,0 +1,240 @@
+/*
+ *  Media Server
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-server-mainl.c
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief
+ */
+#include <vconf.h>
+
+#include "media-server-common.h"
+#include "media-server-hibernation.h"
+#include "media-server-inotify.h"
+#include "media-server-scan.h"
+#include "media-server-socket.h"
+#ifdef THUMB_THREAD
+#include "media-server-thumb.h"
+#endif
+
+#include <heynoti.h>
+
+#define APP_NAME "media-server"
+
+#ifdef _USE_HIB
+int hib_fd = 0;
+#endif
+extern GAsyncQueue *scan_queue;
+extern GAsyncQueue* ret_queue;
+extern GMutex *db_mutex;
+extern GMutex *list_mutex;
+extern GMutex *queue_mutex;
+extern GArray *reg_list;
+
+bool check_process(pid_t current_pid)
+{
+       MS_DBG_START();
+       DIR *pdir;
+       struct dirent pinfo;
+       struct dirent *result = NULL;
+       bool ret = false;
+       int find_pid = 0;
+
+       pdir = opendir("/proc");
+       if (pdir == NULL) {
+               MS_DBG("err: NO_DIR\n");
+               return 0;
+       }
+
+       while (!readdir_r(pdir, &pinfo, &result)) {
+               if (result == NULL)
+                       break;
+
+               if (pinfo.d_type != 4 || pinfo.d_name[0] == '.'
+                   || pinfo.d_name[0] > 57)
+                       continue;
+
+               FILE *fp;
+               char buff[128];
+               char path[128];
+
+               ms_strcopy(path, sizeof(path), "/proc/%s/status", pinfo.d_name);
+               fp = fopen(path, "rt");
+               if (fp) {
+                       fgets(buff, 128, fp);
+                       fclose(fp);
+
+                       if (strstr(buff, APP_NAME)) {
+                               MS_DBG("pinfo->d_name : %s", pinfo.d_name);
+                               find_pid = atoi(pinfo.d_name);
+                               MS_DBG(" find_pid : %d", find_pid);
+                               MS_DBG(" current_pid : %d", current_pid);
+                               if (find_pid == current_pid)
+                                       ret = true;
+                               else {
+                                       ret = false;
+                                       break;
+                               }
+                       }
+               } else {
+                       MS_DBG("Can't read file [%s]", path);
+               }
+       }
+
+       closedir(pdir);
+
+       MS_DBG_END();
+
+       return ret;
+}
+
+void init_process()
+{
+
+}
+
+static bool _db_clear(void)
+       {
+       int err;
+       int db_status;
+       int usb_status;
+       bool need_db_create = false;
+
+       /*connect to media db, if conneting is failed, db updating is stopped*/
+       ms_media_db_open();
+
+       /*update just valid type*/
+       err = ms_change_valid_type(MS_MMC, false);
+       if (err != MS_ERR_NONE)
+               MS_DBG("ms_change_valid_type fail");
+
+       ms_config_get_int(VCONFKEY_FILEMANAGER_DB_STATUS, &db_status);
+       ms_config_get_int(MS_USB_MODE_KEY, &usb_status);
+
+       MS_DBG("finish_phone_init_data  db = %d", db_status);
+       MS_DBG("finish_phone_init_data usb = %d", usb_status);
+
+       if (db_status == VCONFKEY_FILEMANAGER_DB_UPDATING
+               || usb_status == MS_VCONFKEY_MASS_STORAGE_MODE) {
+
+               need_db_create = true;
+
+               err = ms_change_valid_type(MS_PHONE, false);
+               if (err != MS_ERR_NONE)
+                       MS_DBG("ms_change_valid_type fail");
+       }
+
+       ms_set_db_status(MS_DB_UPDATED);
+
+       /*disconnect form media db*/
+       ms_media_db_close();
+
+       return need_db_create;
+}
+
+int main(int argc, char **argv)
+{
+       GThread *inoti_tid;
+       GThread *scan_tid;
+       GThread *scoket_tid;
+
+       GMainLoop *mainloop = NULL;
+       pid_t current_pid = 0;
+       bool check_result = false;
+       int err;
+       bool need_db_create;
+
+       current_pid = getpid();
+       check_result = check_process(current_pid);
+       if (check_result == false)
+               exit(0);
+
+       if (!g_thread_supported()) {
+               g_thread_init(NULL);
+       }
+
+       /*Init db mutex variable*/
+       if (!db_mutex)
+               db_mutex = g_mutex_new();
+
+       need_db_create = _db_clear();
+       
+#ifdef _USE_HIB
+       _hibernation_initialize();
+#endif
+
+       MS_DBG("MEDIA SERVER START");
+
+       if (!scan_queue)
+               scan_queue = g_async_queue_new();
+       if (!ret_queue)
+               ret_queue = g_async_queue_new();
+
+       /*Init for register file*/
+       if (!list_mutex)
+               list_mutex = g_mutex_new();
+       if (!queue_mutex)
+               queue_mutex = g_mutex_new();
+       if (!reg_list)
+               reg_list = g_array_new(TRUE, TRUE, sizeof(char*));
+
+       ms_inoti_init();
+
+       ms_inoti_add_watch(MS_DB_UPDATE_NOTI_PATH);
+
+       /*inotify setup */
+       inoti_tid = g_thread_create((GThreadFunc) ms_inoti_thread, NULL, FALSE, NULL);
+       scan_tid = g_thread_create((GThreadFunc) ms_scan_thread, NULL, TRUE, NULL);
+       scoket_tid  = g_thread_create((GThreadFunc) ms_socket_thread, NULL, TRUE, NULL);
+
+       mainloop = g_main_loop_new(NULL, FALSE);
+
+       ms_start(need_db_create);
+
+       MS_DBG("*****************************************");
+       MS_DBG("*** Server of File Manager is running ***");
+       MS_DBG("*****************************************");
+
+       g_main_loop_run(mainloop);
+
+       /*free all associated memory */
+       g_main_loop_unref(mainloop);
+
+       if (scan_queue)
+               g_async_queue_unref(scan_queue);
+
+       if (ret_queue)
+               g_async_queue_unref(ret_queue);
+
+       if(reg_list)
+               g_array_free(reg_list, true);
+
+       ms_end();
+
+#ifdef _USE_HIB
+       _hibernation_fianalize();
+#endif
+
+       exit(0);
+}
diff --git a/common/media-server-scan-internal.c b/common/media-server-scan-internal.c
new file mode 100755 (executable)
index 0000000..e3bfcba
--- /dev/null
@@ -0,0 +1,404 @@
+/*
+ *  Media Server
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-server-scan-internal.c
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief
+ */
+
+#include <vconf.h>
+#include <audio-svc-error.h>
+#include <audio-svc.h>
+#include <media-svc.h>
+#include "media-server-common.h"
+#include "media-server-inotify.h"
+#include "media-server-scan-internal.h"
+
+#ifdef PROGRESS
+#include <quickpanel.h>
+#endif
+
+extern int mmc_state;
+extern int current_usb_mode;
+extern ms_dir_data *first_inoti_node;
+
+#ifdef PROGRESS
+#define SIZE_OF_PBARRAY 100
+#endif
+
+int _ms_get_path_from_current_node(int find_folder,
+                                  ms_dir_scan_info **current_root,
+                                  ms_dir_scan_info **real_root, char **path)
+{
+       MS_DBG_START();
+
+       int err = 0;
+       char get_path[FAT_FILEPATH_LEN_MAX + 1] = { 0 };
+
+       if (find_folder == 0) {
+               if ((*current_root)->Rbrother != NULL) {
+                       *current_root = (*current_root)->Rbrother;
+               } else {
+                       while (1) {
+                               if ((*current_root)->parent == *real_root
+                                   || (*current_root)->parent == NULL) {
+                                       *current_root = NULL;
+                                       MS_DBG_END();
+                                       return 0;
+                               } else if ((*current_root)->parent->Rbrother ==
+                                          NULL) {
+                                       *current_root = (*current_root)->parent;
+                               } else {
+                                       *current_root =
+                                           (*current_root)->parent->Rbrother;
+                                       break;
+                               }
+                       }
+               }
+       }
+
+       err = ms_get_full_path_from_node(*current_root, get_path);
+
+       *path = strdup(get_path);
+
+       MS_DBG_END();
+
+       return err;
+}
+
+#ifdef PROGRESS
+void _ms_dir_check(char *start_path, ms_store_type_t db_type, unsigned short *file_count)
+#else
+void _ms_dir_check(char *start_path, ms_store_type_t db_type)
+#endif
+{
+       MS_DBG_START();
+
+       int err = 0;
+       int find_folder = 0;
+       char get_path[MS_FILE_PATH_LEN_MAX] = { 0 };
+       char *path;
+       DIR *dp = NULL;
+       struct dirent entry;
+       struct dirent *result;
+
+       ms_dir_scan_info *root;
+       ms_dir_scan_info *tmp_root = NULL;
+       ms_dir_scan_info *cur_node = NULL; /*current node*/
+       ms_dir_scan_info *prv_node = NULL; /*previous node*/
+       ms_dir_scan_info *next_node = NULL;
+
+       root = malloc(sizeof(ms_dir_scan_info));
+       if (root == NULL) {
+               MS_DBG("malloc fail");
+               return;
+       }
+
+       root->name = strdup(start_path);
+       if (root->name  == NULL) {
+               MS_DBG("strdup fail");
+               free(root);
+               return;
+       }
+
+       root->parent = NULL;
+       root->Rbrother = NULL;
+       root->next = NULL;
+       tmp_root = root;
+       prv_node = root;
+
+       err = ms_get_full_path_from_node(tmp_root, get_path);
+       MS_DBG("full_path : %s", get_path);
+
+       path = strdup(get_path);
+       if (path == NULL) {
+               MS_DBG("strdup fail");
+               free(root);
+               return;
+       }
+
+       ms_inoti_add_watch_with_node(root);
+
+       while (1) {
+               dp = opendir(path);
+               if (dp == NULL) {
+                       MS_DBG("%s folder opendir fails", path);
+                       goto NEXT_DIR;
+               }
+
+               while (!readdir_r(dp, &entry, &result)) {
+                       if (result == NULL)
+                               break;
+
+                       if (entry.d_name[0] == '.')
+                               continue;
+
+                       /*check usb in out*/
+                       if (current_usb_mode != VCONFKEY_USB_STORAGE_STATUS_OFF
+                           ||(( mmc_state != VCONFKEY_SYSMAN_MMC_MOUNTED) && (db_type == MS_MMC))) {
+
+                               goto FREE_RESOURCES;
+                       }
+
+                       if (entry.d_type & DT_DIR) {
+                               DIR *tmp_dp = NULL;
+                               err = ms_strappend(get_path, sizeof(get_path), "%s/%s",path, entry.d_name);
+                               if (err != MS_ERR_NONE) {
+                                       MS_DBG("ms_strappend error");
+                                       continue;
+                               }
+
+                               tmp_dp = opendir(get_path);
+                               if (tmp_dp == NULL) {
+                                       MS_DBG("%s folder opendir fails", get_path);
+                                       continue;
+                               }
+                               else
+                                       closedir(tmp_dp);
+                               
+                               cur_node = malloc(sizeof(ms_dir_scan_info));
+                               if (cur_node == NULL) {
+                                       MS_DBG("malloc fail");
+
+                                       goto FREE_RESOURCES;
+                               }
+
+                               cur_node->name = strdup(entry.d_name);
+                               cur_node->Rbrother = NULL;
+                               cur_node->next = NULL;
+
+                               /*1. 1st folder */
+                               if (find_folder == 0) {
+                                       cur_node->parent = tmp_root;
+                                       tmp_root = cur_node;
+                               } else {
+                                       cur_node->parent = tmp_root->parent;
+                                       prv_node->Rbrother = cur_node;
+                               }
+                               prv_node->next = cur_node;
+
+                               /*add watch */
+                               ms_inoti_add_watch_with_node(cur_node);
+
+                               /*change previous */
+                               prv_node = cur_node;
+                               find_folder++;
+                       }
+#ifdef PROGRESS
+                       else if (entry.d_type & DT_REG) {
+                               (*file_count)++;
+                       }
+#endif
+               }
+NEXT_DIR:
+               if (dp) closedir(dp);
+               if (path) free(path);
+               dp = NULL;
+               path = NULL;
+
+               err = _ms_get_path_from_current_node(find_folder, &tmp_root, &root, &path);
+               if (err < 0)
+                       break;
+
+               if (tmp_root == NULL)
+                       break;
+
+               find_folder = 0;
+       }
+
+FREE_RESOURCES:
+       /*free allocated memory */
+       if (path) free(path);
+       if (dp) closedir(dp);
+
+       cur_node = root;
+       while (cur_node != NULL) {
+               next_node = cur_node->next;
+               free(cur_node->name);
+               free(cur_node);
+               cur_node = next_node;
+       }
+
+       MS_DBG_END();
+}
+
+#ifdef PROGRESS
+void _ms_dir_scan(ms_scan_data_t * scan_data, struct quickpanel *ms_quickpanel)
+#else
+void _ms_dir_scan(ms_scan_data_t * scan_data)
+#endif
+{
+       MS_DBG_START();
+       int err = 0;
+       char path[MS_FILE_PATH_LEN_MAX] = { 0 };
+       ms_dir_data *node;
+       DIR *dp = NULL;
+#ifdef PROGRESS
+       int i;
+       unsigned short file_count = 0;
+       unsigned short update_count = 0;
+       unsigned short proress_array[SIZE_OF_PBARRAY] = { 0 };
+#endif
+
+       if (scan_data->db_type == MS_PHONE)
+               err = ms_strcopy(path, sizeof(path), "%s", MS_PHONE_ROOT_PATH);
+       else
+               err =  ms_strcopy(path, sizeof(path), "%s", MS_MMC_ROOT_PATH);
+
+       if (err < MS_ERR_NONE) {
+               MS_DBG("fail ms_strcopy");
+       }
+
+#ifdef PROGRESS
+       /*Add inotify watch */
+       _ms_dir_check(path, scan_data->db_type,&file_count);
+#else
+       /*Add inotify watch */
+       _ms_dir_check(path, scan_data->db_type);
+#endif
+
+#ifdef PROGRESS
+       for (i = 0; i < SIZE_OF_PBARRAY; i++) {
+               proress_array[i] = ((i + 1) * file_count) / SIZE_OF_PBARRAY;
+               if (proress_array[i] == 0)
+                       proress_array[i] = 1;
+       }
+       i = 0;
+#endif
+
+       /*if scan type is not MS_SCAN_NONE, check data in db. */
+       if (scan_data->scan_type == MS_SCAN_ALL
+           || scan_data->scan_type == MS_SCAN_PART) {
+               struct dirent entry;
+               struct dirent *result = NULL;
+
+               node = first_inoti_node;
+#ifdef PROGRESS
+               int progress = 0;
+               int pre_progress = 0;
+#endif
+               if (scan_data->scan_type == MS_SCAN_PART) {
+                       /*enable bundle commit*/
+                       ms_update_valid_type_start();
+               }
+
+               while (node != NULL) {
+                       /*check usb in out */
+                       if (current_usb_mode != VCONFKEY_USB_STORAGE_STATUS_OFF
+                           || ((mmc_state != VCONFKEY_SYSMAN_MMC_MOUNTED) && (scan_data->db_type == MS_MMC))) {
+                               MS_DBG("Directory scanning is stopped");
+                               goto STOP_SCAN;
+                       }
+                       if (node->db_updated != true) {
+                               dp = opendir(node->name);
+                               if (dp != NULL) {
+                                       while (!readdir_r(dp, &entry, &result)) {
+                                               if (result == NULL)
+                                                       break;
+
+                                               if (entry.d_name[0] == '.')
+                                                       continue;
+
+                                               /*check usb in out */
+                                               if (current_usb_mode != VCONFKEY_USB_STORAGE_STATUS_OFF
+                                                   || ((mmc_state != VCONFKEY_SYSMAN_MMC_MOUNTED) && (scan_data->db_type == MS_MMC))) {
+                                                       MS_DBG("Directory scanning is stopped");
+                                                       goto STOP_SCAN;
+                                               }
+
+                                               if (entry.d_type & DT_REG) {
+                                                       MS_DBG("THIS IS FEX_DIR_SCAN_CB");
+#ifdef PROGRESS
+                                                       /*update progress bar */
+                                                       update_count++;
+                                                       if (ms_quickpanel != NULL) {
+                                                               if (proress_array[i] == update_count) {
+                                                                       while(1) {
+                                                                               ms_update_progress(ms_quickpanel, ((double)i) / 100);
+                                                                               i++;
+                                                                               if (proress_array[i] != update_count)
+                                                                                       break;
+                                                                       }
+                                                               }
+                                                       }
+#endif/*PROGRESS*/
+                                                       err = ms_strappend(path, sizeof(path), "%s/%s", node->name, entry.d_name);
+                                                       if (err < 0) {
+                                                               MS_DBG("FAIL : ms_strappend");
+                                                               continue;
+                                                       }
+
+                                                       if (scan_data->scan_type == MS_SCAN_PART)       
+                                                               err = ms_update_valid_type(path);
+                                                       else
+                                                               err = ms_register_scanfile(path);
+
+                                                       if (err < 0) {
+                                                               MS_DBG("failed to update db : %d , %d\n", err, scan_data->scan_type);
+                                                               continue;
+                                                       }
+                                               }
+                                       }
+                               } else {
+                                       MS_DBG("%s folder opendir fails", node->name);
+                               }
+                               if (dp) closedir(dp);
+                               dp = NULL;
+
+                               if (node == NULL) {
+                                       MS_DBG("");
+                                       MS_DBG("DB updating is done");
+                                       MS_DBG("");
+                                       break;
+                               }
+                               node->db_updated = true;
+                       }
+                       node = node->next;
+               }               /*db update while */
+
+               if (scan_data->scan_type == MS_SCAN_PART) {
+                       /*disable bundle commit*/
+                       ms_update_valid_type_end();
+
+                       audio_svc_delete_invalid_items(scan_data->db_type);
+                       minfo_delete_invalid_media_records(scan_data->db_type);
+               }
+       } else {
+               node = first_inoti_node;
+
+               while (node != NULL) {
+                       node->db_updated = true;
+                       node = node->next;
+               }
+       }
+STOP_SCAN:
+       if (dp) closedir(dp);
+
+       sync();
+
+       MS_DBG_END();
+
+       return;
+}
diff --git a/common/media-server-scan.c b/common/media-server-scan.c
new file mode 100755 (executable)
index 0000000..ae440d5
--- /dev/null
@@ -0,0 +1,239 @@
+/*
+ *  Media Server
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-server-scan.c
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief
+ */
+#include <vconf.h>
+#include <minfo-types.h>
+
+#include "media-server-common.h"
+#include "media-server-thumb.h"
+#include "media-server-scan-internal.h"
+#include "media-server-scan.h"
+
+#ifdef PROGRESS
+#include <quickpanel.h>
+#endif
+
+GAsyncQueue *scan_queue;
+extern int mmc_state;
+
+#ifdef FMS_PERF
+extern struct timeval g_mmc_start_time;
+extern struct timeval g_mmc_end_time;
+#endif
+
+static void _insert_array(GArray *garray, ms_scan_data_t *insert_data)
+{
+       ms_scan_data_t *data;
+       bool insert_ok = false;
+       int len = garray->len;
+       int i;
+
+       MS_DBG("the length of array : %d", len);
+       MS_DBG("db_type : %d", insert_data->db_type);
+       MS_DBG("scan_type : %d", insert_data->scan_type);
+
+       for (i=0; i < len; i++)
+       {
+               data = g_array_index(garray, ms_scan_data_t*, i);
+
+               if (data->db_type == insert_data->db_type) {
+                       if(data->scan_type > insert_data->scan_type) {
+                               g_array_remove_index (garray, i);
+                               g_array_insert_val(garray, i, insert_data);
+                               insert_ok =  true;
+                       }
+               }
+       }
+
+       if (insert_ok == false)
+               g_array_append_val(garray, insert_data);
+}
+
+gboolean ms_scan_thread(void *data)
+{
+       MS_DBG_START();
+
+       ms_scan_data_t *scan_data = NULL;
+       ms_scan_data_t *insert_data;
+       GArray *garray = NULL;
+       bool res;
+       int length;
+       int err;
+
+#ifdef PROGRESS
+       struct quickpanel *ms_quickpanel = NULL;
+#endif
+
+       /*create array for processing overlay data*/
+       garray = g_array_new (FALSE, FALSE, sizeof (ms_scan_data_t *));
+       if (garray == NULL) {
+               MS_DBG("g_array_new error");
+               return false;
+       }
+
+       while (1) {
+               length  = g_async_queue_length(scan_queue);
+
+               /*updating requests remain*/
+               if (garray->len != 0 && length == 0) {
+                       scan_data = g_array_index(garray, ms_scan_data_t*, 0);
+                       g_array_remove_index (garray, 0);
+               } else if (length != 0) {
+                       insert_data = g_async_queue_pop(scan_queue);
+                       _insert_array(garray, insert_data);
+                       continue;
+               } else if (garray->len == 0 && length == 0) {
+                       /*Threre is no request, Wait until pushung new request*/
+                       insert_data = g_async_queue_pop(scan_queue);
+                       _insert_array(garray, insert_data);
+                       continue;
+               }
+
+               if (scan_data->scan_type == end_thread) {
+                       MS_DBG("RECEIVE END THREAD");
+                       free(scan_data);
+
+                       if(garray) g_array_free (garray, TRUE);
+
+                       return false;
+               } else if (scan_data->scan_type != MS_SCAN_VALID) {
+                       /*connect to media db, if conneting is failed, db updating is stopped*/
+                       err = ms_media_db_open();
+                       if (err != MS_ERR_NONE)
+                               continue;
+
+                       /*start db updating */
+                       if (scan_data->scan_type != MS_SCAN_NONE ) {
+                               int status;
+
+                               ms_set_db_status(MS_DB_UPDATING);
+                               /*check UMS status and change configuration value*/
+                               ms_config_get_int(MS_USB_MODE_KEY, &status);
+                               if (status == MS_VCONFKEY_MASS_STORAGE_MODE) {
+                                       ms_config_get_int(VCONFKEY_USB_STORAGE_STATUS, &status);
+                                       if(status == VCONFKEY_USB_STORAGE_STATUS_OFF) {
+                                               ms_config_set_int(MS_USB_MODE_KEY, MS_VCONFKEY_NORMAL_MODE);
+                                       }
+                               }
+#ifdef PROGRESS
+                               ms_quickpanel = malloc(sizeof(struct quickpanel));
+                               ms_create_quickpanel(ms_quickpanel);
+#endif /*PROGRESS*/
+                       }
+
+                       if (scan_data->scan_type == MS_SCAN_ALL) {
+                               res = ms_delete_all_record(scan_data->db_type);
+                               if (res != true) {
+                                       MS_DBG("ms_delete_all_record fails");
+                               }
+                       }
+
+#ifdef FMS_PERF
+                       if (scan_data->db_type == MS_MMC) {
+                               ms_check_start_time(&g_mmc_start_time);
+                       }
+#endif
+                       /*call for bundle commit*/
+                       ms_register_start();
+
+#ifdef PROGRESS
+                       /*add inotify watch and insert data into media db */
+                       _ms_dir_scan(scan_data, ms_quickpanel);
+
+                       if (ms_quickpanel != NULL) {
+                               ms_delete_quickpanel(ms_quickpanel);
+                               free(ms_quickpanel);
+                               ms_quickpanel = NULL;
+                       }
+#else
+                       /*add inotify watch and insert data into media db */
+                       _ms_dir_scan(scan_data);
+#endif
+                       /*call for bundle commit*/
+                       ms_register_end();
+
+#ifdef FMS_PERF
+                       if (scan_data->db_type == MS_MMC) {
+                               ms_check_end_time(&g_mmc_end_time);
+                               ms_check_time_diff(&g_mmc_start_time, &g_mmc_end_time);
+                       }
+#endif
+
+                       /*set vconf key mmc loading for indicator */
+                       if (scan_data->scan_type != MS_SCAN_NONE )
+                               ms_set_db_status(MS_DB_UPDATED);
+
+                       /*disconnect form media db*/
+                       ms_media_db_close();
+#ifdef THUMB_THREAD
+                       /*create making thumbnail thread*/
+                       if (scan_data->scan_type == MS_SCAN_ALL) {
+                               minfo_folder_type db;
+                               if(scan_data->db_type == MS_PHONE)
+                                       db = MINFO_CLUSTER_TYPE_LOCAL_PHONE;
+                               else
+                                       db = MINFO_CLUSTER_TYPE_LOCAL_MMC;
+                               g_thread_create((GThreadFunc) ms_thumb_thread, &db, TRUE, NULL);
+                       }
+#endif
+                       /*Active flush */
+                       sqlite3_release_memory(-1);
+
+                       if (scan_data->db_type == MS_MMC) {
+                               ms_update_mmc_info();
+                       }
+               } else  {
+                       /*connect to media db, if conneting is failed, db updating is stopped*/
+                       err = ms_media_db_open();
+                       if (err != MS_ERR_NONE)
+                               continue;
+
+                       /*update just valid type*/
+                       err = ms_change_valid_type(scan_data->db_type, false);
+                       if (err != MS_ERR_NONE)
+                               MS_DBG("ms_change_valid_type fail");
+
+                       ms_set_db_status(MS_DB_UPDATED);
+
+                       /*disconnect form media db*/
+                       ms_media_db_close();
+
+                       /*Active flush */
+                       sqlite3_release_memory(-1);
+               }
+
+               free(scan_data);
+       }                       /*thread while*/
+
+       if(garray) g_array_free (garray, TRUE);
+
+       MS_DBG_END();
+
+       return true;
+}
diff --git a/common/media-server-socket.c b/common/media-server-socket.c
new file mode 100755 (executable)
index 0000000..bda3145
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+ *  Media Server
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-server-thumb.c
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief
+ */
+#include <arpa/inet.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <media-util-err.h>
+#include <media-info.h>
+
+#include "media-server-global.h"
+#include "media-server-common.h"
+#include "media-server-socket.h"
+
+#define MINFO_REGISTER_PORT 1001
+
+GAsyncQueue* ret_queue;
+
+gboolean ms_socket_thread(void *data)
+{
+       int ret;
+       int err;
+       int state;
+       int sockfd;
+       int send_msg = MEDIA_INFO_ERROR_NONE;
+       int client_addr_size;
+
+       struct sockaddr_in server_addr;
+       struct sockaddr_in client_addr;
+
+       char recv_buff[MS_FILE_PATH_LEN_MAX];
+
+       sockfd = socket(PF_INET, SOCK_DGRAM, 0);
+
+       if(sockfd < 0)
+       {
+               MS_DBG("socket create error");
+               perror("socket error : ");
+               return MS_ERR_SOCKET_CONN;
+       }
+
+       memset(&server_addr, 0, sizeof(server_addr));
+       server_addr.sin_family = AF_INET;
+       server_addr.sin_port = htons(MINFO_REGISTER_PORT);
+       server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+
+       state = bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
+       if(state < 0)
+       {
+               MS_DBG("bind error");
+               perror("bind error : ");
+               return MS_ERR_SOCKET_BIND;
+       }
+
+       err = ms_media_db_open();
+       if (err != MS_ERR_NONE) {
+               MS_DBG("SOCKET : sqlite3_open: ret = %d", err);
+               return false;
+       }
+
+       while(1)
+       {
+               client_addr_size  = sizeof(client_addr);
+               err = recvfrom(sockfd, recv_buff, sizeof(recv_buff), 0 ,
+                       (struct sockaddr*)&client_addr, (socklen_t *)&client_addr_size);
+               if(err < 0){
+                       MS_DBG("recvfrom error :%d", errno);
+                       perror("recvfrom error : ");
+                       goto NEXT;
+               } else {
+                       MS_DBG("receive: %s\n", recv_buff);
+               }
+
+               ret = ms_register_file(recv_buff, ret_queue);
+               if (ret == MS_ERR_NOW_REGISTER_FILE) {
+                       MS_DBG("WAIT");
+                       ret= GPOINTER_TO_INT(g_async_queue_pop(ret_queue)) - MS_ERR_MAX;
+                       MS_DBG("RECEIVE REPLAY");
+               }
+
+               if (ret != MS_ERR_NONE) {
+                       MS_DBG("ms_register_file error : %d", ret);
+
+                       if(ret == MS_ERR_ARG_INVALID) {
+                               send_msg = MS_MEDIA_ERR_INVALID_PARAMETER;
+                       } else if (ret == MS_ERR_NOT_MEDIA_FILE) {
+                               send_msg = MS_MEDIA_ERR_INVALID_MEDIA;
+                       } else if (ret == MS_ERR_DB_INSERT_RECORD_FAIL) {
+                               send_msg = MS_MEDIA_ERR_INSERT_FAIL;
+                       } else if (ret == MS_ERR_DRM_REGISTER_FAIL) {
+                               send_msg = MS_MEDIA_ERR_DRM_INSERT_FAIL;
+                       }
+               } else {
+                       MS_DBG("SOCKET INSERT SECCESS");
+                       send_msg = MS_MEDIA_ERR_NONE;
+               }
+
+               err = sendto(sockfd, &send_msg, sizeof(send_msg), 0,
+                       (struct sockaddr*)&client_addr, sizeof(client_addr));
+               if(err < 0){
+                       MS_DBG("SOCKET SEND FAIL :%d", errno);
+                       perror("send error : ");
+               } else {
+                       MS_DBG("SOCKET SEND SUCCESS");
+               }
+NEXT:
+               memset(recv_buff, 0, MS_FILE_PATH_LEN_MAX);
+       }
+
+       close(sockfd);
+       MS_DBG("END SOCKET THREAD");
+
+       err = ms_media_db_close();
+       if (err != MS_ERR_NONE) {
+               MS_DBG("ms_media_db_close error : %d", err);
+               return false;
+       }
+       MS_DBG("Disconnect MEDIA DB");
+
+       return 0;
+}
+
diff --git a/common/media-server-thumb.c b/common/media-server-thumb.c
new file mode 100755 (executable)
index 0000000..e2eeaad
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ *  Media Server
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-server-thumb.c
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief
+ */
+#include <media-svc.h>
+#include <media-thumbnail.h>
+#include <vconf.h>
+
+#include "media-server-common.h"
+#include "media-server-thumb.h"
+
+#ifdef THUMB_THREAD
+extern int mmc_state;
+extern int current_usb_mode;
+
+static int _ite_fn(Mitem * item, void *user_data)
+{
+       GList **list = (GList **) user_data;
+       *list = g_list_append(*list, item);
+
+       return 0;
+}
+
+gboolean ms_thumb_thread(void *data)
+{
+       int err = -1;
+       int i = 0;
+       Mitem *mitem = NULL;
+       GList *p_list = NULL;
+       minfo_item_filter item_filter;
+       char thumb_path[1024];
+
+       memset(&item_filter, 0x00, sizeof(minfo_item_filter));
+
+       item_filter.file_type = MINFO_ITEM_ALL;
+       item_filter.sort_type = MINFO_MEDIA_SORT_BY_DATE_ASC;
+       item_filter.start_pos = -1;
+       item_filter.end_pos = -1;
+       item_filter.with_meta = FALSE;
+       item_filter.favorite = MINFO_MEDIA_FAV_ALL;
+
+       ms_media_db_open();
+
+       MS_DBG("data : %d", *(minfo_folder_type*)data);
+
+       err =  minfo_get_all_item_list(*(minfo_folder_type*)data, item_filter,  _ite_fn, &p_list);
+       if (err < 0) {
+               MS_DBG("minfo_get_all_item_list error : %d", err);
+               return err;
+       }
+
+       for (i = 0; i < g_list_length(p_list); i++) {
+               //check usb in out
+               if (current_usb_mode != VCONFKEY_USB_STORAGE_STATUS_OFF
+                           || ((mmc_state != VCONFKEY_SYSMAN_MMC_MOUNTED) && (*(minfo_folder_type*)data == MINFO_CLUSTER_TYPE_LOCAL_MMC))) {
+                   MS_DBG("BREAK");
+                       break;
+               }
+               mitem = (Mitem *) g_list_nth_data(p_list, i);
+
+               if (mitem) {
+                       MS_DBG("Start to extracting thumbnails [%s] ( %s )", mitem->uuid, mitem->file_url);
+                     err = minfo_extract_thumbnail(mitem->uuid, mitem->type);
+                       if (err < 0) {
+                               MS_DBG("thumbnail_request_from_db falied: %d", err);
+                       } else {
+                               MS_DBG("thumbnail_request_from_db success: %s", thumb_path);
+                       }
+
+                       minfo_destroy_mtype_item(mitem);
+               } else {
+                       MS_DBG("mitem[%d] is NULL", i);
+               }
+       }
+
+       ms_media_db_close();
+
+       if (p_list != NULL) {
+               g_list_free(p_list);
+               p_list = NULL;
+       }
+}
+#endif
diff --git a/config.in b/config.in
new file mode 100644 (file)
index 0000000..e4e5149
--- /dev/null
+++ b/config.in
@@ -0,0 +1,161 @@
+/* config.in.  Generated from configure.ac by autoheader.  */
+
+/* Define to 1 if the `closedir' function returns void instead of `int'. */
+#undef CLOSEDIR_VOID
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_DIRENT_H
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define to 1 if you have the `fork' function. */
+#undef HAVE_FORK
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if `lstat' has the bug that it succeeds when given the
+   zero-length file name argument. */
+#undef HAVE_LSTAT_EMPTY_STRING_BUG
+
+/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
+   to 0 otherwise. */
+#undef HAVE_MALLOC
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `memset' function. */
+#undef HAVE_MEMSET
+
+/* Define to 1 if you have the `mkdir' function. */
+#undef HAVE_MKDIR
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#undef HAVE_NDIR_H
+
+/* Define to 1 if stdbool.h conforms to C99. */
+#undef HAVE_STDBOOL_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#undef HAVE_STRCASECMP
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `strstr' function. */
+#undef HAVE_STRSTR
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_SYS_DIR_H
+
+/* Define to 1 if you have the <sys/file.h> header file. */
+#undef HAVE_SYS_FILE_H
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_SYS_NDIR_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <sys/vfs.h> header file. */
+#undef HAVE_SYS_VFS_H
+
+/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the `vfork' function. */
+#undef HAVE_VFORK
+
+/* Define to 1 if you have the <vfork.h> header file. */
+#undef HAVE_VFORK_H
+
+/* Define to 1 if `fork' works. */
+#undef HAVE_WORKING_FORK
+
+/* Define to 1 if `vfork' works. */
+#undef HAVE_WORKING_VFORK
+
+/* Define to 1 if the system has the type `_Bool'. */
+#undef HAVE__BOOL
+
+/* Define to 1 if `lstat' dereferences a symlink specified with a trailing
+   slash. */
+#undef LSTAT_FOLLOWS_SLASHED_SYMLINK
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#undef TIME_WITH_SYS_TIME
+
+/* Define to 1 if your <sys/time.h> declares `struct tm'. */
+#undef TM_IN_SYS_TIME
+
+/* Version number of package */
+#undef VERSION
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to rpl_malloc if the replacement function should be used. */
+#undef malloc
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef pid_t
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
+
+/* Define as `fork' if `vfork' does not work. */
+#undef vfork
diff --git a/configure.ac b/configure.ac
new file mode 100755 (executable)
index 0000000..1b9ba34
--- /dev/null
@@ -0,0 +1,138 @@
+#                                               -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.61)
+AC_INIT([media-server], [1.0])
+AC_CONFIG_AUX_DIR([build-aux])
+AC_CONFIG_HEADERS([config.h:config.in])
+
+AM_INIT_AUTOMAKE([-Wall -Werror foreign])
+
+# for platform setting
+AC_CONFIG_MACRO_DIR([m4])
+
+# Checks for programs.
+AC_PROG_CC
+AC_PROG_INSTALL
+AC_PROG_MAKE_SET
+AC_PROG_LIBTOOL
+
+# Check target
+if ! (test "x$ARCH" = "xarmel" -o "x$ARCH" = "xi386"); then
+    echo "$ARCH"
+#      ARCH=ARM
+fi
+
+#if test "x$MACHINE" = "xfloater"; then
+    CPPFLAGS="$CPPFLAGS -D _FM_GENERIC_ -D EXPORT_API=\"__attribute__((visibility(\\\"default\\\")))\""
+    echo ""
+    echo $CPPFLAGS
+    echo "### check point ###"
+    echo ""
+#fi
+
+CPPFLAGS="${CPPFLAGS} -DRND_LINUX"
+
+# FMS_DEBUG - File Manager Service debug options
+# To open debug options:
+# export FMS_DEBUG=1 or configure --enable-debug
+AC_ARG_ENABLE([debug],
+              [AS_HELP_STRING([--enable-debug], [Enable debug options])],
+              [case "x$enableval" in
+               xyes) debug=true;;
+               xno)  debug=false;;
+               *)      AC_MSG_ERROR([Bad value %enableval for --enable-debug]);;
+               esac],
+              [debug=false])
+if test "x$debug" = "xtrue" -o "x$FMS_DEBUG" = "x1"; then
+    FMS_DEBUG_FLAGS="-D FEXPLORER_DEBUG -g"
+else
+    FMS_DEBUG_FLAGS=""
+fi
+AC_SUBST(FMS_DEBUG_FLAGS)
+
+# Checks for libraries.
+PKG_CHECK_MODULES(GTHREAD, gthread-2.0)
+AC_SUBST(GTHREAD_CFLAGS)
+AC_SUBST(GTHREAD_LIBS)
+
+PKG_CHECK_MODULES(GLIB, glib-2.0)
+AC_SUBST(GLIB_CFLAGS)
+AC_SUBST(GLIB_LIBS)
+
+PKG_CHECK_MODULES(DLOG, dlog)
+AC_SUBST(DLOG_CFLAGS)
+AC_SUBST(DLOG_LIBS)
+
+PKG_CHECK_MODULES(DB_UTIL, db-util)
+AC_SUBST(DB_UTIL_CFLAGS)
+AC_SUBST(DB_UTIL_LIBS)
+
+PKG_CHECK_MODULES(DRM_SERVICE, drm-service)
+AC_SUBST(DRM_SERVICE_CFLAGS)
+AC_SUBST(DRM_SERVICE_LIBS)
+
+PKG_CHECK_MODULES(PHONESTATUS, vconf)
+AC_SUBST(PHONESTATUS_CFLAGS)
+AC_SUBST(PHONESTATUS_LIBS)
+
+PKG_CHECK_MODULES(UTIL, heynoti)
+AC_SUBST(UTIL_CFLAGS)
+AC_SUBST(UTIL_LIBS)
+
+PKG_CHECK_MODULES(MM_FILEINFO, mm-fileinfo)
+AC_SUBST(MM_FILEINFO_CFLAGS)
+AC_SUBST(MM_FILEINFO_LIBS)
+
+PKG_CHECK_MODULES(MEDIA_INFO, libmedia-service)
+AC_SUBST(MEDIA_INFO_CFLAGS)
+AC_SUBST(MEDIA_INFO_LIBS)
+
+PKG_CHECK_MODULES(AUL, aul)
+AC_SUBST(AUL_CFLAGS)
+AC_SUBST(AUL_LIBS)
+
+PKG_CHECK_MODULES(DBUS, dbus-1)
+AC_SUBST(DBUS_CFLAGS)
+AC_SUBST(DBUS_LIBS)
+
+# pm, replace libpmcontrol
+PKG_CHECK_MODULES(LIBPMCONTROL, pmapi)
+AC_SUBST(LIBPMCONTROL_CFLAGS)
+AC_SUBST(LIBPMCONTROL_LIBS)
+
+# quickpanel library
+#PKG_CHECK_MODULES(LIBQUICKPANEL, quickpanel)
+#AC_SUBST(LIBQUICKPANEL_CFLAGS)
+#AC_SUBST(LIBQUICKPANEL_LIBS)
+
+# thumb-gen library
+PKG_CHECK_MODULES(THUMB_GEN, media-thumbnail)
+AC_SUBST(THUMB_GEN_CFLAGS)
+AC_SUBST(THUMB_GEN_LIBS)
+
+#Checks for header files.
+AC_HEADER_DIRENT
+AC_HEADER_STDC
+AC_HEADER_SYS_WAIT
+AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/file.h sys/vfs.h unistd.h])
+
+# Checks for typedefs, structures, and compiler characteristics.
+AC_HEADER_STDBOOL
+AC_C_CONST
+AC_TYPE_SIZE_T
+AC_HEADER_TIME
+AC_STRUCT_TM
+
+# Checks for library functions.
+AC_FUNC_CLOSEDIR_VOID
+AC_FUNC_FORK
+AC_FUNC_LSTAT
+AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
+AC_FUNC_MALLOC
+AC_CHECK_FUNCS([gettimeofday memset mkdir strcasecmp strstr])
+
+AC_CONFIG_FILES([Makefile
+                                libmedia-utils.pc
+                                ])
+AC_OUTPUT
diff --git a/data/mediasvr b/data/mediasvr
new file mode 100755 (executable)
index 0000000..d109017
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+/usr/bin/media-server&
+
diff --git a/debian/changelog b/debian/changelog
new file mode 100755 (executable)
index 0000000..6a1cf0b
--- /dev/null
@@ -0,0 +1,7 @@
+media-server (0.1.51) unstable; urgency=low
+
+  * Initial debinization edition.
+  * Git : pkgs/m/media-server
+  * Tag : media-server_0.1.51
+
+ -- Yong Yeon Kim <yy9875.kim@samsung.com>  Wed, 07 Dec 2011 12:33:12 +0800
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 100755 (executable)
index 0000000..6ca4c50
--- /dev/null
@@ -0,0 +1,43 @@
+Source: media-server
+Section: misc
+Priority: extra
+Maintainer: Yong Yeon Kim <yy9875.kim@samsung.com>, Byungwook Jang <bw.jang@samsung.com>
+Uploaders:
+Build-Depends: debhelper (>= 5), autotools-dev,
+               libglib2.0-dev,
+               libslp-setting-dev,
+               libheynoti-dev,
+               libmedia-service-dev,
+               dlog-dev,
+               drm-service-dev,
+               libslp-db-util-dev,
+               libmm-fileinfo-dev,
+               libaul-1-dev,
+               libslp-pm-dev,
+               libmedia-thumbnail-dev
+Standards-Version: 0.1.0
+
+Package: media-server
+Section: utils
+Architecture: any
+Depends: ${misc:Depends}
+Description: multimedia contents managing server.
+
+Package: media-server-dbg
+Section: debug
+Architecture: any
+Depends: ${misc:Depends}, libmedia-utils (= ${Source-Version})
+Description: media-server and libmedia-utils debug pkg.
+
+Package: libmedia-utils
+Section: libs
+Architecture: any
+Depends:
+Description: media utils runtime library.
+
+Package: libmedia-utils-dev
+Section: devel
+Architecture: any
+Depends: libmedia-utils (= ${Source-Version})
+Description: media utils development library.
+
diff --git a/debian/copyright b/debian/copyright
new file mode 100644 (file)
index 0000000..4ec25ed
--- /dev/null
@@ -0,0 +1,14 @@
+Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved 
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT 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/libmedia-utils-dev.install.in b/debian/libmedia-utils-dev.install.in
new file mode 100755 (executable)
index 0000000..d1d8077
--- /dev/null
@@ -0,0 +1,2 @@
+@PREFIX@/lib/pkgconfig/libmedia-utils.pc
+@PREFIX@/include/media-utils/*
diff --git a/debian/libmedia-utils.install.in b/debian/libmedia-utils.install.in
new file mode 100755 (executable)
index 0000000..f700d1c
--- /dev/null
@@ -0,0 +1 @@
+@PREFIX@/lib/libmedia-utils.*
diff --git a/debian/libmedia-utils.postinst.in b/debian/libmedia-utils.postinst.in
new file mode 100755 (executable)
index 0000000..1a24852
--- /dev/null
@@ -0,0 +1 @@
+#!/bin/sh
diff --git a/debian/media-server.install.in b/debian/media-server.install.in
new file mode 100644 (file)
index 0000000..fabd1aa
--- /dev/null
@@ -0,0 +1,4 @@
+@PREFIX@/bin/*
+/etc/rc.d/init.d/mediasvr
+/etc/rc.d/rc3.d/S48mediasvr
+/etc/rc.d/rc5.d/S48mediasvr
diff --git a/debian/media-server.postinst.in b/debian/media-server.postinst.in
new file mode 100755 (executable)
index 0000000..78f538c
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+####################################################################
+
+
+vconftool set -t int db/filemanager/dbupdate "1"
+vconftool set -t int memory/filemanager/Mmc "0" -i
+
+vconftool set -t int db/Apps/mediaserver/usbmode "0"
+vconftool set -t string db/Apps/mediaserver/mmc_info ""
+
diff --git a/debian/prerm.in b/debian/prerm.in
new file mode 100755 (executable)
index 0000000..a0df112
--- /dev/null
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+#set -e
+
+#PATH=$PATH:${prefix}/bin
+
+#unregister_noti_info User.FileManager.UpdateDB
+#unregister_noti_info User.FileManager.SetOpenedFile
+#unregister_noti_info User.FileManager.GetOpenedFile
+
+#. /etc/ipkg/functions
+
+#installer.sh uninstall 1016 -t ${arch_type}
+#installer.sh uninstall com.samsung.filemanager-service -t ${arch_type}
diff --git a/debian/rules b/debian/rules
new file mode 100755 (executable)
index 0000000..7272284
--- /dev/null
@@ -0,0 +1,125 @@
+#!/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
+
+
+# These are used for cross-compiling and for saving the configure script
+# from having to guess our platform (since we know it already)
+DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+
+CFLAGS ?=
+LDFLAGS ?=
+PREFIX ?= /usr
+DATADIR ?= /opt
+
+CFLAGS += -Wall -g -fPIC
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+       CFLAGS += -O0
+else
+       CFLAGS += -O2
+endif
+
+LDFLAGS += -Wl,--rpath=$(PREFIX)/lib -Wl,--hash-style=both -Wl,--as-needed
+
+configure: configure.ac
+       ./autogen.sh
+
+config.status: configure
+       dh_testdir
+       # Add here commands to configure the package.
+       CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" ./configure --prefix=$(PREFIX)
+
+build: build-stamp
+
+build-stamp:  config.status
+       dh_testdir
+
+       # Add here commands to compile the package.
+       $(MAKE)
+       #docbook-to-man debian/ncurses.sgml > ncurses.1
+
+       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#@DATADIR@#$(DATADIR)#g" $${f%.in}; \
+       done
+
+       touch $@
+
+clean:
+       dh_testdir
+       dh_testroot
+       rm -f build-stamp
+
+       # Add here commands to clean up after the build process.
+       -$(MAKE) distclean
+ifneq "$(wildcard /usr/share/misc/config.sub)" ""
+       cp -f /usr/share/misc/config.sub config.sub
+endif
+ifneq "$(wildcard /usr/share/misc/config.guess)" ""
+       cp -f /usr/share/misc/config.guess config.guess
+endif
+
+       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
+
+       # Add here commands to install the package into debian/ncurses.
+       $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install
+       chmod 700 $(CURDIR)/debian/tmp/etc/rc.d/init.d/mediasvr
+
+
+# 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=media-server-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
diff --git a/lib/include/media-util-dbg.h b/lib/include/media-util-dbg.h
new file mode 100755 (executable)
index 0000000..10b72b9
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ *  Media Utility
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-util-dbg.h
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief
+ */
+#ifndef _MEDIA_UTIL_DBG_H_
+#define _MEDIA_UTIL_DBG_H_
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <dlog.h>
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+
+#define LOG_TAG "MEDIA-UTIL"
+
+#define MSAPI_DBG(fmt, arg...)  LOGD("[%s : %d] [%s] " fmt "\n", __FILE__, __LINE__, __FUNCTION__, ##arg)
+
+#endif /*_MEDIA_UTIL_DBG_H_*/
diff --git a/lib/include/media-util-err.h b/lib/include/media-util-err.h
new file mode 100755 (executable)
index 0000000..f658582
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ *  Media Utility
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-util-err.h
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief
+ */
+#ifndef _MEDIA_UTIL_ERR_H_
+#define _MEDIA_UTIL_ERR_H_
+
+#define MS_ERROR_MASKL16       0xFFFF
+#define MS_ERROR(X)        (X & MS_ERROR_MASKL16)
+
+#define MS_MEDIA_ERR_NONE 0
+#define MS_MEDIA_ERR_OCCURRED  (MS_MEDIA_ERR_NONE - MS_ERROR(0x01))
+#define MS_MEDIA_ERR_INVALID_PARAMETER (MS_MEDIA_ERR_NONE - MS_ERROR(0x01))    /**< invalid parameter(s) */
+#define MS_MEDIA_ERR_INVALID_PATH (MS_MEDIA_ERR_NONE - MS_ERROR(0x02))  /**< Invalid file path */
+
+#define MS_MEDIA_ERR_SOCKET_CONN (MS_MEDIA_ERR_NONE - MS_ERROR(0x03))/**< Socket connect error */
+#define MS_MEDIA_ERR_SOCKET_MSG (MS_MEDIA_ERR_NONE - MS_ERROR(0x04))/**< Socket message error */
+#define MS_MEDIA_ERR_SOCKET_SEND (MS_MEDIA_ERR_NONE - MS_ERROR(0x05))/**< Socket send error */
+#define MS_MEDIA_ERR_SOCKET_RECEIVE (MS_MEDIA_ERR_NONE - MS_ERROR(0x06))/**< Socket receive error */
+#define MS_MEDIA_ERR_SOCKET_RECEIVE_TIMEOUT (MS_MEDIA_ERR_NONE - MS_ERROR(0x07))/**< Socket time out */
+
+#define MS_MEDIA_ERR_INVALID_MEDIA (MS_MEDIA_ERR_NONE - MS_ERROR(0x08))/**< Invalid media content */
+#define MS_MEDIA_ERR_INSERT_FAIL (MS_MEDIA_ERR_NONE - MS_ERROR(0x09))/**< DB insert fail */
+#define MS_MEDIA_ERR_DRM_INSERT_FAIL (MS_MEDIA_ERR_NONE - MS_ERROR(0x0a))/**< DRM file insert fail */
+
+#define MS_MEDIA_ERR_UNKNOWN (MS_MEDIA_ERR_NONE - MS_ERROR(0x10)) /**<Unknown error*/
+
+#endif /*_MEDIA_UTIL_ERR_H_*/
diff --git a/lib/include/media-util-internal.h b/lib/include/media-util-internal.h
new file mode 100755 (executable)
index 0000000..690a367
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ *  Media Utility
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-util-global.h
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief
+ */
+
+#ifndef _MEDIA_UTIL_GLOBAL_H_
+#define _MEDIA_UTIL_GLOBAL_H_
+
+#define MS_MEDIA_TIMEOUT_SEC           10 /*timeout of waiting reponse for IPC*/
+
+#define MS_MEDIA_UPDATE_NOTI_PATH "/opt/data/file-manager-service/_FILEOPERATION_END"
+
+#define MS_MEDIA_REGISTER_PORT 1001
+
+#define MS_MEDIA_PHONE_ROOT_PATH         "/opt/media"
+#define MS_MEDIA_MMC_ROOT_PATH           "/opt/storage/sdcard"
+
+#endif /*_MEDIA_UTIL_GLOBAL_H_*/
diff --git a/lib/include/media-util-noti.h b/lib/include/media-util-noti.h
new file mode 100755 (executable)
index 0000000..6665e05
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ *  Media Utility
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-util-noti.h
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief
+ */
+ #ifndef _MEDIA_UTIL_NOTI_H_
+#define _MEDIA_UTIL_NOTI_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+* @fn          int ms_noti_db_update_complete(void);
+* @brief               This function announce media database is updated to other applications.<br>
+* @return      This function returns 0 on success, and -1 on failure.
+* @param[in]   none
+* @remark      This function is recommandation for other application being aware of database updating.<br>
+* @par example
+* @code
+
+#include <stdio.h>
+#include <string.h>
+#include <media-service-noti.h>
+
+       int main()
+       {
+               int result;
+
+               ....
+               file operation (copy/move/delete)
+               ....
+
+               result = ms_noti_db_update_complete();
+               if( result < 0 )
+               {
+                       printf("FAIL to ms_noti_db_update_complete\n");
+                       return 0;
+               }
+               else
+               {
+                       printf("SUCCESS to ms_noti_db_update_complete\n");
+               }
+
+               return 0;
+       }
+
+* @endcode
+*/
+
+int ms_noti_db_update_complete(void);
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*_MEDIA_UTIL_NOTI_H_*/
diff --git a/lib/include/media-util-register.h b/lib/include/media-util-register.h
new file mode 100755 (executable)
index 0000000..e61d19d
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ *  Media Utility
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-util-register.h
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief
+ */
+ #ifndef _MEDIA_UTIL_REGISTER_H_
+#define _MEDIA_UTIL_REGISTER_H_
+
+#include <glib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @fn         int ms_media_file_register(const char *file_full_path);
+ * @brief              This function registers multimedia file to media DB
+ *                     When you did some file operations such as Create, Copy, Move, Rename, and Delete in phone or mmc storage, media-server registers the result to database automatically by inotify mechanism.
+ *                     However, automatic registration will have a little delay because the method is asynchronous.
+ *                     If you want to register some files to database immediately, you should use this API.
+ *
+ * @param      file_full_path [in]             full path of file for register
+ * @return     This function returns zero(MEDIA_INFO_ERROR_NONE) on success, or negative value with error code.
+ *                     Please refer 'media-info-error.h' to know the exact meaning of the error.
+ * @see                None.
+ * @pre                None.
+ * @post               None.
+ * @remark     The database name is "/opt/dbspace/.media.db".
+ *                  You have to use this API only for registering multimedia files. If you try to register no multimedia file, this API returns error.
+ * @par example
+ * @code
+
+#include <media-info.h>
+
+int main()
+{
+       int result = -1;
+
+       result = ms_media_file_register("/opt/media/test.mp3");
+       if( result < 0 )
+       {
+               printf("FAIL to mediainfo_register_file\n");
+               return 0;
+       }
+       else
+       {
+               printf("SUCCESS to register file\n");
+       }
+
+       return 0;
+}
+
+ *     @endcode
+ */
+int media_file_register(const char *file_full_path);
+
+ typedef GArray* media_list;
+
+int media_list_new(media_list *list);
+
+int media_list_add(media_list list, const char* file_full_path);
+
+int media_list_free(media_list list);
+
+int media_files_register(const media_list list);
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*_MEDIA_UTIL_REGISTER_H_*/
diff --git a/lib/media-util-noti.c b/lib/media-util-noti.c
new file mode 100755 (executable)
index 0000000..f5de153
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ *  Media Utility
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-util-noti.c
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "media-util-err.h"
+#include "media-util-internal.h"
+#include "media-util-noti.h"
+
+ int ms_noti_update_complete(void)
+{
+       int ret;
+       int err = MS_MEDIA_ERR_NONE;
+
+       ret = mkdir(MS_MEDIA_UPDATE_NOTI_PATH, 0777);
+       if (ret != 0) {
+               err = MS_MEDIA_ERR_OCCURRED;
+       }
+
+       return err;
+}
+
diff --git a/lib/media-util-register.c b/lib/media-util-register.c
new file mode 100755 (executable)
index 0000000..4793d69
--- /dev/null
@@ -0,0 +1,212 @@
+/*
+ *  Media Utility
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Yong Yeon Kim <yy9875.kim@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.
+ *
+ */
+
+/**
+ * This file defines api utilities of contents manager engines.
+ *
+ * @file               media-util-register.c
+ * @author     Yong Yeon Kim(yy9875.kim@samsung.com)
+ * @version    1.0
+ * @brief
+ */
+#include <errno.h>
+#include <unistd.h>
+#include <arpa/inet.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/socket.h>
+#include <string.h>
+
+#include <media-svc.h>
+#include <audio-svc.h>
+#include <audio-svc-error.h>
+
+#include "media-util-dbg.h"
+#include "media-util-err.h"
+#include "media-util-internal.h"
+#include "media-util-register.h"
+
+static bool _is_valid_path(const char *path)
+{
+       if (path == NULL)
+               return false;
+
+       if (strncmp(path, MS_MEDIA_PHONE_ROOT_PATH, strlen(MS_MEDIA_PHONE_ROOT_PATH)) == 0) {
+               return true;
+       } else if (strncmp(path, MS_MEDIA_MMC_ROOT_PATH, strlen(MS_MEDIA_MMC_ROOT_PATH)) == 0) {
+               return true;
+       } else
+               return false;
+
+       return true;
+}
+
+int media_file_register(const char *file_full_path)
+{
+       int exist;
+       int err;
+       int sockfd;
+       int recv_msg = MS_MEDIA_ERR_NONE;
+       int server_addr_size;
+       struct sockaddr_in server_addr;
+       struct timeval tv_timeout = { MS_MEDIA_TIMEOUT_SEC, 0 };
+
+       if(!_is_valid_path(file_full_path)) {
+               MSAPI_DBG("Invalid path : %s", file_full_path);
+               return MS_MEDIA_ERR_INVALID_PATH;
+       }
+
+       exist = open(file_full_path, O_RDONLY);
+       if(exist < 0) {
+               MSAPI_DBG("Not exist path : %s", file_full_path);
+               return MS_MEDIA_ERR_INVALID_PATH;
+       }
+       close(exist);
+
+       sockfd = socket(PF_INET, SOCK_DGRAM, 0);
+       if(sockfd < 0)
+       {
+               MSAPI_DBG("socket create fail");
+               return MS_MEDIA_ERR_SOCKET_CONN;
+       }
+
+       /*add timeout : timeout is 10 sec.*/
+       if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv_timeout, sizeof(tv_timeout)) == -1) {
+               MSAPI_DBG("setsockopt failed");
+               return MS_MEDIA_ERR_SOCKET_CONN;
+       }
+
+       memset(&server_addr, 0, sizeof(server_addr));
+       server_addr.sin_family = AF_INET;
+       server_addr.sin_port = htons(MS_MEDIA_REGISTER_PORT);
+       server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
+
+       err = sendto(sockfd, file_full_path, strlen(file_full_path), 0, (struct sockaddr*)&server_addr, sizeof(server_addr));
+       if (err < 0) {
+               MSAPI_DBG("sendto error");
+               perror("sendto error : ");
+               return MS_MEDIA_ERR_SOCKET_SEND;
+       } else {
+               MSAPI_DBG("SEND OK");
+       }
+
+       server_addr_size = sizeof(server_addr);
+       err = recvfrom(sockfd, &recv_msg, sizeof(recv_msg), 0 , (struct sockaddr*)&server_addr, (socklen_t *)&server_addr_size);
+       if (err < 0) {
+               if (errno == EWOULDBLOCK) {
+                       MSAPI_DBG("recvfrom timeout");
+                       return MS_MEDIA_ERR_SOCKET_RECEIVE_TIMEOUT;
+               } else {
+                       MSAPI_DBG("recvfrom error");
+                       perror("recvfrom error : ");
+                       return MS_MEDIA_ERR_SOCKET_RECEIVE;
+               }
+       } else {
+               MSAPI_DBG("RECEIVE OK");
+               MSAPI_DBG("client receive: %d", recv_msg);
+       }
+
+       close(sockfd);
+
+       return recv_msg;
+}
+
+int media_list_new(media_list *list)
+{
+       *list = g_array_new(TRUE, TRUE, sizeof(char*));
+
+       return MS_MEDIA_ERR_NONE;
+}
+
+int media_list_add(media_list list, const char* file_full_path)
+{
+       MSAPI_DBG("");
+
+       if (!list) {
+               MSAPI_DBG("list == NULL");
+               return MS_MEDIA_ERR_INVALID_PARAMETER;
+       }
+
+       if (!file_full_path) {
+               MSAPI_DBG("file_full_path == NULL");
+               return MS_MEDIA_ERR_INVALID_PARAMETER;
+       }
+
+       media_list ret_list = NULL;
+       char *path = strdup(file_full_path);
+
+       int len = list->len + 1;
+       int i;
+       char *data = NULL;
+
+       ret_list = g_array_append_val(list, path);
+       if(ret_list == NULL) {
+               MSAPI_DBG("g_array_append_val fails");
+               return MS_MEDIA_ERR_UNKNOWN;
+       }
+
+       list = ret_list;
+
+       for(i = 0; i < len; i++) {
+               data = g_array_index(list, char*, i);
+               MSAPI_DBG("%d, %s", i, data);
+       }
+
+       return MS_MEDIA_ERR_NONE;
+}
+
+int media_list_free(media_list list)
+{
+       if (!list)
+               return MS_MEDIA_ERR_INVALID_PARAMETER;
+
+       int len = list->len + 1;
+       int i;
+       char *data = NULL;
+
+       for(i = 0; i < len; i++) {
+               data = g_array_index(list, char*, i);
+               free(data);
+       }
+
+       g_array_free(list, TRUE);
+
+       return MS_MEDIA_ERR_NONE;
+}
+
+int media_files_register(const media_list list)
+{
+       if (!list)
+               return MS_MEDIA_ERR_INVALID_PARAMETER;
+
+       int len = list->len + 1;
+       int i;
+       char *data;
+
+       for(i = 0; i < len; i++) {
+               data = g_array_index(list, char*, i);
+               media_file_register(data);
+       }
+
+       return MS_MEDIA_ERR_NONE;
+}
+
diff --git a/libmedia-utils.pc.in b/libmedia-utils.pc.in
new file mode 100755 (executable)
index 0000000..886d52d
--- /dev/null
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: media contents managing service
+Description: media contents managing service API
+Requires:
+Version: @VERSION@
+Libs: -L${libdir} -lmedia-utils
+Cflags: -I${includedir}/media-utils
diff --git a/packaging/media-server.spec b/packaging/media-server.spec
new file mode 100644 (file)
index 0000000..50edff5
--- /dev/null
@@ -0,0 +1,290 @@
+Name:       media-server
+Summary:    Media Server.
+Version:    0.1.18
+Release:    1
+Group:      utils
+License:    Samsung
+Source0:    %{name}-%{version}.tar.gz
+
+Requires(post): /usr/bin/sqlite3
+Requires(post): /usr/bin/vconftool
+
+BuildRequires:  pkgconfig(glib-2.0)
+BuildRequires:  pkgconfig(vconf)
+BuildRequires:  pkgconfig(dbus-1)
+BuildRequires:  pkgconfig(dlog)
+BuildRequires:  pkgconfig(db-util)
+BuildRequires:  pkgconfig(drm-service)
+BuildRequires:  pkgconfig(heynoti)
+BuildRequires:  pkgconfig(mm-fileinfo)
+BuildRequires:  pkgconfig(libmedia-info)
+BuildRequires:  pkgconfig(aul)
+BuildRequires:  pkgconfig(pmapi)
+BuildRequires:  pkgconfig(quickpanel)
+
+%description
+Media service server..
+
+%package devel
+Summary:   Media server headers and libraries
+Group:     utils
+Requires:  %{name} = %{version}-%{release}
+
+%description devel
+Media server headers and libraries (development)
+
+%prep
+%setup -q
+
+%build
+
+%autogen
+
+LDFLAGS="$LDFLAGS -Wl,--rpath=%{prefix}/lib -Wl,--hash-style=both -Wl,--as-needed "; export LDFLAGS
+
+%configure --prefix=/usr
+
+make %{?jobs:-j%jobs}
+
+%install
+rm -rf %{buildroot}
+%make_install
+
+
+%post
+
+if  [ ! -f /opt/dbspace/.filemanager.db ]
+then
+       sqlite3 /opt/dbspace/.filemanager.db 'PRAGMA journal_mode = PERSIST;
+
+       CREATE TABLE mmc_info (serial text, date text, manfid text);
+'
+fi
+
+if  [ ! -f /opt/dbspace/.media.db ]
+then
+       sqlite3 /opt/dbspace/.media.db 'PRAGMA journal_mode = PERSIST;
+
+       CREATE TABLE audio_media (audio_id integer primary key autoincrement, path text unique, basename text, thumbnail_path text, title text, title_key text, album text, album_id integer, artist text, artist_id integer, genre text, author text, year integer default -1, copyright text, description text, format text, bitrate integer default -1, track_num integer default -1, duration integer default -1, rating integer default 0, played_count integer default 0, last_played_time integer default -1, added_time integer, rated_time integer, album_rating integer default 0, modified_date integer default 0, size integer default 0, mime_type text, is_ringtone INTEGER default 0, is_music INTEGER default 1, is_alarm INTEGER default 0, is_notification INTEGER default 0, is_podcast INTEGER default 0, bookmark INTEGER default 0, category INTEGER default 0, valid integer default 0, folder_id integer default -1, storage_type integer, content_type integer default 3);
+       INSERT INTO "audio_media" VALUES(1,"/opt/media/Sounds and music/Ringtones/Basic_Cuisine.mp3","Basic_Cuisine.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Cuisine","Cuisine","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","","128kbps 44.1kHz 2ch",128000,-1,15804,0,0,0,1303362789,NULL,0,1300757280,253889,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(2,"/opt/media/Sounds and music/Ringtones/Global_Rhythm of the rain.mp3","Global_Rhythm of the rain.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Rhythm of the rain","Rhythm of the rain","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","Samsung","128kbps 44.1kHz 2ch",128000,-1,36780,0,0,0,1303362789,NULL,0,1257745924,589696,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(3,"/opt/media/Sounds and music/Ringtones/Global_Imagine.mp3","Global_Imagine.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Imagine","Imagine","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","Samsung","128kbps 44.1kHz 2ch",128000,-1,40620,0,0,0,1303362789,NULL,0,1257745880,651136,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(4,"/opt/media/Sounds and music/Ringtones/Global_Avemaria.mp3","Global_Avemaria.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Avemaria","Avemaria","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","Samsung","128kbps 44.1kHz 2ch",128000,-1,40489,0,0,0,1303362789,NULL,0,1257745780,649088,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(5,"/opt/media/Sounds and music/Ringtones/Global_Sunshine.mp3","Global_Sunshine.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Sunshine","Sunshine","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","Samsung","128kbps 44.1kHz 2ch",128000,-1,33280,0,0,0,1303362789,NULL,0,1257745966,534400,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(6,"/opt/media/Sounds and music/Ringtones/Global_Do it now.mp3","Global_Do it now.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Do it now","Do it now","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","Samsung","128kbps 44.1kHz 2ch",128000,-1,37250,0,0,0,1303362789,NULL,0,1257759968,598016,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(7,"/opt/media/Sounds and music/Ringtones/Global_Brain wave.mp3","Global_Brain wave.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Brain wave","Brain wave","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","Samsung","128kbps 44.1kHz 2ch",128000,-1,36022,0,0,0,1303362789,NULL,0,1257745594,577408,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(8,"/opt/media/Sounds and music/Ringtones/General_Crossingwalk.mp3","General_Crossingwalk.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Crossingwalk","Crossingwalk","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","Samsung","128kbps 44.1kHz 2ch",128000,-1,13296,0,0,0,1303362789,NULL,0,1296193320,213765,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(9,"/opt/media/Sounds and music/Ringtones/General_One fine day.mp3","General_One fine day.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","One fine day","One fine day","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","","128kbps 44.1kHz 2ch",128000,0,14497,0,0,0,1303362790,NULL,0,1276820740,233611,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(10,"/opt/media/Sounds and music/Ringtones/Global_Vocalise.mp3","Global_Vocalise.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Vocalise","Vocalise","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","Samsung","128kbps 44.1kHz 2ch",128000,-1,44617,0,0,0,1303362790,NULL,0,1257746032,714624,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(11,"/opt/media/Sounds and music/Ringtones/Basic_Basic tone.mp3","Basic_Basic tone.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Basic tone","Basic tone","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","","128kbps 44.1kHz 2ch",128000,-1,3500,0,0,0,1303362790,NULL,0,1271843334,57216,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(12,"/opt/media/Sounds and music/Ringtones/Basic_Minimal tone.mp3","Basic_Minimal tone.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Minimal tone","Minimal tone","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","","128kbps 44.1kHz 2ch",128000,-1,5355,0,0,0,1303362790,NULL,0,1301545764,86706,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(13,"/opt/media/Sounds and music/Ringtones/General_Emotive sensation.mp3","General_Emotive sensation.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Emotive sensation","Emotive sensation","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","","128kbps 44.1kHz 2ch",128000,-1,19226,0,0,0,1303362790,NULL,0,1300950722,308642,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(14,"/opt/media/Sounds and music/Ringtones/General_Just spinning.mp3","General_Just spinning.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Just spinning","Just spinning","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","","128kbps 44.1kHz 2ch",128000,-1,19356,0,0,0,1303362790,NULL,0,1300950870,310919,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(15,"/opt/media/Sounds and music/Ringtones/Global_You'\''re my love song.mp3","Global_You'\''re my love song.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","You'\''re my love song","You'\''re my love song","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","Samsung","128kbps 44.1kHz 2ch",128000,-1,32104,0,0,0,1303362790,NULL,0,1257746058,513920,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(16,"/opt/media/Sounds and music/Ringtones/General_City drivin.mp3","General_City drivin.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","City drivin","City drivin","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","","128kbps 44.1kHz 2ch",128000,-1,18076,0,0,0,1303362790,NULL,0,1300692200,290857,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(17,"/opt/media/Sounds and music/Ringtones/Basic_Single tone.mp3","Basic_Single tone.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Single tone","Single tone","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","","80kbps 44.1kHz 1ch",80000,-1,3683,0,0,0,1303362790,NULL,0,1300950830,38849,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(18,"/opt/media/Sounds and music/Ringtones/Basic_Popple tone.mp3","Basic_Popple tone.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Popple tone","Popple tone","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","","128kbps 44.1kHz 2ch",128000,-1,16613,0,0,0,1303362790,NULL,0,1300757442,267870,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(19,"/opt/media/Sounds and music/Ringtones/Global_Ringing to you.mp3","Global_Ringing to you.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Ringing to you","Ringing to you","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","Samsung","128kbps 44.1kHz 2ch",128000,-1,31895,0,0,0,1303362790,NULL,0,1272851802,513253,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(20,"/opt/media/Sounds and music/Ringtones/Global_Tell me.mp3","Global_Tell me.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Tell me","Tell me","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","Samsung","128kbps 44.1kHz 2ch",128000,-1,32052,0,0,0,1303362790,NULL,0,1257745984,513920,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(21,"/opt/media/Sounds and music/Ringtones/Basic_Crossing tone.mp3","Basic_Crossing tone.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Crossing tone","Crossing tone","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","","128kbps 44.1kHz 2ch",128000,-1,7314,0,0,0,1303362790,NULL,0,1300757250,118808,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(22,"/opt/media/Sounds and music/Ringtones/Global_The secret only 4U.mp3","Global_The secret only 4U.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","The secret only 4U","The secret only 4U","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","Samsung","128kbps 44.1kHz 2ch",128000,-1,41482,0,0,0,1303362790,NULL,0,1257746014,665472,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(23,"/opt/media/Sounds and music/Ringtones/Global_On my mind.mp3","Global_On my mind.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","On my mind","On my mind","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","Samsung","128kbps 44.1kHz 2ch",128000,-1,29675,0,0,0,1303362790,NULL,0,1298452646,475008,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(24,"/opt/media/Sounds and music/Ringtones/General_Ring a ring.mp3","General_Ring a ring.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Ring a ring","Ring a ring","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","","128kbps 44.1kHz 2ch",128000,-1,20062,0,0,0,1303362790,NULL,0,1300757470,322017,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(25,"/opt/media/Sounds and music/Ringtones/Global_Drawing the night.mp3","Global_Drawing the night.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Drawing the night","Drawing the night","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","Samsung","128kbps 44.1kHz 2ch",128000,-1,32078,0,0,0,1303362790,NULL,0,1257745832,513920,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(26,"/opt/media/Sounds and music/Ringtones/Global_Anymore.mp3","Global_Anymore.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Anymore","Anymore","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","Samsung","128kbps 44.1kHz 2ch",128000,-1,32156,0,0,0,1303362790,NULL,0,1257745756,516096,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(27,"/opt/media/Sounds and music/Ringtones/Global_Hypnotize.mp3","Global_Hypnotize.mp3","","Hypnotize","Hypnotize","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","Samsung","128kbps 44.1kHz 2ch",128000,-1,49319,0,0,0,1303362791,NULL,0,1257745856,790400,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(28,"/opt/media/Sounds and music/Ringtones/General_Digital cloud.mp3","General_Digital cloud.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Digital cloud","Digital cloud","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","","128kbps 44.1kHz 2ch",128000,-1,20297,0,0,0,1303362791,NULL,0,1300692232,326802,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(29,"/opt/media/Sounds and music/Ringtones/General_Mis en scene.mp3","General_Mis en scene.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Mis en scene","Mis en scene","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","","128kbps 44.1kHz 2ch",128000,-1,30667,0,0,0,1303362791,NULL,0,1300757424,491708,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(30,"/opt/media/Sounds and music/Ringtones/General_Reverie.mp3","General_Reverie.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Reverie","Reverie","Samsung",1,"Samsung",1,"Ringtone","Unknown",-1,"","","128kbps 44.1kHz 2ch",128000,-1,25391,0,0,0,1303362791,NULL,0,1300757454,407280,"audio/mpeg",0,1,0,0,0,0,1,1,1,0,3);
+       INSERT INTO "audio_media" VALUES(31,"/opt/media/Sounds and music/Music/Over the horizon.mp3","Over the horizon.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Over the horizon","Over the horizon","Samsung",1,"Samsung",1,"Rock","Unknown",2011,"","Samsung","128kbps 44.1kHz 2ch",128000,-1,185521,0,0,0,1303362791,NULL,0,1303267153,3179820,"audio/mpeg",0,1,0,0,0,0,0,1,2,0,3);
+       INSERT INTO "audio_media" VALUES(32,"/opt/media/Sounds and music/Alerts/Glittering Light.mp3","Glittering Light.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Glittering light","Glittering light","Samsung",1,"Samsung",1,"Alert tone","Unknown",-1,"","","96kbps 44.1kHz 2ch",96000,-1,2560,0,0,0,1303362791,NULL,0,1298442334,31744,"audio/mpeg",0,1,0,0,0,0,1,1,3,0,3);
+       INSERT INTO "audio_media" VALUES(33,"/opt/media/Sounds and music/Alerts/Bubbles.mp3","Bubbles.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Bubbles","Bubbles","Samsung",1,"Samsung",1,"Alert tone","Unknown",-1,"","","96kbps 44.1kHz 1ch",96000,-1,574,0,0,0,1303362791,NULL,0,1298442388,8944,"audio/mpeg",0,1,0,0,0,0,1,1,3,0,3);
+       INSERT INTO "audio_media" VALUES(34,"/opt/media/Sounds and music/Alerts/Chirp Chrip.mp3","Chirp Chrip.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Chirp Chirp","Chirp Chirp","Samsung",1,"Samsung",1,"Alert tone","Unknown",-1,"","","96kbps 44.1kHz 1ch",96000,-1,1253,0,0,0,1303362791,NULL,0,1298540588,17095,"audio/mpeg",0,1,0,0,0,0,1,1,3,0,3);
+       INSERT INTO "audio_media" VALUES(35,"/opt/media/Sounds and music/Alerts/Pianissimo.mp3","Pianissimo.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Pianissimo","Pianissimo","Samsung",1,"Samsung",1,"Alert tone","Unknown",-1,"","","96kbps 44.1kHz 1ch",96000,-1,3474,0,0,0,1303362791,NULL,0,1298442184,43739,"audio/mpeg",0,1,0,0,0,0,1,1,3,0,3);
+       INSERT INTO "audio_media" VALUES(36,"/opt/media/Sounds and music/Alerts/Cloud.mp3","Cloud.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Cloud","Cloud","Samsung",1,"Samsung",1,"Alert tone","Unknown",-1,"","Samsung","96kbps 44.1kHz 1ch",96000,-1,1933,0,0,0,1303362791,NULL,0,1282182420,24448,"audio/mpeg",0,1,0,0,0,0,1,1,3,0,3);
+       INSERT INTO "audio_media" VALUES(37,"/opt/media/Sounds and music/Alerts/Charming bell.mp3","Charming bell.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Charming bell","Charming bell","Samsung",1,"Samsung",1,"Alert tone","Unknown",-1,"","","96kbps 44.1kHz 1ch",96000,-1,2481,0,0,0,1303362791,NULL,0,1298442370,31828,"audio/mpeg",0,1,0,0,0,0,1,1,3,0,3);
+       INSERT INTO "audio_media" VALUES(38,"/opt/media/Sounds and music/Alerts/Good News.mp3","Good News.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Good news","Good news","Samsung",1,"Samsung",1,"Alert tone","Unknown",-1,"","","96kbps 44.1kHz 2ch",96000,-1,1645,0,0,0,1303362791,NULL,0,1298442316,20773,"audio/mpeg",0,1,0,0,0,0,1,1,3,0,3);
+       INSERT INTO "audio_media" VALUES(39,"/opt/media/Sounds and music/Alerts/Knock.mp3","Knock.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Knock","Knock","Samsung",1,"Samsung",1,"Alert tone","Unknown",-1,"","","96kbps 44.1kHz 1ch",96000,-1,1018,0,0,0,1303362791,NULL,0,1298442242,14273,"audio/mpeg",0,1,0,0,0,0,1,1,3,0,3);
+       INSERT INTO "audio_media" VALUES(40,"/opt/media/Sounds and music/Alerts/Transparent piano.mp3","Transparent piano.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Transparent piano","Transparent piano","Samsung",1,"Samsung",1,"Alert tone","Unknown",-1,"","Samsung","96kbps 44.1kHz 1ch",96000,-1,3160,0,0,0,1303362791,NULL,0,1300842836,38912,"audio/mpeg",0,1,0,0,0,0,1,1,3,0,3);
+       INSERT INTO "audio_media" VALUES(41,"/opt/media/Sounds and music/Alerts/Stepping stones.mp3","Stepping stones.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Stepping stones","Stepping stones","Samsung",1,"Samsung",1,"Alert tone","Unknown",-1,"","Samsung","96kbps 44.1kHz 1ch",96000,-1,1854,0,0,0,1303362791,NULL,0,1282182694,22528,"audio/mpeg",0,1,0,0,0,0,1,1,3,0,3);
+       INSERT INTO "audio_media" VALUES(42,"/opt/media/Sounds and music/Alerts/Harmonics.mp3","Harmonics.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Harmonics","Harmonics","Samsung",1,"Samsung",1,"Alert tone","Unknown",-1,"","","96kbps 44.1kHz 1ch",96000,-1,4597,0,0,0,1303362792,NULL,0,1298442284,57219,"audio/mpeg",0,1,0,0,0,0,1,1,3,0,3);
+       INSERT INTO "audio_media" VALUES(43,"/opt/media/Sounds and music/Alerts/A toy watch.mp3","A toy watch.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","A toy watch","A toy watch","Samsung",1,"Samsung",1,"Alert tone","Unknown",-1,"","Samsung","96kbps 44.1kHz 1ch",96000,-1,3030,0,0,0,1303362792,NULL,0,1282181478,36736,"audio/mpeg",0,1,0,0,0,0,1,1,3,0,3);
+       INSERT INTO "audio_media" VALUES(44,"/opt/media/Sounds and music/Alerts/Good morning.mp3","Good morning.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Good morning","Good morning","Samsung",1,"Samsung",1,"Alert tone","Unknown",-1,"","Samsung","96kbps 44.1kHz 1ch",96000,-1,5694,0,0,0,1303362792,NULL,0,1282181594,69632,"audio/mpeg",0,1,0,0,0,0,1,1,3,0,3);
+       INSERT INTO "audio_media" VALUES(45,"/opt/media/Sounds and music/Alerts/Opener.mp3","Opener.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Opener","Opener","Samsung",1,"Samsung",1,"Alert tone","Unknown",-1,"","","96kbps 44.1kHz 1ch",96000,-1,1671,0,0,0,1303362792,NULL,0,1298442202,22110,"audio/mpeg",0,1,0,0,0,0,1,1,3,0,3);
+       INSERT INTO "audio_media" VALUES(46,"/opt/media/Sounds and music/Alerts/Starry night.mp3","Starry night.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Starry night","Starry night","Samsung",1,"Samsung",1,"Alert tone","Unknown",-1,"","","96kbps 44.1kHz 1ch",96000,-1,5015,0,0,0,1303362792,NULL,0,1298442082,62234,"audio/mpeg",0,1,0,0,0,0,1,1,3,0,3);
+       INSERT INTO "audio_media" VALUES(47,"/opt/media/Sounds and music/Alerts/On time.mp3","On time.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","On time","On time","Samsung",1,"Samsung",1,"Alert tone","Unknown",-1,"","Samsung","96kbps 44.1kHz 1ch",96000,-1,2560,0,0,0,1303362792,NULL,0,1282182136,32640,"audio/mpeg",0,1,0,0,0,0,1,1,3,0,3);
+       INSERT INTO "audio_media" VALUES(48,"/opt/media/Sounds and music/Alerts/Postman.mp3","Postman.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Postman","Postman","Samsung",1,"Samsung",1,"Alert tone","Unknown",-1,"","","96kbps 44.1kHz 1ch",96000,-1,2220,0,0,0,1303362792,NULL,0,1298442162,28693,"audio/mpeg",0,1,0,0,0,0,1,1,3,0,3);
+       INSERT INTO "audio_media" VALUES(49,"/opt/media/Sounds and music/Alerts/Pure Bell.mp3","Pure Bell.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Pure bell","Pure bell","Samsung",1,"Samsung",1,"Alert tone","Unknown",-1,"","","96kbps 44.1kHz 2ch",96000,0,2063,0,0,0,1303362792,NULL,0,1298442768,25916,"audio/mpeg",0,1,0,0,0,0,1,1,3,0,3);
+       INSERT INTO "audio_media" VALUES(50,"/opt/media/Sounds and music/Alerts/Haze.mp3","Haze.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Haze","Haze","Samsung",1,"Samsung",1,"Alert tone","Unknown",-1,"","Samsung","96kbps 44.1kHz 1ch",96000,-1,1071,0,0,0,1303362792,NULL,0,1282182480,14208,"audio/mpeg",0,1,0,0,0,0,1,1,3,0,3);
+       INSERT INTO "audio_media" VALUES(51,"/opt/media/Sounds and music/Alerts/Sherbet.mp3","Sherbet.mp3","/opt/data/file-manager-service/.thumb/phone/.mp3-2b1eb83d4d987ad847b9d56d044321a4.png","Sherbet","Sherbet","Samsung",1,"Samsung",1,"Alert tone","Unknown",-1,"","","96kbps 44.1kHz 1ch",96000,-1,1436,0,0,0,1303362792,NULL,0,1298442114,19289,"audio/mpeg",0,1,0,0,0,0,1,1,3,0,3);
+       
+       CREATE TABLE audio_folder (_id integer primary key autoincrement, path text, folder_name text, storage_type integer);
+       INSERT INTO "audio_folder" VALUES(1,"/opt/media/Sounds and music/Ringtones","Ringtones",0);
+       INSERT INTO "audio_folder" VALUES(2,"/opt/media/Sounds and music/Music","Music",0);
+       INSERT INTO "audio_folder" VALUES(3,"/opt/media/Sounds and music/Alerts","Alerts",0);
+
+       CREATE TABLE album_art (album_id INTEGER PRIMARY KEY, _data TEXT);
+       INSERT INTO "album_art" VALUES(1,"");
+
+       CREATE TABLE albums (album_id INTEGER PRIMARY KEY AUTOINCREMENT, album_key TEXT NOT NULL UNIQUE, album TEXT NOT NULL);
+       INSERT INTO "albums" VALUES(1,"Samsung","Samsung");
+
+       CREATE TABLE artists (artist_id INTEGER PRIMARY KEY AUTOINCREMENT,artist_key TEXT NOT NULL UNIQUE,artist TEXT NOT NULL);
+       INSERT INTO "artists" VALUES(1,"Samsung","Samsung");
+
+       CREATE TABLE audio_genres (_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL);
+       INSERT INTO "audio_genres" VALUES(1,"Ringtone");
+       INSERT INTO "audio_genres" VALUES(2,"Rock");
+       INSERT INTO "audio_genres" VALUES(3,"Alert tone");
+
+       CREATE TABLE audio_genres_map (_id INTEGER PRIMARY KEY AUTOINCREMENT,audio_id INTEGER NOT NULL,genre_id INTEGER NOT NULL);
+       INSERT INTO "audio_genres_map" VALUES(1,1,1);
+       INSERT INTO "audio_genres_map" VALUES(2,2,1);
+       INSERT INTO "audio_genres_map" VALUES(3,3,1);
+       INSERT INTO "audio_genres_map" VALUES(4,4,1);
+       INSERT INTO "audio_genres_map" VALUES(5,5,1);
+       INSERT INTO "audio_genres_map" VALUES(6,6,1);
+       INSERT INTO "audio_genres_map" VALUES(7,7,1);
+       INSERT INTO "audio_genres_map" VALUES(8,8,1);
+       INSERT INTO "audio_genres_map" VALUES(9,9,1);
+       INSERT INTO "audio_genres_map" VALUES(10,10,1);
+       INSERT INTO "audio_genres_map" VALUES(11,11,1);
+       INSERT INTO "audio_genres_map" VALUES(12,12,1);
+       INSERT INTO "audio_genres_map" VALUES(13,13,1);
+       INSERT INTO "audio_genres_map" VALUES(14,14,1);
+       INSERT INTO "audio_genres_map" VALUES(15,15,1);
+       INSERT INTO "audio_genres_map" VALUES(16,16,1);
+       INSERT INTO "audio_genres_map" VALUES(17,17,1);
+       INSERT INTO "audio_genres_map" VALUES(18,18,1);
+       INSERT INTO "audio_genres_map" VALUES(19,19,1);
+       INSERT INTO "audio_genres_map" VALUES(20,20,1);
+       INSERT INTO "audio_genres_map" VALUES(21,21,1);
+       INSERT INTO "audio_genres_map" VALUES(22,22,1);
+       INSERT INTO "audio_genres_map" VALUES(23,23,1);
+       INSERT INTO "audio_genres_map" VALUES(24,24,1);
+       INSERT INTO "audio_genres_map" VALUES(25,25,1);
+       INSERT INTO "audio_genres_map" VALUES(26,26,1);
+       INSERT INTO "audio_genres_map" VALUES(27,27,1);
+       INSERT INTO "audio_genres_map" VALUES(28,28,1);
+       INSERT INTO "audio_genres_map" VALUES(29,29,1);
+       INSERT INTO "audio_genres_map" VALUES(30,30,1);
+       INSERT INTO "audio_genres_map" VALUES(31,31,2);
+       INSERT INTO "audio_genres_map" VALUES(32,32,3);
+       INSERT INTO "audio_genres_map" VALUES(33,33,3);
+       INSERT INTO "audio_genres_map" VALUES(34,34,3);
+       INSERT INTO "audio_genres_map" VALUES(35,35,3);
+       INSERT INTO "audio_genres_map" VALUES(36,36,3);
+       INSERT INTO "audio_genres_map" VALUES(37,37,3);
+       INSERT INTO "audio_genres_map" VALUES(38,38,3);
+       INSERT INTO "audio_genres_map" VALUES(39,39,3);
+       INSERT INTO "audio_genres_map" VALUES(40,40,3);
+       INSERT INTO "audio_genres_map" VALUES(41,41,3);
+       INSERT INTO "audio_genres_map" VALUES(42,42,3);
+       INSERT INTO "audio_genres_map" VALUES(43,43,3);
+       INSERT INTO "audio_genres_map" VALUES(44,44,3);
+       INSERT INTO "audio_genres_map" VALUES(45,45,3);
+       INSERT INTO "audio_genres_map" VALUES(46,46,3);
+       INSERT INTO "audio_genres_map" VALUES(47,47,3);
+       INSERT INTO "audio_genres_map" VALUES(48,48,3);
+       INSERT INTO "audio_genres_map" VALUES(49,49,3);
+       INSERT INTO "audio_genres_map" VALUES(50,50,3);
+       INSERT INTO "audio_genres_map" VALUES(51,51,3);
+
+       CREATE TABLE audio_playlists (_id integer primary key autoincrement, name text, thumbnail_uri TEXT, _data TEXT, date_added INTEGER, date_modified INTEGER);
+
+       CREATE TABLE audio_playlists_map (_id integer primary key autoincrement, playlist_id integer, audio_id integer, play_order INTEGER);
+
+       DELETE FROM sqlite_sequence;
+       INSERT INTO "sqlite_sequence" VALUES("audio_folder",3);
+       INSERT INTO "sqlite_sequence" VALUES("audio_genres",3);
+       INSERT INTO "sqlite_sequence" VALUES("artists",1);
+       INSERT INTO "sqlite_sequence" VALUES("albums",1);
+       INSERT INTO "sqlite_sequence" VALUES("audio_media",51);
+       INSERT INTO "sqlite_sequence" VALUES("audio_genres_map",51);
+
+       CREATE INDEX titlekey_index on audio_media(title_key);
+       CREATE INDEX albumkey_index on albums(album_key);
+       CREATE TRIGGER albumart_cleanup1 DELETE ON albums BEGIN DELETE FROM album_art WHERE album_id = old.album_id;END;
+       CREATE INDEX artistkey_index on artists(artist_key);
+       CREATE TRIGGER audio_genres_cleanup DELETE ON audio_genres BEGIN DELETE FROM audio_genres_map WHERE genre_id = old._id;END;
+       CREATE TRIGGER audio_playlists_map_cleanup_1 DELETE ON audio_media BEGIN DELETE FROM audio_playlists_map WHERE audio_id = old.audio_id;END;
+       CREATE VIEW audio_meta AS SELECT audio_id AS _id, path AS _data, basename AS _display_name, size AS _size, mime_type, added_time AS date_added, modified_date, title, title_key, duration, artist_id, author AS composer, album_id, track_num, year, is_ringtone, is_music, is_alarm, is_notification, is_podcast, bookmark FROM audio_media where valid = 1;
+       CREATE VIEW audio as SELECT * FROM audio_meta LEFT OUTER JOIN artists ON audio_meta.artist_id=artists.artist_id LEFT OUTER JOIN albums ON audio_meta.album_id=albums.album_id;
+       CREATE VIEW album_info AS SELECT audio.album_id AS _id, album, album_key, MIN(year) AS minyear, MAX(year) AS maxyear, artist, artist_id, artist_key, count(*) AS numsongs,album_art._data AS album_art FROM audio LEFT OUTER JOIN album_art ON audio.album_id=album_art.album_id WHERE is_music=1 GROUP BY audio.album_id;
+       CREATE VIEW artist_info AS SELECT artist_id AS _id, artist, artist_key, COUNT(DISTINCT album) AS number_of_albums, COUNT(*) AS number_of_tracks FROM audio WHERE is_music=1 GROUP BY artist_key;
+       CREATE VIEW artists_albums_map AS SELECT DISTINCT artist_id, album_id FROM audio_meta;
+       CREATE VIEW searchhelpertitle AS SELECT * FROM audio ORDER BY title_key;
+       CREATE VIEW search AS SELECT _id,artist AS mime_type,artist,NULL AS album, NULL AS title,artist AS text1,NULL AS text2,number_of_albums AS data1, number_of_tracks AS data2,artist_key AS match, "content://media/external/audio/artists/"||_id AS suggest_intent_data, 1 AS grouporder FROM artist_info WHERE (artist!="Unknown") UNION ALL SELECT _id,album AS mime_type,artist,album,NULL AS title, album AS text1,artist AS text2,NULL AS data1,NULL AS data2, artist_key|| " " ||album_key AS match, "content://media/external/audio/albums/"||_id AS suggest_intent_data, 2 AS grouporder FROM album_info WHERE (album!="Unknown") UNION ALL SELECT searchhelpertitle._id AS _id,mime_type,artist,album,title, title AS text1,artist AS text2,NULL AS data1,NULL AS data2, artist_key||" "||album_key||" "||title_key AS match, "content://media/external/audio/media/"||searchhelpertitle._id AS suggest_intent_data, 3 AS grouporder FROM searchhelpertitle WHERE (title != "");
+
+       CREATE TABLE visual_folder(_id INTEGER, path VARCHAR(256), folder_name VARCHAR(256), modified_date INT, web_account_id VARCHAR(256), storage_type INT, sns_type INT, lock_status INT, web_album_id VARCHAR(256), valid INT, primary key (path, folder_name, storage_type) );
+
+       CREATE TABLE image_meta(_id INTEGER, media_id INT, longitude DOUBLE, latitude DOUBLE, description VARCHAR(256), width INT, height INT, orientation INT, datetaken INT, primary key (media_id) );
+
+       CREATE TABLE visual_media(_id INTEGER, path VARCHAR(256), folder_id INT, display_name VARCHAR(256), content_type INT, rating INT, modified_date INT, thumbnail_path VARCHAR(256), http_url VARCHAR(256), valid INT, primary key (path, folder_id, display_name) );
+
+       CREATE TABLE video_bookmark(_id INTEGER, media_id INT, marked_time INT, thumbnail_path VARCHAR(256), primary key ( media_id, marked_time) );
+
+       CREATE TABLE video_meta(_id INTEGER, media_id INT, album VARCHAR(256), artist VARCHAR(256), title VARCHAR(256), description VARCHAR(256), youtube_category VARCHAR(256), last_played_time INT, duration INT, longitude DOUBLE, latitude DOUBLE, width INT, height INT, datetaken INT, primary key ( media_id) );
+
+       CREATE TABLE web_streaming(_id INTEGER, folder_id INT, title VARCHAR(256), duration INT, url VARCHAR(256), thumb_path VARCHAR(256), primary key (_id) );
+
+       CREATE TABLE visual_tag_map(_id INTEGER, media_id INT, tag_id INT, primary key ( media_id, tag_id) );
+       CREATE TABLE visual_tag(_id INTEGER, tag_name VARCHAR(256), primary key ( tag_name) );
+
+       INSERT INTO "visual_folder" VALUES(5000001,"/opt/media/Images and videos/My photo clips","My photo clips",1298917858,"",0,0,0,"",1);
+       INSERT INTO "visual_folder" VALUES(5000002,"/opt/media/Images and videos/My video clips","My video clips",1298917858,"",0,0,0,"",1);
+       INSERT INTO "visual_folder" VALUES(5000003,"/opt/media/Images and videos/Wallpapers","Wallpapers",1298917858,"",0,0,0,"",1);
+
+       INSERT INTO "image_meta" VALUES(1,1,1000.0,1000.0,"No description", 480, 800, 1, 1275064496);
+       INSERT INTO "image_meta" VALUES(2,2,1000.0,1000.0,"", 800, 480, 0, 0);
+       INSERT INTO "image_meta" VALUES(3,3,1000.0,1000.0,"", 800, 480, 0, 0);
+       INSERT INTO "image_meta" VALUES(4,4,1000.0,1000.0,"No description", 480, 800, 1, 1281973593);
+       INSERT INTO "image_meta" VALUES(5,5,1000.0,1000.0,"No description", 480, 800, 1, 1281973895);
+       INSERT INTO "image_meta" VALUES(6,7,1000.0,1000.0,"", 480, 800, 0, 0);
+       INSERT INTO "image_meta" VALUES(7,8,1000.0,1000.0,"", 480, 800, 0, 0);
+
+       INSERT INTO "visual_media" VALUES(1,"/opt/media/Images and videos/My photo clips/5_photo.JPG", 5000001,"5_photo.JPG",1,0,1298917858,"/opt/data/file-manager-service/.thumb/phone/.JPG-8ddcdba99df472b448908d21d13854ad.png","",1);
+       INSERT INTO "visual_media" VALUES(2,"/opt/media/Images and videos/My photo clips/2_photo.jpg", 5000001,"2_photo.jpg",1,0,1298917858,"/opt/data/file-manager-service/.thumb/phone/.jpg-1bf63a4205303cb894a1564d603d85e8.png","",1);
+       INSERT INTO "visual_media" VALUES(3,"/opt/media/Images and videos/My photo clips/1_photo.jpg", 5000001,"1_photo.jpg",1,0,1298917858,"/opt/data/file-manager-service/.thumb/phone/.jpg-d78db813538100657fe67bb739b391ce.png","",1);
+       INSERT INTO "visual_media" VALUES(4,"/opt/media/Images and videos/My photo clips/4_photo.jpg", 5000001,"4_photo.jpg",1,0,1298917858,"/opt/data/file-manager-service/.thumb/phone/.jpg-4681c28ed65b83f59c5af7f84be4487a.png","",1);
+       INSERT INTO "visual_media" VALUES(5,"/opt/media/Images and videos/My photo clips/3_photo.jpg", 5000001,"3_photo.jpg",1,0,1298917858,"/opt/data/file-manager-service/.thumb/phone/.jpg-871f45a1520706c878122ff456b67d1a.png","",1);
+       INSERT INTO "visual_media" VALUES(6,"/opt/media/Images and videos/My video clips/Helicopter.mp4", 5000002,"Helicopter.mp4",2,0,1298917858,"/opt/data/file-manager-service/.thumb/phone/.mp4-0c401c836306fcb51ff1ffa0f6bd5289.png","",1);
+       INSERT INTO "visual_media" VALUES(7,"/opt/media/Images and videos/Wallpapers/Default.png", 5000003,"Default.png",1,0,1298917858,"/opt/data/file-manager-service/.thumb/phone/.png-e860d4acbabab8388203316f9193bf1d.png","",1);
+       INSERT INTO "visual_media" VALUES(8,"/opt/media/Images and videos/Wallpapers/Home_default.png", 5000003,"Home_default.png",1,0,1298917858,"/opt/data/file-manager-service/.thumb/phone/.png-7fb48e238a87f86506fc9670004327f4.png","",1);
+
+       INSERT INTO "video_meta" VALUES(1, 6, "Unknown", "Unknown","Unknown", "Unknown","", 0, 99800, 1000.0, 1000.0, 640, 352, 0 );
+
+       CREATE VIEW mediainfo_folder AS select _id, path, folder_name as name, storage_type from visual_folder where valid=1 union select _id, path, folder_name, storage_type       from audio_folder;
+
+       CREATE VIEW item_view AS select _id as item_id, path as file_path, display_name,thumbnail_path as   thumbnail,modified_date as date_modified, valid,folder_id,content_type from visual_media where 1 union select  audio_id ,path ,title ,thumbnail_path, modified_date, valid,folder_id,content_type from audio_media where 1;'
+fi
+
+vconftool set -t int db/filemanager/dbupdate "1"
+vconftool set -t int memory/filemanager/Mmc "0" -i
+
+if  [ -f /opt/dbspace/.filemanager.db ]
+then
+       chown root:6017 /opt/dbspace/.filemanager.db
+       chown root:6017 /opt/dbspace/.filemanager.db-journal
+fi
+
+if  [ -f /opt/dbspace/.media.db ]
+then
+       chown root:6017 /opt/dbspace/.media.db
+        chown root:6017 /opt/dbspace/.media.db-journal
+fi
+
+
+%files
+%defattr(-,root,root,-)
+%{_bindir}/media-server
+/etc/rc.d/init.d/mediasvr
+/etc/rc.d/rc3.d/S60mediasvr
+/etc/rc.d/rc5.d/S60mediasvr
+/usr/lib/libmedia-server.so.0
+/usr/lib/libmedia-server.so.0.0.0
+
+%files devel
+/usr/include/media-server/media-server-api.h
+/usr/lib/libmedia-server.so
+/usr/lib/pkgconfig/libmedia-server.pc