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)