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> 24544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen#include <utils/String8.h> 2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <pthread.h> 2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 277188e55f54a43c55fd6b96454720c447f1dc454eJeff Brownstruct dirent; 287188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown 2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android { 3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass MediaScannerClient; 3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass StringArray; 33544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissenclass CharacterEncodingDetector; 3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 357188e55f54a43c55fd6b96454720c447f1dc454eJeff Brownenum MediaScanResult { 367188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown // This file or directory was scanned successfully. 377188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown MEDIA_SCAN_RESULT_OK, 387188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown // This file or directory was skipped because it was not found, could 397188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown // not be opened, was of an unsupported type, or was malfored in some way. 407188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown MEDIA_SCAN_RESULT_SKIPPED, 417188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown // The scan should be aborted due to a fatal error such as out of memory 427188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown // or an exception. 437188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown MEDIA_SCAN_RESULT_ERROR, 447188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown}; 457188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown 46f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughesstruct MediaAlbumArt { 47f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughespublic: 48f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes static MediaAlbumArt *fromData(int32_t size, const void* data); 49f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes 50f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes static void init(MediaAlbumArt* instance, int32_t size, const void* data); 51f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes 52f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes MediaAlbumArt *clone(); 53f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes 54f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes const char *data() { 55f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes return &mData[0]; 56f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes } 57f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes 58f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes int32_t size() { 59f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes return mSize; 60f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes } 61f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes 62f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughesprivate: 63f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes int32_t mSize; 644177a19769d43980bdb803bce33f9cacc1e4e1f8Elliott Hughes char mData[]; 65f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes 66f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes // You can't construct instances of this class directly because this is a 67f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes // variable-sized object passed through the binder. 68f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes MediaAlbumArt(); 69f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes} __packed; 70f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes 71413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huberstruct MediaScanner { 7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project MediaScanner(); 73413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber virtual ~MediaScanner(); 74413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber 757188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown virtual MediaScanResult processFile( 767188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown const char *path, const char *mimeType, MediaScannerClient &client) = 0; 77413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber 787188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown virtual MediaScanResult processDirectory( 797188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown const char *path, MediaScannerClient &client); 80413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber 81413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber void setLocale(const char *locale); 8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 83f3e80dddd7376aa9deeb27de25e1d50030a2ad98Elliott Hughes virtual MediaAlbumArt *extractAlbumArt(int fd) = 0; 84413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber 85413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huberprotected: 86413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber const char *locale() const; 8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectprivate: 8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // current locale (like "ja_JP"), created/destroyed with strdup()/free() 90413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber char *mLocale; 91fb6f03425a791dcc4188462c860becf6ca6be4eaGuang Zhu char *mSkipList; 92fb6f03425a791dcc4188462c860becf6ca6be4eaGuang Zhu int *mSkipIndex; 9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 947188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown MediaScanResult doProcessDirectory( 957188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown char *path, int pathRemaining, MediaScannerClient &client, bool noMedia); 967188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown MediaScanResult doProcessDirectoryEntry( 977188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown char *path, int pathRemaining, MediaScannerClient &client, bool noMedia, 987188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown struct dirent* entry, char* fileSpot); 99fb6f03425a791dcc4188462c860becf6ca6be4eaGuang Zhu void loadSkipList(); 100fb6f03425a791dcc4188462c860becf6ca6be4eaGuang Zhu bool shouldSkipDirectory(char *path); 101fb6f03425a791dcc4188462c860becf6ca6be4eaGuang Zhu 102413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber 103413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber MediaScanner(const MediaScanner &); 104413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber MediaScanner &operator=(const MediaScanner &); 105413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber}; 10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass MediaScannerClient 10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic: 110f482a41c86cf1c28acdd8e0f127b4a628b36535eMarco Nelissen MediaScannerClient(); 111f482a41c86cf1c28acdd8e0f127b4a628b36535eMarco Nelissen virtual ~MediaScannerClient(); 112f482a41c86cf1c28acdd8e0f127b4a628b36535eMarco Nelissen void setLocale(const char* locale); 113f482a41c86cf1c28acdd8e0f127b4a628b36535eMarco Nelissen void beginFile(); 1147188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown status_t addStringTag(const char* name, const char* value); 115f482a41c86cf1c28acdd8e0f127b4a628b36535eMarco Nelissen void endFile(); 116f482a41c86cf1c28acdd8e0f127b4a628b36535eMarco Nelissen 1177188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown virtual status_t scanFile(const char* path, long long lastModified, 118c5182e31b23dc381d21ef43b7f7d682ffc54bd79Mike Lockwood long long fileSize, bool isDirectory, bool noMedia) = 0; 1197188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown virtual status_t handleStringTag(const char* name, const char* value) = 0; 1207188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown virtual status_t setMimeType(const char* mimeType) = 0; 12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectprotected: 123544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen // default encoding from MediaScanner::mLocale 124544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen String8 mLocale; 12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android 12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif // MEDIASCANNER_H 130