189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* 289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * you may not use this file except in compliance with the License. 689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * You may obtain a copy of the License at 789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * See the License for the specific language governing permissions and 1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * limitations under the License. 1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#ifndef MEDIASCANNER_H 1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define MEDIASCANNER_H 1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 20273d098cc72a88c797d01c7dff0c1350f315f05fMathias Agopian#include <utils/Log.h> 21273d098cc72a88c797d01c7dff0c1350f315f05fMathias Agopian#include <utils/threads.h> 22273d098cc72a88c797d01c7dff0c1350f315f05fMathias Agopian#include <utils/List.h> 23273d098cc72a88c797d01c7dff0c1350f315f05fMathias Agopian#include <utils/Errors.h> 2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <pthread.h> 2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 267188e55f54a43c55fd6b96454720c447f1dc454eJeff Brownstruct dirent; 277188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown 2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android { 2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass MediaScannerClient; 3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass StringArray; 3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 337188e55f54a43c55fd6b96454720c447f1dc454eJeff Brownenum MediaScanResult { 347188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown // This file or directory was scanned successfully. 357188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown MEDIA_SCAN_RESULT_OK, 367188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown // This file or directory was skipped because it was not found, could 377188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown // not be opened, was of an unsupported type, or was malfored in some way. 387188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown MEDIA_SCAN_RESULT_SKIPPED, 397188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown // The scan should be aborted due to a fatal error such as out of memory 407188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown // or an exception. 417188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown MEDIA_SCAN_RESULT_ERROR, 427188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown}; 437188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown 44413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huberstruct MediaScanner { 4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project MediaScanner(); 46413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber virtual ~MediaScanner(); 47413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber 487188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown virtual MediaScanResult processFile( 497188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown const char *path, const char *mimeType, MediaScannerClient &client) = 0; 50413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber 517188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown virtual MediaScanResult processDirectory( 527188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown const char *path, MediaScannerClient &client); 53413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber 54413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber void setLocale(const char *locale); 5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // extracts album art as a block of data 57413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber virtual char *extractAlbumArt(int fd) = 0; 58413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber 59413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huberprotected: 60413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber const char *locale() const; 6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectprivate: 6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // current locale (like "ja_JP"), created/destroyed with strdup()/free() 64413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber char *mLocale; 65fb6f03425a791dcc4188462c860becf6ca6be4eaGuang Zhu char *mSkipList; 66fb6f03425a791dcc4188462c860becf6ca6be4eaGuang Zhu int *mSkipIndex; 6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 687188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown MediaScanResult doProcessDirectory( 697188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown char *path, int pathRemaining, MediaScannerClient &client, bool noMedia); 707188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown MediaScanResult doProcessDirectoryEntry( 717188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown char *path, int pathRemaining, MediaScannerClient &client, bool noMedia, 727188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown struct dirent* entry, char* fileSpot); 73fb6f03425a791dcc4188462c860becf6ca6be4eaGuang Zhu void loadSkipList(); 74fb6f03425a791dcc4188462c860becf6ca6be4eaGuang Zhu bool shouldSkipDirectory(char *path); 75fb6f03425a791dcc4188462c860becf6ca6be4eaGuang Zhu 76413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber 77413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber MediaScanner(const MediaScanner &); 78413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber MediaScanner &operator=(const MediaScanner &); 79413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber}; 8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass MediaScannerClient 8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic: 84f482a41c86cf1c28acdd8e0f127b4a628b36535eMarco Nelissen MediaScannerClient(); 85f482a41c86cf1c28acdd8e0f127b4a628b36535eMarco Nelissen virtual ~MediaScannerClient(); 86f482a41c86cf1c28acdd8e0f127b4a628b36535eMarco Nelissen void setLocale(const char* locale); 87f482a41c86cf1c28acdd8e0f127b4a628b36535eMarco Nelissen void beginFile(); 887188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown status_t addStringTag(const char* name, const char* value); 89f482a41c86cf1c28acdd8e0f127b4a628b36535eMarco Nelissen void endFile(); 90f482a41c86cf1c28acdd8e0f127b4a628b36535eMarco Nelissen 917188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown virtual status_t scanFile(const char* path, long long lastModified, 92c5182e31b23dc381d21ef43b7f7d682ffc54bd79Mike Lockwood long long fileSize, bool isDirectory, bool noMedia) = 0; 937188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown virtual status_t handleStringTag(const char* name, const char* value) = 0; 947188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown virtual status_t setMimeType(const char* mimeType) = 0; 9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectprotected: 9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project void convertValues(uint32_t encoding); 9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectprotected: 10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // cached name and value strings, for native encoding support. 10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project StringArray* mNames; 10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project StringArray* mValues; 103413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber 10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // default encoding based on MediaScanner::mLocale string 10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t mLocaleEncoding; 10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android 10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif // MEDIASCANNER_H 111