Created
December 28, 2012 03:59
-
-
Save koush/4394311 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
MediaScanResult MediaScanner::doProcessDirectoryEntry( | |
char *path, int pathRemaining, MediaScannerClient &client, bool noMedia, | |
struct dirent* entry, char* fileSpot) { | |
struct stat statbuf; | |
const char* name = entry->d_name; | |
// ignore "." and ".." | |
if (name[0] == '.' && (name[1] == 0 || (name[1] == '.' && name[2] == 0))) { | |
return MEDIA_SCAN_RESULT_SKIPPED; | |
} | |
int nameLength = strlen(name); | |
if (nameLength + 1 > pathRemaining) { | |
// path too long! | |
return MEDIA_SCAN_RESULT_SKIPPED; | |
} | |
strcpy(fileSpot, name); | |
int type = entry->d_type; | |
if (type == DT_UNKNOWN) { | |
// 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. | |
if (stat(path, &statbuf) == 0) { | |
if (S_ISREG(statbuf.st_mode)) { | |
type = DT_REG; | |
} else if (S_ISDIR(statbuf.st_mode)) { | |
type = DT_DIR; | |
} | |
} else { | |
ALOGD("stat() failed for %s: %s", path, strerror(errno) ); | |
} | |
} | |
if (type == DT_DIR) { | |
bool childNoMedia = noMedia; | |
// set noMedia flag on directories with a name that starts with '.' | |
// for example, the Mac ".Trashes" directory | |
if (name[0] == '.') | |
childNoMedia = true; | |
// report the directory to the client | |
if (stat(path, &statbuf) == 0) { | |
status_t status = client.scanFile(path, statbuf.st_mtime, 0, | |
true /*isDirectory*/, childNoMedia); | |
if (status) { | |
return MEDIA_SCAN_RESULT_ERROR; | |
} | |
} | |
// and now process its contents | |
strcat(fileSpot, "/"); | |
MediaScanResult result = doProcessDirectory(path, pathRemaining - nameLength - 1, | |
client, childNoMedia); | |
if (result == MEDIA_SCAN_RESULT_ERROR) { | |
return MEDIA_SCAN_RESULT_ERROR; | |
} | |
} else if (type == DT_REG) { | |
stat(path, &statbuf); | |
status_t status = client.scanFile(path, statbuf.st_mtime, statbuf.st_size, | |
false /*isDirectory*/, noMedia); | |
if (status) { | |
return MEDIA_SCAN_RESULT_ERROR; | |
} | |
} | |
return MEDIA_SCAN_RESULT_OK; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment