mediascanner.h revision 544ad2be674423238c47650d2c8588ba7dfc9ed2
1/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef MEDIASCANNER_H
18#define MEDIASCANNER_H
19
20#include <utils/Log.h>
21#include <utils/threads.h>
22#include <utils/List.h>
23#include <utils/Errors.h>
24#include <utils/String8.h>
25#include <pthread.h>
26
27struct dirent;
28
29namespace android {
30
31class MediaScannerClient;
32class StringArray;
33class CharacterEncodingDetector;
34
35enum MediaScanResult {
36    // This file or directory was scanned successfully.
37    MEDIA_SCAN_RESULT_OK,
38    // This file or directory was skipped because it was not found, could
39    // not be opened, was of an unsupported type, or was malfored in some way.
40    MEDIA_SCAN_RESULT_SKIPPED,
41    // The scan should be aborted due to a fatal error such as out of memory
42    // or an exception.
43    MEDIA_SCAN_RESULT_ERROR,
44};
45
46struct MediaScanner {
47    MediaScanner();
48    virtual ~MediaScanner();
49
50    virtual MediaScanResult processFile(
51            const char *path, const char *mimeType, MediaScannerClient &client) = 0;
52
53    virtual MediaScanResult processDirectory(
54            const char *path, MediaScannerClient &client);
55
56    void setLocale(const char *locale);
57
58    // extracts album art as a block of data
59    virtual char *extractAlbumArt(int fd) = 0;
60
61protected:
62    const char *locale() const;
63
64private:
65    // current locale (like "ja_JP"), created/destroyed with strdup()/free()
66    char *mLocale;
67    char *mSkipList;
68    int *mSkipIndex;
69
70    MediaScanResult doProcessDirectory(
71            char *path, int pathRemaining, MediaScannerClient &client, bool noMedia);
72    MediaScanResult doProcessDirectoryEntry(
73            char *path, int pathRemaining, MediaScannerClient &client, bool noMedia,
74            struct dirent* entry, char* fileSpot);
75    void loadSkipList();
76    bool shouldSkipDirectory(char *path);
77
78
79    MediaScanner(const MediaScanner &);
80    MediaScanner &operator=(const MediaScanner &);
81};
82
83class MediaScannerClient
84{
85public:
86    MediaScannerClient();
87    virtual ~MediaScannerClient();
88    void setLocale(const char* locale);
89    void beginFile();
90    status_t addStringTag(const char* name, const char* value);
91    void endFile();
92
93    virtual status_t scanFile(const char* path, long long lastModified,
94            long long fileSize, bool isDirectory, bool noMedia) = 0;
95    virtual status_t handleStringTag(const char* name, const char* value) = 0;
96    virtual status_t setMimeType(const char* mimeType) = 0;
97
98protected:
99    // default encoding from MediaScanner::mLocale
100    String8 mLocale;
101    CharacterEncodingDetector *mEncodingDetector;
102};
103
104}; // namespace android
105
106#endif // MEDIASCANNER_H
107