diff options
49 files changed, 7910 insertions, 0 deletions
@@ -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 index 0000000..df4cd48 --- /dev/null +++ b/Makefile.am @@ -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 index 0000000..a9d7ee4 --- /dev/null +++ b/autogen.sh @@ -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 index 0000000..df8eea7 --- /dev/null +++ b/build-aux/depcomp @@ -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 index 0000000..6781b98 --- /dev/null +++ b/build-aux/install-sh @@ -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 index 0000000..28055d2 --- /dev/null +++ b/build-aux/missing @@ -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 index 0000000..68daba6 --- /dev/null +++ b/common/include/media-server-common.h @@ -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 index 0000000..131a273 --- /dev/null +++ b/common/include/media-server-error.h @@ -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 index 0000000..a3c588e --- /dev/null +++ b/common/include/media-server-global.h @@ -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 index 0000000..53976ce --- /dev/null +++ b/common/include/media-server-hibernation.h @@ -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 index 0000000..88548be --- /dev/null +++ b/common/include/media-server-inotify-internal.h @@ -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 index 0000000..184a599 --- /dev/null +++ b/common/include/media-server-inotify.h @@ -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 index 0000000..7837792 --- /dev/null +++ b/common/include/media-server-scan-internal.h @@ -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 index 0000000..1cea90b --- /dev/null +++ b/common/include/media-server-scan.h @@ -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 index 0000000..934c0bd --- /dev/null +++ b/common/include/media-server-socket.h @@ -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 index 0000000..064c0f9 --- /dev/null +++ b/common/include/media-server-thumb.h @@ -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 index 0000000..da63a7c --- /dev/null +++ b/common/include/media-server-types.h @@ -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 index 0000000..3f007cd --- /dev/null +++ b/common/media-server-common.c @@ -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 index 0000000..8efe944 --- /dev/null +++ b/common/media-server-hibernation.c @@ -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 index 0000000..78e2d74 --- /dev/null +++ b/common/media-server-inotify-internal.c @@ -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 index 0000000..845cfd6 --- /dev/null +++ b/common/media-server-inotify.c @@ -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 index 0000000..1f15753 --- /dev/null +++ b/common/media-server-main.c @@ -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 index 0000000..e3bfcba --- /dev/null +++ b/common/media-server-scan-internal.c @@ -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 index 0000000..ae440d5 --- /dev/null +++ b/common/media-server-scan.c @@ -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 index 0000000..bda3145 --- /dev/null +++ b/common/media-server-socket.c @@ -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 index 0000000..e2eeaad --- /dev/null +++ b/common/media-server-thumb.c @@ -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 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 index 0000000..1b9ba34 --- /dev/null +++ b/configure.ac @@ -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 index 0000000..d109017 --- /dev/null +++ b/data/mediasvr @@ -0,0 +1,3 @@ +#!/bin/sh +/usr/bin/media-server& + diff --git a/debian/changelog b/debian/changelog new file mode 100755 index 0000000..6a1cf0b --- /dev/null +++ b/debian/changelog @@ -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 index 0000000..7ed6ff8 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +5 diff --git a/debian/control b/debian/control new file mode 100755 index 0000000..6ca4c50 --- /dev/null +++ b/debian/control @@ -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 index 0000000..4ec25ed --- /dev/null +++ b/debian/copyright @@ -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 index 0000000..d1d8077 --- /dev/null +++ b/debian/libmedia-utils-dev.install.in @@ -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 index 0000000..f700d1c --- /dev/null +++ b/debian/libmedia-utils.install.in @@ -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 index 0000000..1a24852 --- /dev/null +++ b/debian/libmedia-utils.postinst.in @@ -0,0 +1 @@ +#!/bin/sh diff --git a/debian/media-server.install.in b/debian/media-server.install.in new file mode 100644 index 0000000..fabd1aa --- /dev/null +++ b/debian/media-server.install.in @@ -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 index 0000000..78f538c --- /dev/null +++ b/debian/media-server.postinst.in @@ -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 index 0000000..a0df112 --- /dev/null +++ b/debian/prerm.in @@ -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 index 0000000..7272284 --- /dev/null +++ b/debian/rules @@ -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 index 0000000..10b72b9 --- /dev/null +++ b/lib/include/media-util-dbg.h @@ -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 index 0000000..f658582 --- /dev/null +++ b/lib/include/media-util-err.h @@ -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 index 0000000..690a367 --- /dev/null +++ b/lib/include/media-util-internal.h @@ -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 index 0000000..6665e05 --- /dev/null +++ b/lib/include/media-util-noti.h @@ -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 index 0000000..e61d19d --- /dev/null +++ b/lib/include/media-util-register.h @@ -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 index 0000000..f5de153 --- /dev/null +++ b/lib/media-util-noti.c @@ -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 index 0000000..4793d69 --- /dev/null +++ b/lib/media-util-register.c @@ -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 index 0000000..886d52d --- /dev/null +++ b/libmedia-utils.pc.in @@ -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 index 0000000..50edff5 --- /dev/null +++ b/packaging/media-server.spec @@ -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 |