19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef MEDIASCANNER_H
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define MEDIASCANNER_H
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
203b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/Log.h>
213b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/threads.h>
223b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/List.h>
233b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/Errors.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <pthread.h>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
262c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brownstruct dirent;
272c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass MediaScannerClient;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass StringArray;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
332c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brownenum MediaScanResult {
342c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown    // This file or directory was scanned successfully.
352c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown    MEDIA_SCAN_RESULT_OK,
362c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown    // This file or directory was skipped because it was not found, could
372c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown    // not be opened, was of an unsupported type, or was malfored in some way.
382c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown    MEDIA_SCAN_RESULT_SKIPPED,
392c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown    // The scan should be aborted due to a fatal error such as out of memory
402c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown    // or an exception.
412c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown    MEDIA_SCAN_RESULT_ERROR,
422c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown};
432c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown
44bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huberstruct MediaScanner {
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    MediaScanner();
46bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber    virtual ~MediaScanner();
47bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber
482c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown    virtual MediaScanResult processFile(
492c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown            const char *path, const char *mimeType, MediaScannerClient &client) = 0;
50bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber
512c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown    virtual MediaScanResult processDirectory(
522c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown            const char *path, MediaScannerClient &client);
53bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber
54bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber    void setLocale(const char *locale);
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // extracts album art as a block of data
57bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber    virtual char *extractAlbumArt(int fd) = 0;
58bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber
59bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huberprotected:
60bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber    const char *locale() const;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // current locale (like "ja_JP"), created/destroyed with strdup()/free()
64bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber    char *mLocale;
65973f553be4aabf9656d6c1596b47767896677b0aGuang Zhu    char *mSkipList;
66973f553be4aabf9656d6c1596b47767896677b0aGuang Zhu    int *mSkipIndex;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
682c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown    MediaScanResult doProcessDirectory(
692c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown            char *path, int pathRemaining, MediaScannerClient &client, bool noMedia);
702c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown    MediaScanResult doProcessDirectoryEntry(
712c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown            char *path, int pathRemaining, MediaScannerClient &client, bool noMedia,
722c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown            struct dirent* entry, char* fileSpot);
73973f553be4aabf9656d6c1596b47767896677b0aGuang Zhu    void loadSkipList();
74973f553be4aabf9656d6c1596b47767896677b0aGuang Zhu    bool shouldSkipDirectory(char *path);
75973f553be4aabf9656d6c1596b47767896677b0aGuang Zhu
76bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber
77bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber    MediaScanner(const MediaScanner &);
78bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber    MediaScanner &operator=(const MediaScanner &);
79bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber};
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass MediaScannerClient
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
848b0466170082fdf12f78d7b70358002520e99e9bMarco Nelissen    MediaScannerClient();
858b0466170082fdf12f78d7b70358002520e99e9bMarco Nelissen    virtual ~MediaScannerClient();
868b0466170082fdf12f78d7b70358002520e99e9bMarco Nelissen    void setLocale(const char* locale);
878b0466170082fdf12f78d7b70358002520e99e9bMarco Nelissen    void beginFile();
882c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown    status_t addStringTag(const char* name, const char* value);
898b0466170082fdf12f78d7b70358002520e99e9bMarco Nelissen    void endFile();
908b0466170082fdf12f78d7b70358002520e99e9bMarco Nelissen
912c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown    virtual status_t scanFile(const char* path, long long lastModified,
92997354e4b4a9666cedd62282471e97822affced9Mike Lockwood            long long fileSize, bool isDirectory, bool noMedia) = 0;
932c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown    virtual status_t handleStringTag(const char* name, const char* value) = 0;
942c70d4a372a8ce83163f19bbd6ae82483ffbe46bJeff Brown    virtual status_t setMimeType(const char* mimeType) = 0;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected:
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void convertValues(uint32_t encoding);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected:
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // cached name and value strings, for native encoding support.
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    StringArray*    mNames;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    StringArray*    mValues;
103bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // default encoding based on MediaScanner::mLocale string
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t        mLocaleEncoding;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // MEDIASCANNER_H
111