12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Copyright (C) 2010 The Android Open Source Project 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License"); 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * you may not use this file except in compliance with the License. 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * You may obtain a copy of the License at 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * http://www.apache.org/licenses/LICENSE-2.0 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Unless required by applicable law or agreed to in writing, software 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS, 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * See the License for the specific language governing permissions and 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * limitations under the License. 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define LOG_TAG "MtpStorage" 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "MtpDebug.h" 200de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)#include "MtpDatabase.h" 210de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)#include "MtpStorage.h" 22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <sys/types.h> 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <sys/stat.h> 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <sys/statfs.h> 26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <unistd.h> 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <dirent.h> 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <errno.h> 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <string.h> 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <stdio.h> 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <limits.h> 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace android { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MtpStorage::MtpStorage(MtpStorageID id, const char* filePath, 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* description, uint64_t reserveSpace, 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool removable, uint64_t maxFileSize) 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : mStorageID(id), 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mFilePath(filePath), 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mDescription(description), 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mMaxCapacity(0), 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mMaxFileSize(maxFileSize), 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mReserveSpace(reserveSpace), 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mRemovable(removable) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ALOGV("MtpStorage id: %d path: %s\n", id, filePath); 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MtpStorage::~MtpStorage() { 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int MtpStorage::getType() const { 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return (mRemovable ? MTP_STORAGE_REMOVABLE_RAM : MTP_STORAGE_FIXED_RAM); 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int MtpStorage::getFileSystemType() const { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MTP_STORAGE_FILESYSTEM_HIERARCHICAL; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int MtpStorage::getAccessCapability() const { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MTP_STORAGE_READ_WRITE; 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)uint64_t MtpStorage::getMaxCapacity() { 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (mMaxCapacity == 0) { 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) struct statfs stat; 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (statfs(getPath(), &stat)) 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return -1; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mMaxCapacity = (uint64_t)stat.f_blocks * (uint64_t)stat.f_bsize; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mMaxCapacity; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint64_t MtpStorage::getFreeSpace() { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct statfs stat; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (statfs(getPath(), &stat)) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return -1; 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64_t freeSpace = (uint64_t)stat.f_bavail * (uint64_t)stat.f_bsize; 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return (freeSpace > mReserveSpace ? freeSpace - mReserveSpace : 0); 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char* MtpStorage::getDescription() const { 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (const char *)mDescription; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace android 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)