diff options
author | Mike Lockwood <lockwood@android.com> | 2010-12-16 12:54:24 -0800 |
---|---|---|
committer | Mike Lockwood <lockwood@android.com> | 2010-12-16 15:35:36 -0800 |
commit | 076e05b488e40fdd946f0d35137fe66a576efe09 (patch) | |
tree | c2b732777b51e1f6d8ba92047c2446bd0f2d0582 /media/libmedia/MediaScanner.cpp | |
parent | dcaa10cd361a543cfa93bbb5c53444f437bd07a4 (diff) | |
download | frameworks_base-076e05b488e40fdd946f0d35137fe66a576efe09.zip frameworks_base-076e05b488e40fdd946f0d35137fe66a576efe09.tar.gz frameworks_base-076e05b488e40fdd946f0d35137fe66a576efe09.tar.bz2 |
MediaScanner: Add support for scanning empty directories
Currently the media scanner does not create database entries for directories
unless they contain a file that is scanned.
Fixing this so we provide a consistent view of the world to MTP.
Change-Id: Ia776acfeae23192183e7192d63cdc34d830ea889
Signed-off-by: Mike Lockwood <lockwood@android.com>
Diffstat (limited to 'media/libmedia/MediaScanner.cpp')
-rw-r--r-- | media/libmedia/MediaScanner.cpp | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/media/libmedia/MediaScanner.cpp b/media/libmedia/MediaScanner.cpp index c31b622..5ec573e 100644 --- a/media/libmedia/MediaScanner.cpp +++ b/media/libmedia/MediaScanner.cpp @@ -84,6 +84,7 @@ status_t MediaScanner::doProcessDirectory( // place to copy file or directory name char* fileSpot = path + strlen(path); struct dirent* entry; + struct stat statbuf; // ignore directories that contain a ".nomedia" file if (pathRemaining >= 8 /* strlen(".nomedia") */ ) { @@ -125,7 +126,6 @@ status_t MediaScanner::doProcessDirectory( // If the type is unknown, stat() the file instead. // This is sometimes necessary when accessing NFS mounted filesystems, but // could be needed in other cases well. - struct stat statbuf; if (stat(path, &statbuf) == 0) { if (S_ISREG(statbuf.st_mode)) { type = DT_REG; @@ -142,8 +142,15 @@ status_t MediaScanner::doProcessDirectory( // for example, the Mac ".Trashes" directory if (name[0] == '.') continue; + // report the directory to the client + if (stat(path, &statbuf) == 0) { + client.scanFile(path, statbuf.st_mtime, 0, true); + } + + // and now process its contents strcat(fileSpot, "/"); - int err = doProcessDirectory(path, pathRemaining - nameLength - 1, client, exceptionCheck, exceptionEnv); + int err = doProcessDirectory(path, pathRemaining - nameLength - 1, client, + exceptionCheck, exceptionEnv); if (err) { // pass exceptions up - ignore other errors if (exceptionCheck && exceptionCheck(exceptionEnv)) goto failure; @@ -151,11 +158,8 @@ status_t MediaScanner::doProcessDirectory( continue; } } else { - struct stat statbuf; stat(path, &statbuf); - if (statbuf.st_size > 0) { - client.scanFile(path, statbuf.st_mtime, statbuf.st_size); - } + client.scanFile(path, statbuf.st_mtime, statbuf.st_size, false); if (exceptionCheck && exceptionCheck(exceptionEnv)) goto failure; } } |