116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood/*
216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * Copyright (C) 2010 The Android Open Source Project
316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood *
416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License");
516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * you may not use this file except in compliance with the License.
616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * You may obtain a copy of the License at
716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood *
816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood *      http://www.apache.org/licenses/LICENSE-2.0
916864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood *
1016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * Unless required by applicable law or agreed to in writing, software
1116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS,
1216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * See the License for the specific language governing permissions and
1416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * limitations under the License.
1516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood */
1616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood
17b14e588bec4d5e39e61b020b5b575f2ce555d316Mike Lockwood#define LOG_TAG "MtpStorage"
18b14e588bec4d5e39e61b020b5b575f2ce555d316Mike Lockwood
19b14e588bec4d5e39e61b020b5b575f2ce555d316Mike Lockwood#include "MtpDebug.h"
2016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include "MtpDatabase.h"
2116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include "MtpStorage.h"
2216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood
2316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include <sys/types.h>
2416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include <sys/stat.h>
2516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include <sys/statfs.h>
2616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include <unistd.h>
2716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include <dirent.h>
2816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include <errno.h>
2916864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include <string.h>
3016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include <stdio.h>
3116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include <limits.h>
3216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood
337850ef999740f214a1990a9c090d3f3865d435aaMike Lockwoodnamespace android {
3416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood
350241cacb85dbac20b28036bbb8025dfd513e3753Mike LockwoodMtpStorage::MtpStorage(MtpStorageID id, const char* filePath,
369b88b72ee2c3fd01fb46e77b7e6d80f3bd52e958Mike Lockwood        const char* description, uint64_t reserveSpace,
379b88b72ee2c3fd01fb46e77b7e6d80f3bd52e958Mike Lockwood        bool removable, uint64_t maxFileSize)
3816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood    :   mStorageID(id),
3916864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood        mFilePath(filePath),
400241cacb85dbac20b28036bbb8025dfd513e3753Mike Lockwood        mDescription(description),
4120c3be0e0394e1340c036685eb1edb8f6ef5a2acMike Lockwood        mMaxCapacity(0),
429b88b72ee2c3fd01fb46e77b7e6d80f3bd52e958Mike Lockwood        mMaxFileSize(maxFileSize),
437efab4282a7179b2f53a3dbccee3e70d7fce6a7fMike Lockwood        mReserveSpace(reserveSpace),
447efab4282a7179b2f53a3dbccee3e70d7fce6a7fMike Lockwood        mRemovable(removable)
4516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood{
463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("MtpStorage id: %d path: %s\n", id, filePath);
4716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood}
4816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood
4916864bae0f51c32c456da2c43adf7a057c0c4882Mike LockwoodMtpStorage::~MtpStorage() {
5016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood}
5116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood
5216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwoodint MtpStorage::getType() const {
537efab4282a7179b2f53a3dbccee3e70d7fce6a7fMike Lockwood    return (mRemovable ? MTP_STORAGE_REMOVABLE_RAM :  MTP_STORAGE_FIXED_RAM);
5416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood}
5516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood
5616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwoodint MtpStorage::getFileSystemType() const {
5716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood    return MTP_STORAGE_FILESYSTEM_HIERARCHICAL;
5816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood}
5916864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood
6016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwoodint MtpStorage::getAccessCapability() const {
6116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood    return MTP_STORAGE_READ_WRITE;
6216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood}
6316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood
6416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwooduint64_t MtpStorage::getMaxCapacity() {
6516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood    if (mMaxCapacity == 0) {
6616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood        struct statfs   stat;
67a849440ca96e93f700d62c6e41d48905b4d405b6Mike Lockwood        if (statfs(getPath(), &stat))
6816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood            return -1;
6916864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood        mMaxCapacity = (uint64_t)stat.f_blocks * (uint64_t)stat.f_bsize;
7016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood    }
7116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood    return mMaxCapacity;
7216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood}
7316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood
7416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwooduint64_t MtpStorage::getFreeSpace() {
7516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood    struct statfs   stat;
76a849440ca96e93f700d62c6e41d48905b4d405b6Mike Lockwood    if (statfs(getPath(), &stat))
7716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood        return -1;
7820c3be0e0394e1340c036685eb1edb8f6ef5a2acMike Lockwood    uint64_t freeSpace = (uint64_t)stat.f_bavail * (uint64_t)stat.f_bsize;
7920c3be0e0394e1340c036685eb1edb8f6ef5a2acMike Lockwood    return (freeSpace > mReserveSpace ? freeSpace - mReserveSpace : 0);
8016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood}
8116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood
8216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwoodconst char* MtpStorage::getDescription() const {
830241cacb85dbac20b28036bbb8025dfd513e3753Mike Lockwood    return (const char *)mDescription;
8416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood}
8516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood
867850ef999740f214a1990a9c090d3f3865d435aaMike Lockwood}  // namespace android
87