/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#define LOG_TAG "MtpStorageInfo"

#include <inttypes.h>

#include "MtpDebug.h"
#include "MtpDataPacket.h"
#include "MtpStorageInfo.h"
#include "MtpStringBuffer.h"

namespace android {

MtpStorageInfo::MtpStorageInfo(MtpStorageID id)
    :   mStorageID(id),
        mStorageType(0),
        mFileSystemType(0),
        mAccessCapability(0),
        mMaxCapacity(0),
        mFreeSpaceBytes(0),
        mFreeSpaceObjects(0),
        mStorageDescription(NULL),
        mVolumeIdentifier(NULL)
{
}

MtpStorageInfo::~MtpStorageInfo() {
    if (mStorageDescription)
        free(mStorageDescription);
    if (mVolumeIdentifier)
        free(mVolumeIdentifier);
}

bool MtpStorageInfo::read(MtpDataPacket& packet) {
    MtpStringBuffer string;

    // read the device info
    if (!packet.getUInt16(mStorageType)) return false;
    if (!packet.getUInt16(mFileSystemType)) return false;
    if (!packet.getUInt16(mAccessCapability)) return false;
    if (!packet.getUInt64(mMaxCapacity)) return false;
    if (!packet.getUInt64(mFreeSpaceBytes)) return false;
    if (!packet.getUInt32(mFreeSpaceObjects)) return false;

    if (!packet.getString(string)) return false;
    mStorageDescription = strdup((const char *)string);
    if (!mStorageDescription) return false;
    if (!packet.getString(string)) return false;
    mVolumeIdentifier = strdup((const char *)string);
    if (!mVolumeIdentifier) return false;

    return true;
}

void MtpStorageInfo::print() {
    ALOGD("Storage Info %08X:\n\tmStorageType: %d\n\tmFileSystemType: %d\n\tmAccessCapability: %d\n",
            mStorageID, mStorageType, mFileSystemType, mAccessCapability);
    ALOGD("\tmMaxCapacity: %" PRIu64 "\n\tmFreeSpaceBytes: %" PRIu64 "\n\tmFreeSpaceObjects: %d\n",
            mMaxCapacity, mFreeSpaceBytes, mFreeSpaceObjects);
    ALOGD("\tmStorageDescription: %s\n\tmVolumeIdentifier: %s\n",
            mStorageDescription, mVolumeIdentifier);
}

}  // namespace android
