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