• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <pthread.h>
25 
26 struct dirent;
27 
28 namespace android {
29 
30 class MediaScannerClient;
31 class StringArray;
32 
33 enum MediaScanResult {
34     // This file or directory was scanned successfully.
35     MEDIA_SCAN_RESULT_OK,
36     // This file or directory was skipped because it was not found, could
37     // not be opened, was of an unsupported type, or was malfored in some way.
38     MEDIA_SCAN_RESULT_SKIPPED,
39     // The scan should be aborted due to a fatal error such as out of memory
40     // or an exception.
41     MEDIA_SCAN_RESULT_ERROR,
42 };
43 
44 struct MediaScanner {
45     MediaScanner();
46     virtual ~MediaScanner();
47 
48     virtual MediaScanResult processFile(
49             const char *path, const char *mimeType, MediaScannerClient &client) = 0;
50 
51     virtual MediaScanResult processDirectory(
52             const char *path, MediaScannerClient &client);
53 
54     void setLocale(const char *locale);
55 
56     // extracts album art as a block of data
57     virtual char *extractAlbumArt(int fd) = 0;
58 
59 protected:
60     const char *locale() const;
61 
62 private:
63     // current locale (like "ja_JP"), created/destroyed with strdup()/free()
64     char *mLocale;
65     char *mSkipList;
66     int *mSkipIndex;
67 
68     MediaScanResult doProcessDirectory(
69             char *path, int pathRemaining, MediaScannerClient &client, bool noMedia);
70     MediaScanResult doProcessDirectoryEntry(
71             char *path, int pathRemaining, MediaScannerClient &client, bool noMedia,
72             struct dirent* entry, char* fileSpot);
73     void loadSkipList();
74     bool shouldSkipDirectory(char *path);
75 
76 
77     MediaScanner(const MediaScanner &);
78     MediaScanner &operator=(const MediaScanner &);
79 };
80 
81 class MediaScannerClient
82 {
83 public:
84     MediaScannerClient();
85     virtual ~MediaScannerClient();
86     void setLocale(const char* locale);
87     void beginFile();
88     status_t addStringTag(const char* name, const char* value);
89     void endFile();
90 
91     virtual status_t scanFile(const char* path, long long lastModified,
92             long long fileSize, bool isDirectory, bool noMedia) = 0;
93     virtual status_t handleStringTag(const char* name, const char* value) = 0;
94     virtual status_t setMimeType(const char* mimeType) = 0;
95 
96 protected:
97     void convertValues(uint32_t encoding);
98 
99 protected:
100     // cached name and value strings, for native encoding support.
101     StringArray*    mNames;
102     StringArray*    mValues;
103 
104     // default encoding based on MediaScanner::mLocale string
105     uint32_t        mLocaleEncoding;
106 };
107 
108 }; // namespace android
109 
110 #endif // MEDIASCANNER_H
111