VolumeManager.cpp revision f1b736bc5605e92e917ab27f5abf3ba839be2270
1f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat/* 2f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * Copyright (C) 2008 The Android Open Source Project 3f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * 4f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * Licensed under the Apache License, Version 2.0 (the "License"); 5f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * you may not use this file except in compliance with the License. 6f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * You may obtain a copy of the License at 7f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * 8f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * http://www.apache.org/licenses/LICENSE-2.0 9f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * 10f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * Unless required by applicable law or agreed to in writing, software 11f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * distributed under the License is distributed on an "AS IS" BASIS, 12f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * See the License for the specific language governing permissions and 14f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * limitations under the License. 15f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat */ 16f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 17f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <stdio.h> 18f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <errno.h> 19f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 20f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#define LOG_TAG "Vold" 21f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 22f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <cutils/log.h> 23f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 24f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include "VolumeManager.h" 25f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include "DeviceVolume.h" 26f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include "ErrorCode.h" 27f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 28f1b736bc5605e92e917ab27f5abf3ba839be2270San MehatVolumeManager *VolumeManager::sInstance = NULL; 29f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 30f1b736bc5605e92e917ab27f5abf3ba839be2270San MehatVolumeManager *VolumeManager::Instance() { 31f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat if (!sInstance) 32f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat sInstance = new VolumeManager(); 33f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return sInstance; 34f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 35f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 36f1b736bc5605e92e917ab27f5abf3ba839be2270San MehatVolumeManager::VolumeManager() { 37f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat mBlockDevices = new BlockDeviceCollection(); 38f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat mVolumes = new VolumeCollection(); 39f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat mBroadcaster = NULL; 40f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 41f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 42f1b736bc5605e92e917ab27f5abf3ba839be2270San MehatVolumeManager::~VolumeManager() { 43f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat delete mBlockDevices; 44f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 45f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 46f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatint VolumeManager::start() { 47f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 48f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 49f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 50f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatint VolumeManager::stop() { 51f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 52f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 53f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 54f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatint VolumeManager::addVolume(Volume *v) { 55f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat mVolumes->push_back(v); 56f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 57f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 58f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 59f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatvoid VolumeManager::handleDiskInserted(const char *devpath, int maj, int min, 60f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat int nr_parts) { 61f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 62f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat /* Lookup possible candidate DeviceVolumes */ 63f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat VolumeCollection::iterator it; 64f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat bool hit = false; 65f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat for (it = mVolumes->begin(); it != mVolumes->end(); ++it) { 66f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat if (!(*it)->handleDiskInsertion(devpath, maj, min, nr_parts)) { 67f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat hit = true; 68f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat LOGD("Volume '%s' has handled disk insertion for '%s'", 69f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat (*it)->getLabel(), devpath); 70f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat break; 71f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat } 72f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat } 73f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 74f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat if (!hit) { 75f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat LOGW("No volumes handled insertion of disk '%s'", devpath); 76f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat } 77f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 78f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 79f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatvoid VolumeManager::handleDiskRemoved(int maj, int min) { 80f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 81f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 82f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatvoid VolumeManager::handlePartCreated(const char *devpath, int maj, int min, 83f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat int part_no) { 84f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 85f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 86f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatvoid VolumeManager::handlePartRemoved(int maj, int min) { 87f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 88f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 89f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 90f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatint VolumeManager::listVolumes(SocketClient *cli) { 91f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat VolumeCollection::iterator i; 92f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 93f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat for (i = mVolumes->begin(); i != mVolumes->end(); ++i) { 94f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat char *buffer; 95f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat asprintf(&buffer, "%s %s %d", 96f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat (*i)->getLabel(), (*i)->getMountpoint(), 97f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat (*i)->getState()); 98f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat cli->sendMsg(ErrorCode::VolumeListResult, buffer, false); 99f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat free(buffer); 100f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat } 101f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat cli->sendMsg(ErrorCode::CommandOkay, "Volumes Listed", false); 102f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 103f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 104