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