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