Merge changes I8a257579,I82d16312 into gingerbread
* changes: Add AStorageManager API to NDK Reorganize MountService IPC
This commit is contained in:
@@ -118,10 +118,6 @@ LOCAL_SRC_FILES += \
|
|||||||
core/java/android/net/IThrottleManager.aidl \
|
core/java/android/net/IThrottleManager.aidl \
|
||||||
core/java/android/os/IHardwareService.aidl \
|
core/java/android/os/IHardwareService.aidl \
|
||||||
core/java/android/os/IMessenger.aidl \
|
core/java/android/os/IMessenger.aidl \
|
||||||
core/java/android/os/storage/IMountService.aidl \
|
|
||||||
core/java/android/os/storage/IMountServiceListener.aidl \
|
|
||||||
core/java/android/os/storage/IMountShutdownObserver.aidl \
|
|
||||||
core/java/android/os/storage/IObbActionListener.aidl \
|
|
||||||
core/java/android/os/INetworkManagementService.aidl \
|
core/java/android/os/INetworkManagementService.aidl \
|
||||||
core/java/android/os/INetStatService.aidl \
|
core/java/android/os/INetStatService.aidl \
|
||||||
core/java/android/os/IPermissionController.aidl \
|
core/java/android/os/IPermissionController.aidl \
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libequalizerte
|
|||||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libreverb_intermediates)
|
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libreverb_intermediates)
|
||||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libreverbtest_intermediates)
|
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libreverbtest_intermediates)
|
||||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/soundfx/)
|
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/soundfx/)
|
||||||
|
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/os/storage/*)
|
||||||
|
|
||||||
# ************************************************
|
# ************************************************
|
||||||
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
|
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
|
||||||
|
|||||||
@@ -1,184 +0,0 @@
|
|||||||
/* //device/java/android/android/os/IUsb.aidl
|
|
||||||
**
|
|
||||||
** Copyright 2007, 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package android.os.storage;
|
|
||||||
|
|
||||||
import android.os.storage.IMountServiceListener;
|
|
||||||
import android.os.storage.IMountShutdownObserver;
|
|
||||||
import android.os.storage.IObbActionListener;
|
|
||||||
|
|
||||||
/** WARNING! Update IMountService.h and IMountService.cpp if you change this file.
|
|
||||||
* In particular, the ordering of the methods below must match the
|
|
||||||
* _TRANSACTION enum in IMountService.cpp
|
|
||||||
* @hide - Applications should use android.os.storage.StorageManager to access
|
|
||||||
* storage functions.
|
|
||||||
*/
|
|
||||||
interface IMountService
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Registers an IMountServiceListener for receiving async
|
|
||||||
* notifications.
|
|
||||||
*/
|
|
||||||
void registerListener(IMountServiceListener listener);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Unregisters an IMountServiceListener
|
|
||||||
*/
|
|
||||||
void unregisterListener(IMountServiceListener listener);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if a USB mass storage host is connected
|
|
||||||
*/
|
|
||||||
boolean isUsbMassStorageConnected();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enables / disables USB mass storage.
|
|
||||||
* The caller should check actual status of enabling/disabling
|
|
||||||
* USB mass storage via StorageEventListener.
|
|
||||||
*/
|
|
||||||
void setUsbMassStorageEnabled(boolean enable);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if a USB mass storage host is enabled (media is shared)
|
|
||||||
*/
|
|
||||||
boolean isUsbMassStorageEnabled();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Mount external storage at given mount point.
|
|
||||||
* Returns an int consistent with MountServiceResultCode
|
|
||||||
*/
|
|
||||||
int mountVolume(String mountPoint);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Safely unmount external storage at given mount point.
|
|
||||||
* The unmount is an asynchronous operation. Applications
|
|
||||||
* should register StorageEventListener for storage related
|
|
||||||
* status changes.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void unmountVolume(String mountPoint, boolean force);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Format external storage given a mount point.
|
|
||||||
* Returns an int consistent with MountServiceResultCode
|
|
||||||
*/
|
|
||||||
int formatVolume(String mountPoint);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns an array of pids with open files on
|
|
||||||
* the specified path.
|
|
||||||
*/
|
|
||||||
int[] getStorageUsers(String path);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the state of a volume via its mountpoint.
|
|
||||||
*/
|
|
||||||
String getVolumeState(String mountPoint);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Creates a secure container with the specified parameters.
|
|
||||||
* Returns an int consistent with MountServiceResultCode
|
|
||||||
*/
|
|
||||||
int createSecureContainer(String id, int sizeMb, String fstype, String key, int ownerUid);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Finalize a container which has just been created and populated.
|
|
||||||
* After finalization, the container is immutable.
|
|
||||||
* Returns an int consistent with MountServiceResultCode
|
|
||||||
*/
|
|
||||||
int finalizeSecureContainer(String id);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Destroy a secure container, and free up all resources associated with it.
|
|
||||||
* NOTE: Ensure all references are released prior to deleting.
|
|
||||||
* Returns an int consistent with MountServiceResultCode
|
|
||||||
*/
|
|
||||||
int destroySecureContainer(String id, boolean force);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Mount a secure container with the specified key and owner UID.
|
|
||||||
* Returns an int consistent with MountServiceResultCode
|
|
||||||
*/
|
|
||||||
int mountSecureContainer(String id, String key, int ownerUid);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Unount a secure container.
|
|
||||||
* Returns an int consistent with MountServiceResultCode
|
|
||||||
*/
|
|
||||||
int unmountSecureContainer(String id, boolean force);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Returns true if the specified container is mounted
|
|
||||||
*/
|
|
||||||
boolean isSecureContainerMounted(String id);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Rename an unmounted secure container.
|
|
||||||
* Returns an int consistent with MountServiceResultCode
|
|
||||||
*/
|
|
||||||
int renameSecureContainer(String oldId, String newId);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Returns the filesystem path of a mounted secure container.
|
|
||||||
*/
|
|
||||||
String getSecureContainerPath(String id);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets an Array of currently known secure container IDs
|
|
||||||
*/
|
|
||||||
String[] getSecureContainerList();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Shuts down the MountService and gracefully unmounts all external media.
|
|
||||||
* Invokes call back once the shutdown is complete.
|
|
||||||
*/
|
|
||||||
void shutdown(IMountShutdownObserver observer);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Call into MountService by PackageManager to notify that its done
|
|
||||||
* processing the media status update request.
|
|
||||||
*/
|
|
||||||
void finishMediaUpdate();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Mounts an Opaque Binary Blob (OBB) with the specified decryption key and only
|
|
||||||
* allows the calling process's UID access to the contents.
|
|
||||||
*
|
|
||||||
* MountService will call back to the supplied IObbActionListener to inform
|
|
||||||
* it of the terminal state of the call.
|
|
||||||
*/
|
|
||||||
void mountObb(String filename, String key, IObbActionListener token);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Unmounts an Opaque Binary Blob (OBB). When the force flag is specified, any
|
|
||||||
* program using it will be forcibly killed to unmount the image.
|
|
||||||
*
|
|
||||||
* MountService will call back to the supplied IObbActionListener to inform
|
|
||||||
* it of the terminal state of the call.
|
|
||||||
*/
|
|
||||||
void unmountObb(String filename, boolean force, IObbActionListener token);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks whether the specified Opaque Binary Blob (OBB) is mounted somewhere.
|
|
||||||
*/
|
|
||||||
boolean isObbMounted(String filename);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the path to the mounted Opaque Binary Blob (OBB).
|
|
||||||
*/
|
|
||||||
String getMountedObbPath(String filename);
|
|
||||||
}
|
|
||||||
1046
core/java/android/os/storage/IMountService.java
Normal file
1046
core/java/android/os/storage/IMountService.java
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,43 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2009 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package android.os.storage;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Callback class for receiving events from MountService.
|
|
||||||
*
|
|
||||||
* @hide - Applications should use android.os.storage.IStorageEventListener
|
|
||||||
* for storage event callbacks.
|
|
||||||
*/
|
|
||||||
interface IMountServiceListener {
|
|
||||||
/**
|
|
||||||
* Detection state of USB Mass Storage has changed
|
|
||||||
*
|
|
||||||
* @param available true if a UMS host is connected.
|
|
||||||
*/
|
|
||||||
void onUsbMassStorageConnectionChanged(boolean connected);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Storage state has changed.
|
|
||||||
*
|
|
||||||
* @param path The volume mount path.
|
|
||||||
* @param oldState The old state of the volume.
|
|
||||||
* @param newState The new state of the volume.
|
|
||||||
*
|
|
||||||
* Note: State is one of the values returned by Environment.getExternalStorageState()
|
|
||||||
*/
|
|
||||||
void onStorageStateChanged(String path, String oldState, String newState);
|
|
||||||
}
|
|
||||||
176
core/java/android/os/storage/IMountServiceListener.java
Normal file
176
core/java/android/os/storage/IMountServiceListener.java
Normal file
@@ -0,0 +1,176 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2009 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package android.os.storage;
|
||||||
|
|
||||||
|
import android.os.Binder;
|
||||||
|
import android.os.IBinder;
|
||||||
|
import android.os.IInterface;
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.RemoteException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback class for receiving events from MountService.
|
||||||
|
*
|
||||||
|
* @hide - Applications should use IStorageEventListener for storage event
|
||||||
|
* callbacks.
|
||||||
|
*/
|
||||||
|
public interface IMountServiceListener extends IInterface {
|
||||||
|
/** Local-side IPC implementation stub class. */
|
||||||
|
public static abstract class Stub extends Binder implements IMountServiceListener {
|
||||||
|
private static final String DESCRIPTOR = "IMountServiceListener";
|
||||||
|
|
||||||
|
/** Construct the stub at attach it to the interface. */
|
||||||
|
public Stub() {
|
||||||
|
this.attachInterface(this, DESCRIPTOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cast an IBinder object into an IMountServiceListener interface,
|
||||||
|
* generating a proxy if needed.
|
||||||
|
*/
|
||||||
|
public static IMountServiceListener asInterface(IBinder obj) {
|
||||||
|
if ((obj == null)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
IInterface iin = (IInterface) obj.queryLocalInterface(DESCRIPTOR);
|
||||||
|
if (((iin != null) && (iin instanceof IMountServiceListener))) {
|
||||||
|
return ((IMountServiceListener) iin);
|
||||||
|
}
|
||||||
|
return new IMountServiceListener.Stub.Proxy(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IBinder asBinder() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
|
||||||
|
throws RemoteException {
|
||||||
|
switch (code) {
|
||||||
|
case INTERFACE_TRANSACTION: {
|
||||||
|
reply.writeString(DESCRIPTOR);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
case TRANSACTION_onUsbMassStorageConnectionChanged: {
|
||||||
|
data.enforceInterface(DESCRIPTOR);
|
||||||
|
boolean connected;
|
||||||
|
connected = (0 != data.readInt());
|
||||||
|
this.onUsbMassStorageConnectionChanged(connected);
|
||||||
|
reply.writeNoException();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
case TRANSACTION_onStorageStateChanged: {
|
||||||
|
data.enforceInterface(DESCRIPTOR);
|
||||||
|
String path;
|
||||||
|
path = data.readString();
|
||||||
|
String oldState;
|
||||||
|
oldState = data.readString();
|
||||||
|
String newState;
|
||||||
|
newState = data.readString();
|
||||||
|
this.onStorageStateChanged(path, oldState, newState);
|
||||||
|
reply.writeNoException();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super.onTransact(code, data, reply, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class Proxy implements IMountServiceListener {
|
||||||
|
private IBinder mRemote;
|
||||||
|
|
||||||
|
Proxy(IBinder remote) {
|
||||||
|
mRemote = remote;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IBinder asBinder() {
|
||||||
|
return mRemote;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getInterfaceDescriptor() {
|
||||||
|
return DESCRIPTOR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detection state of USB Mass Storage has changed
|
||||||
|
*
|
||||||
|
* @param available true if a UMS host is connected.
|
||||||
|
*/
|
||||||
|
public void onUsbMassStorageConnectionChanged(boolean connected) throws RemoteException {
|
||||||
|
Parcel _data = Parcel.obtain();
|
||||||
|
Parcel _reply = Parcel.obtain();
|
||||||
|
try {
|
||||||
|
_data.writeInterfaceToken(DESCRIPTOR);
|
||||||
|
_data.writeInt(((connected) ? (1) : (0)));
|
||||||
|
mRemote.transact(Stub.TRANSACTION_onUsbMassStorageConnectionChanged, _data,
|
||||||
|
_reply, 0);
|
||||||
|
_reply.readException();
|
||||||
|
} finally {
|
||||||
|
_reply.recycle();
|
||||||
|
_data.recycle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Storage state has changed.
|
||||||
|
*
|
||||||
|
* @param path The volume mount path.
|
||||||
|
* @param oldState The old state of the volume.
|
||||||
|
* @param newState The new state of the volume. Note: State is one
|
||||||
|
* of the values returned by
|
||||||
|
* Environment.getExternalStorageState()
|
||||||
|
*/
|
||||||
|
public void onStorageStateChanged(String path, String oldState, String newState)
|
||||||
|
throws RemoteException {
|
||||||
|
Parcel _data = Parcel.obtain();
|
||||||
|
Parcel _reply = Parcel.obtain();
|
||||||
|
try {
|
||||||
|
_data.writeInterfaceToken(DESCRIPTOR);
|
||||||
|
_data.writeString(path);
|
||||||
|
_data.writeString(oldState);
|
||||||
|
_data.writeString(newState);
|
||||||
|
mRemote.transact(Stub.TRANSACTION_onStorageStateChanged, _data, _reply, 0);
|
||||||
|
_reply.readException();
|
||||||
|
} finally {
|
||||||
|
_reply.recycle();
|
||||||
|
_data.recycle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static final int TRANSACTION_onUsbMassStorageConnectionChanged = (IBinder.FIRST_CALL_TRANSACTION + 0);
|
||||||
|
|
||||||
|
static final int TRANSACTION_onStorageStateChanged = (IBinder.FIRST_CALL_TRANSACTION + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detection state of USB Mass Storage has changed
|
||||||
|
*
|
||||||
|
* @param available true if a UMS host is connected.
|
||||||
|
*/
|
||||||
|
public void onUsbMassStorageConnectionChanged(boolean connected) throws RemoteException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Storage state has changed.
|
||||||
|
*
|
||||||
|
* @param path The volume mount path.
|
||||||
|
* @param oldState The old state of the volume.
|
||||||
|
* @param newState The new state of the volume. Note: State is one of the
|
||||||
|
* values returned by Environment.getExternalStorageState()
|
||||||
|
*/
|
||||||
|
public void onStorageStateChanged(String path, String oldState, String newState)
|
||||||
|
throws RemoteException;
|
||||||
|
}
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2009 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package android.os.storage;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Callback class for receiving events related
|
|
||||||
* to shutdown.
|
|
||||||
*
|
|
||||||
* @hide - For internal consumption only.
|
|
||||||
*/
|
|
||||||
interface IMountShutdownObserver {
|
|
||||||
/**
|
|
||||||
* This method is called when the shutdown
|
|
||||||
* of MountService completed.
|
|
||||||
* @param statusCode indicates success or failure
|
|
||||||
* of the shutdown.
|
|
||||||
*/
|
|
||||||
void onShutDownComplete(int statusCode);
|
|
||||||
}
|
|
||||||
124
core/java/android/os/storage/IMountShutdownObserver.java
Normal file
124
core/java/android/os/storage/IMountShutdownObserver.java
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2009 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package android.os.storage;
|
||||||
|
|
||||||
|
import android.os.Binder;
|
||||||
|
import android.os.IBinder;
|
||||||
|
import android.os.IInterface;
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.RemoteException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback class for receiving events related to shutdown.
|
||||||
|
*
|
||||||
|
* @hide - For internal consumption only.
|
||||||
|
*/
|
||||||
|
public interface IMountShutdownObserver extends IInterface {
|
||||||
|
/** Local-side IPC implementation stub class. */
|
||||||
|
public static abstract class Stub extends Binder implements IMountShutdownObserver {
|
||||||
|
private static final java.lang.String DESCRIPTOR = "IMountShutdownObserver";
|
||||||
|
|
||||||
|
/** Construct the stub at attach it to the interface. */
|
||||||
|
public Stub() {
|
||||||
|
this.attachInterface(this, DESCRIPTOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cast an IBinder object into an IMountShutdownObserver interface,
|
||||||
|
* generating a proxy if needed.
|
||||||
|
*/
|
||||||
|
public static IMountShutdownObserver asInterface(IBinder obj) {
|
||||||
|
if ((obj == null)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
IInterface iin = (IInterface) obj.queryLocalInterface(DESCRIPTOR);
|
||||||
|
if (((iin != null) && (iin instanceof IMountShutdownObserver))) {
|
||||||
|
return ((IMountShutdownObserver) iin);
|
||||||
|
}
|
||||||
|
return new IMountShutdownObserver.Stub.Proxy(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IBinder asBinder() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
|
||||||
|
throws RemoteException {
|
||||||
|
switch (code) {
|
||||||
|
case INTERFACE_TRANSACTION: {
|
||||||
|
reply.writeString(DESCRIPTOR);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
case TRANSACTION_onShutDownComplete: {
|
||||||
|
data.enforceInterface(DESCRIPTOR);
|
||||||
|
int statusCode;
|
||||||
|
statusCode = data.readInt();
|
||||||
|
this.onShutDownComplete(statusCode);
|
||||||
|
reply.writeNoException();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super.onTransact(code, data, reply, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class Proxy implements IMountShutdownObserver {
|
||||||
|
private IBinder mRemote;
|
||||||
|
|
||||||
|
Proxy(IBinder remote) {
|
||||||
|
mRemote = remote;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IBinder asBinder() {
|
||||||
|
return mRemote;
|
||||||
|
}
|
||||||
|
|
||||||
|
public java.lang.String getInterfaceDescriptor() {
|
||||||
|
return DESCRIPTOR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is called when the shutdown of MountService
|
||||||
|
* completed.
|
||||||
|
*
|
||||||
|
* @param statusCode indicates success or failure of the shutdown.
|
||||||
|
*/
|
||||||
|
public void onShutDownComplete(int statusCode) throws RemoteException {
|
||||||
|
Parcel _data = Parcel.obtain();
|
||||||
|
Parcel _reply = Parcel.obtain();
|
||||||
|
try {
|
||||||
|
_data.writeInterfaceToken(DESCRIPTOR);
|
||||||
|
_data.writeInt(statusCode);
|
||||||
|
mRemote.transact(Stub.TRANSACTION_onShutDownComplete, _data, _reply, 0);
|
||||||
|
_reply.readException();
|
||||||
|
} finally {
|
||||||
|
_reply.recycle();
|
||||||
|
_data.recycle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static final int TRANSACTION_onShutDownComplete = (IBinder.FIRST_CALL_TRANSACTION + 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is called when the shutdown of MountService completed.
|
||||||
|
*
|
||||||
|
* @param statusCode indicates success or failure of the shutdown.
|
||||||
|
*/
|
||||||
|
public void onShutDownComplete(int statusCode) throws RemoteException;
|
||||||
|
}
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package android.os.storage;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Callback class for receiving events from MountService about
|
|
||||||
* Opaque Binary Blobs (OBBs).
|
|
||||||
*
|
|
||||||
* @hide - Applications should use android.os.storage.StorageManager
|
|
||||||
* to interact with OBBs.
|
|
||||||
*/
|
|
||||||
interface IObbActionListener {
|
|
||||||
/**
|
|
||||||
* Return from an OBB action result.
|
|
||||||
*
|
|
||||||
* @param filename the path to the OBB the operation was performed on
|
|
||||||
* @param returnCode status of the operation
|
|
||||||
*/
|
|
||||||
void onObbResult(String filename, String status);
|
|
||||||
}
|
|
||||||
130
core/java/android/os/storage/IObbActionListener.java
Normal file
130
core/java/android/os/storage/IObbActionListener.java
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package android.os.storage;
|
||||||
|
|
||||||
|
import android.os.Binder;
|
||||||
|
import android.os.IBinder;
|
||||||
|
import android.os.IInterface;
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.RemoteException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback class for receiving events from MountService about Opaque Binary
|
||||||
|
* Blobs (OBBs).
|
||||||
|
*
|
||||||
|
* @hide - Applications should use StorageManager to interact with OBBs.
|
||||||
|
*/
|
||||||
|
public interface IObbActionListener extends IInterface {
|
||||||
|
/** Local-side IPC implementation stub class. */
|
||||||
|
public static abstract class Stub extends Binder implements IObbActionListener {
|
||||||
|
private static final String DESCRIPTOR = "IObbActionListener";
|
||||||
|
|
||||||
|
/** Construct the stub at attach it to the interface. */
|
||||||
|
public Stub() {
|
||||||
|
this.attachInterface(this, DESCRIPTOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cast an IBinder object into an IObbActionListener interface,
|
||||||
|
* generating a proxy if needed.
|
||||||
|
*/
|
||||||
|
public static IObbActionListener asInterface(IBinder obj) {
|
||||||
|
if ((obj == null)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
IInterface iin = (IInterface) obj.queryLocalInterface(DESCRIPTOR);
|
||||||
|
if (((iin != null) && (iin instanceof IObbActionListener))) {
|
||||||
|
return ((IObbActionListener) iin);
|
||||||
|
}
|
||||||
|
return new IObbActionListener.Stub.Proxy(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IBinder asBinder() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
|
||||||
|
throws RemoteException {
|
||||||
|
switch (code) {
|
||||||
|
case INTERFACE_TRANSACTION: {
|
||||||
|
reply.writeString(DESCRIPTOR);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
case TRANSACTION_onObbResult: {
|
||||||
|
data.enforceInterface(DESCRIPTOR);
|
||||||
|
String filename;
|
||||||
|
filename = data.readString();
|
||||||
|
String status;
|
||||||
|
status = data.readString();
|
||||||
|
this.onObbResult(filename, status);
|
||||||
|
reply.writeNoException();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super.onTransact(code, data, reply, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class Proxy implements IObbActionListener {
|
||||||
|
private IBinder mRemote;
|
||||||
|
|
||||||
|
Proxy(IBinder remote) {
|
||||||
|
mRemote = remote;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IBinder asBinder() {
|
||||||
|
return mRemote;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getInterfaceDescriptor() {
|
||||||
|
return DESCRIPTOR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return from an OBB action result.
|
||||||
|
*
|
||||||
|
* @param filename the path to the OBB the operation was performed
|
||||||
|
* on
|
||||||
|
* @param returnCode status of the operation
|
||||||
|
*/
|
||||||
|
public void onObbResult(String filename, String status) throws RemoteException {
|
||||||
|
Parcel _data = Parcel.obtain();
|
||||||
|
Parcel _reply = Parcel.obtain();
|
||||||
|
try {
|
||||||
|
_data.writeInterfaceToken(DESCRIPTOR);
|
||||||
|
_data.writeString(filename);
|
||||||
|
_data.writeString(status);
|
||||||
|
mRemote.transact(Stub.TRANSACTION_onObbResult, _data, _reply, 0);
|
||||||
|
_reply.readException();
|
||||||
|
} finally {
|
||||||
|
_reply.recycle();
|
||||||
|
_data.recycle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static final int TRANSACTION_onObbResult = (IBinder.FIRST_CALL_TRANSACTION + 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return from an OBB action result.
|
||||||
|
*
|
||||||
|
* @param filename the path to the OBB the operation was performed on
|
||||||
|
* @param returnCode status of the operation
|
||||||
|
*/
|
||||||
|
public void onObbResult(String filename, String status) throws RemoteException;
|
||||||
|
}
|
||||||
81
include/storage/IMountService.h
Normal file
81
include/storage/IMountService.h
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ANDROID_IMOUNTSERVICE_H
|
||||||
|
#define ANDROID_IMOUNTSERVICE_H
|
||||||
|
|
||||||
|
#include <storage/IMountServiceListener.h>
|
||||||
|
#include <storage/IMountShutdownObserver.h>
|
||||||
|
#include <storage/IObbActionListener.h>
|
||||||
|
|
||||||
|
#include <binder/IInterface.h>
|
||||||
|
#include <binder/Parcel.h>
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
|
||||||
|
class IMountService: public IInterface {
|
||||||
|
public:
|
||||||
|
DECLARE_META_INTERFACE(MountService);
|
||||||
|
|
||||||
|
virtual void registerListener(const sp<IMountServiceListener>& listener) = 0;
|
||||||
|
virtual void
|
||||||
|
unregisterListener(const sp<IMountServiceListener>& listener) = 0;
|
||||||
|
virtual bool isUsbMassStorageConnected() = 0;
|
||||||
|
virtual void setUsbMassStorageEnabled(const bool enable) = 0;
|
||||||
|
virtual bool isUsbMassStorageEnabled() = 0;
|
||||||
|
virtual int32_t mountVolume(const String16& mountPoint) = 0;
|
||||||
|
virtual int32_t
|
||||||
|
unmountVolume(const String16& mountPoint, const bool force) = 0;
|
||||||
|
virtual int32_t formatVolume(const String16& mountPoint) = 0;
|
||||||
|
virtual int32_t
|
||||||
|
getStorageUsers(const String16& mountPoint, int32_t** users) = 0;
|
||||||
|
virtual int32_t getVolumeState(const String16& mountPoint) = 0;
|
||||||
|
virtual int32_t createSecureContainer(const String16& id,
|
||||||
|
const int32_t sizeMb, const String16& fstype, const String16& key,
|
||||||
|
const int32_t ownerUid) = 0;
|
||||||
|
virtual int32_t finalizeSecureContainer(const String16& id) = 0;
|
||||||
|
virtual int32_t destroySecureContainer(const String16& id) = 0;
|
||||||
|
virtual int32_t mountSecureContainer(const String16& id,
|
||||||
|
const String16& key, const int32_t ownerUid) = 0;
|
||||||
|
virtual int32_t
|
||||||
|
unmountSecureContainer(const String16& id, const bool force) = 0;
|
||||||
|
virtual bool isSecureContainerMounted(const String16& id) = 0;
|
||||||
|
virtual int32_t renameSecureContainer(const String16& oldId,
|
||||||
|
const String16& newId) = 0;
|
||||||
|
virtual bool getSecureContainerPath(const String16& id, String16& path) = 0;
|
||||||
|
virtual int32_t getSecureContainerList(const String16& id,
|
||||||
|
String16*& containers) = 0;
|
||||||
|
virtual void shutdown(const sp<IMountShutdownObserver>& observer) = 0;
|
||||||
|
virtual void finishMediaUpdate() = 0;
|
||||||
|
virtual void mountObb(const String16& filename, const String16& key,
|
||||||
|
const sp<IObbActionListener>& token) = 0;
|
||||||
|
virtual void unmountObb(const String16& filename, const bool force) = 0;
|
||||||
|
virtual bool isObbMounted(const String16& filename) = 0;
|
||||||
|
virtual bool getMountedObbPath(const String16& filename, String16& path) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class BnMountService: public BnInterface<IMountService> {
|
||||||
|
public:
|
||||||
|
virtual status_t onTransact(uint32_t code, const Parcel& data,
|
||||||
|
Parcel* reply, uint32_t flags = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
; // namespace android
|
||||||
|
|
||||||
|
#endif // ANDROID_IMOUNTSERVICE_H
|
||||||
45
include/storage/IMountServiceListener.h
Normal file
45
include/storage/IMountServiceListener.h
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ANDROID_IMOUNTSERVICELISTENER_H
|
||||||
|
#define ANDROID_IMOUNTSERVICELISTENER_H
|
||||||
|
|
||||||
|
#include <binder/IInterface.h>
|
||||||
|
#include <binder/Parcel.h>
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
|
||||||
|
class IMountServiceListener: public IInterface {
|
||||||
|
public:
|
||||||
|
DECLARE_META_INTERFACE(MountServiceListener);
|
||||||
|
|
||||||
|
virtual void onUsbMassStorageConnectionChanged(const bool connected) = 0;
|
||||||
|
virtual void onStorageStateChanged(const String16& path,
|
||||||
|
const String16& oldState, const String16& newState) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class BnMountServiceListener: public BnInterface<IMountServiceListener> {
|
||||||
|
public:
|
||||||
|
virtual status_t onTransact(uint32_t code, const Parcel& data,
|
||||||
|
Parcel* reply, uint32_t flags = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
; // namespace android
|
||||||
|
|
||||||
|
#endif // ANDROID_IMOUNTSERVICELISTENER_H
|
||||||
46
include/storage/IMountShutdownObserver.h
Normal file
46
include/storage/IMountShutdownObserver.h
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ANDROID_IMOUNTSHUTDOWNOBSERVER_H
|
||||||
|
#define ANDROID_IMOUNTSHUTDOWNOBSERVER_H
|
||||||
|
|
||||||
|
#include <binder/IInterface.h>
|
||||||
|
#include <binder/Parcel.h>
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
|
||||||
|
class IMountShutdownObserver: public IInterface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DECLARE_META_INTERFACE(MountShutdownObserver);
|
||||||
|
|
||||||
|
virtual void onShutDownComplete(const int32_t statusCode) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class BnMountShutdownObserver: public BnInterface<IMountShutdownObserver>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual status_t onTransact( uint32_t code,
|
||||||
|
const Parcel& data,
|
||||||
|
Parcel* reply,
|
||||||
|
uint32_t flags = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
}; // namespace android
|
||||||
|
|
||||||
|
#endif // ANDROID_IMOUNTSHUTDOWNOBSERVER_H
|
||||||
48
include/storage/IObbActionListener.h
Normal file
48
include/storage/IObbActionListener.h
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ANDROID_IOBBACTIONLISTENER_H
|
||||||
|
#define ANDROID_IOBBACTIONLISTENER_H
|
||||||
|
|
||||||
|
#include <binder/IInterface.h>
|
||||||
|
#include <binder/Parcel.h>
|
||||||
|
|
||||||
|
#include <utils/String16.h>
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
|
||||||
|
class IObbActionListener: public IInterface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DECLARE_META_INTERFACE(ObbActionListener);
|
||||||
|
|
||||||
|
virtual void onObbResult(const String16& filename, const String16& status) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class BnObbActionListener: public BnInterface<IObbActionListener>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual status_t onTransact( uint32_t code,
|
||||||
|
const Parcel& data,
|
||||||
|
Parcel* reply,
|
||||||
|
uint32_t flags = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
}; // namespace android
|
||||||
|
|
||||||
|
#endif // ANDROID_IOBBACTIONLISTENER_H
|
||||||
20
libs/storage/Android.mk
Normal file
20
libs/storage/Android.mk
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
LOCAL_PATH:= $(call my-dir)
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES:= \
|
||||||
|
IMountServiceListener.cpp \
|
||||||
|
IMountShutdownObserver.cpp \
|
||||||
|
IObbActionListener.cpp \
|
||||||
|
IMountService.cpp
|
||||||
|
|
||||||
|
LOCAL_STATIC_LIBRARIES := \
|
||||||
|
libutils \
|
||||||
|
libbinder
|
||||||
|
|
||||||
|
LOCAL_MODULE:= libstorage
|
||||||
|
|
||||||
|
ifeq ($(TARGET_SIMULATOR),true)
|
||||||
|
LOCAL_LDLIBS += -lpthread
|
||||||
|
endif
|
||||||
|
|
||||||
|
include $(BUILD_STATIC_LIBRARY)
|
||||||
508
libs/storage/IMountService.cpp
Normal file
508
libs/storage/IMountService.cpp
Normal file
@@ -0,0 +1,508 @@
|
|||||||
|
/*
|
||||||
|
* 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 "IMountService"
|
||||||
|
|
||||||
|
#include <storage/IMountService.h>
|
||||||
|
#include <binder/Parcel.h>
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
|
||||||
|
enum {
|
||||||
|
TRANSACTION_registerListener = IBinder::FIRST_CALL_TRANSACTION,
|
||||||
|
TRANSACTION_unregisterListener,
|
||||||
|
TRANSACTION_isUsbMassStorageConnected,
|
||||||
|
TRANSACTION_setUsbMassStorageEnabled,
|
||||||
|
TRANSACTION_isUsbMassStorageEnabled,
|
||||||
|
TRANSACTION_mountVolume,
|
||||||
|
TRANSACTION_unmountVolume,
|
||||||
|
TRANSACTION_formatVolume,
|
||||||
|
TRANSACTION_getStorageUsers,
|
||||||
|
TRANSACTION_getVolumeState,
|
||||||
|
TRANSACTION_createSecureContainer,
|
||||||
|
TRANSACTION_finalizeSecureContainer,
|
||||||
|
TRANSACTION_destroySecureContainer,
|
||||||
|
TRANSACTION_mountSecureContainer,
|
||||||
|
TRANSACTION_unmountSecureContainer,
|
||||||
|
TRANSACTION_isSecureContainerMounted,
|
||||||
|
TRANSACTION_renameSecureContainer,
|
||||||
|
TRANSACTION_getSecureContainerPath,
|
||||||
|
TRANSACTION_getSecureContainerList,
|
||||||
|
TRANSACTION_shutdown,
|
||||||
|
TRANSACTION_finishMediaUpdate,
|
||||||
|
TRANSACTION_mountObb,
|
||||||
|
TRANSACTION_unmountObb,
|
||||||
|
TRANSACTION_isObbMounted,
|
||||||
|
TRANSACTION_getMountedObbPath,
|
||||||
|
};
|
||||||
|
|
||||||
|
class BpMountService: public BpInterface<IMountService>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BpMountService(const sp<IBinder>& impl)
|
||||||
|
: BpInterface<IMountService>(impl)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void registerListener(const sp<IMountServiceListener>& listener)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeStrongBinder(listener->asBinder());
|
||||||
|
if (remote()->transact(TRANSACTION_registerListener, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("registerListener could not contact remote\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode();
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("registerListener caught exception %d\n", err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void unregisterListener(const sp<IMountServiceListener>& listener)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeStrongBinder(listener->asBinder());
|
||||||
|
if (remote()->transact(TRANSACTION_unregisterListener, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("unregisterListener could not contact remote\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode();
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("unregisterListener caught exception %d\n", err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool isUsbMassStorageConnected()
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
if (remote()->transact(TRANSACTION_isUsbMassStorageConnected, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("isUsbMassStorageConnected could not contact remote\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode();
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("isUsbMassStorageConnected caught exception %d\n", err);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return reply.readInt32() != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void setUsbMassStorageEnabled(const bool enable)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeInt32(enable != 0);
|
||||||
|
if (remote()->transact(TRANSACTION_setUsbMassStorageEnabled, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("setUsbMassStorageEnabled could not contact remote\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode();
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("setUsbMassStorageEnabled caught exception %d\n", err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool isUsbMassStorageEnabled()
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
if (remote()->transact(TRANSACTION_isUsbMassStorageEnabled, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("isUsbMassStorageEnabled could not contact remote\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode();
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("isUsbMassStorageEnabled caught exception %d\n", err);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return reply.readInt32() != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t mountVolume(const String16& mountPoint)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeString16(mountPoint);
|
||||||
|
if (remote()->transact(TRANSACTION_mountVolume, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("mountVolume could not contact remote\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode();
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("mountVolume caught exception %d\n", err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
return reply.readInt32();
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t unmountVolume(const String16& mountPoint, const bool force)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeString16(mountPoint);
|
||||||
|
data.writeInt32(force ? 1 : 0);
|
||||||
|
if (remote()->transact(TRANSACTION_unmountVolume, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("unmountVolume could not contact remote\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode();
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("unmountVolume caught exception %d\n", err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
return reply.readInt32();
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t formatVolume(const String16& mountPoint)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeString16(mountPoint);
|
||||||
|
if (remote()->transact(TRANSACTION_formatVolume, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("formatVolume could not contact remote\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode();
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("formatVolume caught exception %d\n", err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
return reply.readInt32();
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t getStorageUsers(const String16& mountPoint, int32_t** users)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeString16(mountPoint);
|
||||||
|
if (remote()->transact(TRANSACTION_getStorageUsers, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("getStorageUsers could not contact remote\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode();
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("getStorageUsers caught exception %d\n", err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
const int32_t numUsers = reply.readInt32();
|
||||||
|
*users = (int32_t*)malloc(sizeof(int32_t)*numUsers);
|
||||||
|
for (int i = 0; i < numUsers; i++) {
|
||||||
|
**users++ = reply.readInt32();
|
||||||
|
}
|
||||||
|
return numUsers;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t getVolumeState(const String16& mountPoint)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeString16(mountPoint);
|
||||||
|
if (remote()->transact(TRANSACTION_getVolumeState, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("getVolumeState could not contact remote\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode();
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("getVolumeState caught exception %d\n", err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
return reply.readInt32();
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t createSecureContainer(const String16& id, const int32_t sizeMb, const String16& fstype,
|
||||||
|
const String16& key, const int32_t ownerUid)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeString16(id);
|
||||||
|
data.writeInt32(sizeMb);
|
||||||
|
data.writeString16(fstype);
|
||||||
|
data.writeString16(key);
|
||||||
|
data.writeInt32(ownerUid);
|
||||||
|
if (remote()->transact(TRANSACTION_createSecureContainer, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("createSecureContainer could not contact remote\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode();
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("createSecureContainer caught exception %d\n", err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
return reply.readInt32();
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t finalizeSecureContainer(const String16& id)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeString16(id);
|
||||||
|
if (remote()->transact(TRANSACTION_finalizeSecureContainer, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("finalizeSecureContainer couldn't call remote\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode();
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("finalizeSecureContainer caught exception %d\n", err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
return reply.readInt32();
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t destroySecureContainer(const String16& id)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeString16(id);
|
||||||
|
if (remote()->transact(TRANSACTION_destroySecureContainer, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("destroySecureContainer couldn't call remote");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode();
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("destroySecureContainer caught exception %d\n", err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
return reply.readInt32();
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t mountSecureContainer(const String16& id, const String16& key, const int32_t ownerUid)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeString16(id);
|
||||||
|
data.writeString16(key);
|
||||||
|
data.writeInt32(ownerUid);
|
||||||
|
if (remote()->transact(TRANSACTION_mountSecureContainer, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("mountSecureContainer couldn't call remote");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode(); // What to do...
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("mountSecureContainer caught exception %d\n", err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
return reply.readInt32();
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t unmountSecureContainer(const String16& id, const bool force)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeString16(id);
|
||||||
|
data.writeInt32(force ? 1 : 0);
|
||||||
|
if (remote()->transact(TRANSACTION_getSecureContainerPath, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("unmountSecureContainer couldn't call remote");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode(); // What to do...
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("unmountSecureContainer caught exception %d\n", err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
return reply.readInt32();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isSecureContainerMounted(const String16& id)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeString16(id);
|
||||||
|
if (remote()->transact(TRANSACTION_isSecureContainerMounted, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("isSecureContainerMounted couldn't call remote");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode(); // What to do...
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("isSecureContainerMounted caught exception %d\n", err);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return reply.readInt32() != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t renameSecureContainer(const String16& oldId, const String16& newId)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeString16(oldId);
|
||||||
|
data.writeString16(newId);
|
||||||
|
if (remote()->transact(TRANSACTION_renameSecureContainer, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("renameSecureContainer couldn't call remote");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode(); // What to do...
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("renameSecureContainer caught exception %d\n", err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
return reply.readInt32();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool getSecureContainerPath(const String16& id, String16& path)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeString16(id);
|
||||||
|
if (remote()->transact(TRANSACTION_getSecureContainerPath, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("getSecureContainerPath couldn't call remote");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode(); // What to do...
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("getSecureContainerPath caught exception %d\n", err);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
path = reply.readString16();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t getSecureContainerList(const String16& id, String16*& containers)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeString16(id);
|
||||||
|
if (remote()->transact(TRANSACTION_getSecureContainerList, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("getSecureContainerList couldn't call remote");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode();
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("getSecureContainerList caught exception %d\n", err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
const int32_t numStrings = reply.readInt32();
|
||||||
|
containers = new String16[numStrings];
|
||||||
|
for (int i = 0; i < numStrings; i++) {
|
||||||
|
containers[i] = reply.readString16();
|
||||||
|
}
|
||||||
|
return numStrings;
|
||||||
|
}
|
||||||
|
|
||||||
|
void shutdown(const sp<IMountShutdownObserver>& observer)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeStrongBinder(observer->asBinder());
|
||||||
|
if (remote()->transact(TRANSACTION_shutdown, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("shutdown could not contact remote\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode();
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("shutdown caught exception %d\n", err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
reply.readExceptionCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
void finishMediaUpdate()
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
if (remote()->transact(TRANSACTION_finishMediaUpdate, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("finishMediaUpdate could not contact remote\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode();
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("finishMediaUpdate caught exception %d\n", err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
reply.readExceptionCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
void mountObb(const String16& filename, const String16& key, const sp<
|
||||||
|
IObbActionListener>& token)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeString16(filename);
|
||||||
|
data.writeString16(key);
|
||||||
|
data.writeStrongBinder(token->asBinder());
|
||||||
|
if (remote()->transact(TRANSACTION_mountObb, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("mountObb could not contact remote\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode();
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("mountObb caught exception %d\n", err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void unmountObb(const String16& filename, const bool force)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeString16(filename);
|
||||||
|
data.writeInt32(force ? 1 : 0);
|
||||||
|
if (remote()->transact(TRANSACTION_unmountObb, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("unmountObb could not contact remote\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode();
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("unmountObb caught exception %d\n", err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isObbMounted(const String16& filename)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeString16(filename);
|
||||||
|
if (remote()->transact(TRANSACTION_isObbMounted, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("isObbMounted could not contact remote\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode();
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("isObbMounted caught exception %d\n", err);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return reply.readInt32() != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool getMountedObbPath(const String16& filename, String16& path)
|
||||||
|
{
|
||||||
|
Parcel data, reply;
|
||||||
|
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
|
||||||
|
data.writeString16(filename);
|
||||||
|
if (remote()->transact(TRANSACTION_getMountedObbPath, data, &reply) != NO_ERROR) {
|
||||||
|
LOGD("getMountedObbPath could not contact remote\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int32_t err = reply.readExceptionCode();
|
||||||
|
if (err < 0) {
|
||||||
|
LOGD("getMountedObbPath caught exception %d\n", err);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
path = reply.readString16();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
IMPLEMENT_META_INTERFACE(MountService, "IMountService");
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
};
|
||||||
53
libs/storage/IMountServiceListener.cpp
Normal file
53
libs/storage/IMountServiceListener.cpp
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <storage/IMountServiceListener.h>
|
||||||
|
#include <binder/Parcel.h>
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
|
||||||
|
enum {
|
||||||
|
TRANSACTION_onUsbMassStorageConnectionChanged = IBinder::FIRST_CALL_TRANSACTION,
|
||||||
|
TRANSACTION_onStorageStateChanged,
|
||||||
|
};
|
||||||
|
|
||||||
|
status_t BnMountServiceListener::onTransact(
|
||||||
|
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
|
||||||
|
{
|
||||||
|
switch(code) {
|
||||||
|
case TRANSACTION_onUsbMassStorageConnectionChanged: {
|
||||||
|
CHECK_INTERFACE(IMountServiceListener, data, reply);
|
||||||
|
bool connected = (data.readInt32() != 0);
|
||||||
|
onUsbMassStorageConnectionChanged(connected);
|
||||||
|
reply->writeNoException();
|
||||||
|
return NO_ERROR;
|
||||||
|
} break;
|
||||||
|
case TRANSACTION_onStorageStateChanged: {
|
||||||
|
CHECK_INTERFACE(IMountServiceListener, data, reply);
|
||||||
|
String16 path = data.readString16();
|
||||||
|
String16 oldState = data.readString16();
|
||||||
|
String16 newState = data.readString16();
|
||||||
|
onStorageStateChanged(path, oldState, newState);
|
||||||
|
reply->writeNoException();
|
||||||
|
return NO_ERROR;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return BBinder::onTransact(code, data, reply, flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
};
|
||||||
43
libs/storage/IMountShutdownObserver.cpp
Normal file
43
libs/storage/IMountShutdownObserver.cpp
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <storage/IMountShutdownObserver.h>
|
||||||
|
#include <binder/Parcel.h>
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
|
||||||
|
enum {
|
||||||
|
TRANSACTION_onShutDownComplete = IBinder::FIRST_CALL_TRANSACTION,
|
||||||
|
};
|
||||||
|
|
||||||
|
status_t BnMountShutdownObserver::onTransact(
|
||||||
|
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
|
||||||
|
{
|
||||||
|
switch(code) {
|
||||||
|
case TRANSACTION_onShutDownComplete: {
|
||||||
|
CHECK_INTERFACE(IMountShutdownObserver, data, reply);
|
||||||
|
int32_t statusCode = data.readInt32();
|
||||||
|
onShutDownComplete(statusCode);
|
||||||
|
reply->writeNoException();
|
||||||
|
return NO_ERROR;
|
||||||
|
} break;
|
||||||
|
default:
|
||||||
|
return BBinder::onTransact(code, data, reply, flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
};
|
||||||
59
libs/storage/IObbActionListener.cpp
Normal file
59
libs/storage/IObbActionListener.cpp
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <storage/IObbActionListener.h>
|
||||||
|
#include <binder/Parcel.h>
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
|
||||||
|
enum {
|
||||||
|
TRANSACTION_onObbResult = IBinder::FIRST_CALL_TRANSACTION,
|
||||||
|
};
|
||||||
|
|
||||||
|
// This is a stub that real consumers should override.
|
||||||
|
class BpObbActionListener: public BpInterface<IObbActionListener> {
|
||||||
|
public:
|
||||||
|
BpObbActionListener(const sp<IBinder>& impl)
|
||||||
|
: BpInterface<IObbActionListener>(impl)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
virtual void onObbResult(const String16& filename, const String16& status) { }
|
||||||
|
};
|
||||||
|
|
||||||
|
IMPLEMENT_META_INTERFACE(ObbActionListener, "IObbActionListener");
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
status_t BnObbActionListener::onTransact(
|
||||||
|
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
|
||||||
|
{
|
||||||
|
switch(code) {
|
||||||
|
case TRANSACTION_onObbResult: {
|
||||||
|
CHECK_INTERFACE(IObbActionListener, data, reply);
|
||||||
|
String16 filename = data.readString16();
|
||||||
|
String16 state = data.readString16();
|
||||||
|
onObbResult(filename, state);
|
||||||
|
reply->writeNoException();
|
||||||
|
return NO_ERROR;
|
||||||
|
} break;
|
||||||
|
default:
|
||||||
|
return BBinder::onTransact(code, data, reply, flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
};
|
||||||
0
libs/storage/MODULE_LICENSE_APACHE2
Normal file
0
libs/storage/MODULE_LICENSE_APACHE2
Normal file
190
libs/storage/NOTICE
Normal file
190
libs/storage/NOTICE
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
@@ -12,7 +12,8 @@ LOCAL_SRC_FILES:= \
|
|||||||
looper.cpp \
|
looper.cpp \
|
||||||
native_activity.cpp \
|
native_activity.cpp \
|
||||||
native_window.cpp \
|
native_window.cpp \
|
||||||
sensor.cpp
|
sensor.cpp \
|
||||||
|
storage_manager.cpp
|
||||||
|
|
||||||
LOCAL_SHARED_LIBRARIES := \
|
LOCAL_SHARED_LIBRARIES := \
|
||||||
libcutils \
|
libcutils \
|
||||||
@@ -23,6 +24,9 @@ LOCAL_SHARED_LIBRARIES := \
|
|||||||
libsurfaceflinger_client \
|
libsurfaceflinger_client \
|
||||||
libandroid_runtime
|
libandroid_runtime
|
||||||
|
|
||||||
|
LOCAL_STATIC_LIBRARIES := \
|
||||||
|
libstorage
|
||||||
|
|
||||||
LOCAL_C_INCLUDES += \
|
LOCAL_C_INCLUDES += \
|
||||||
frameworks/base/native/include \
|
frameworks/base/native/include \
|
||||||
frameworks/base/core/jni/android \
|
frameworks/base/core/jni/android \
|
||||||
|
|||||||
141
native/android/storage_manager.cpp
Normal file
141
native/android/storage_manager.cpp
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
/*
|
||||||
|
* 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 "NStorage"
|
||||||
|
|
||||||
|
#include <android/storage_manager.h>
|
||||||
|
#include <storage/IMountService.h>
|
||||||
|
|
||||||
|
#include <binder/Binder.h>
|
||||||
|
#include <binder/IServiceManager.h>
|
||||||
|
#include <utils/Log.h>
|
||||||
|
#include <utils/RefBase.h>
|
||||||
|
#include <utils/String8.h>
|
||||||
|
#include <utils/String16.h>
|
||||||
|
|
||||||
|
|
||||||
|
using namespace android;
|
||||||
|
|
||||||
|
struct ObbActionListener : public BnObbActionListener {
|
||||||
|
private:
|
||||||
|
sp<AStorageManager> mStorageManager;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ObbActionListener(AStorageManager* mgr) :
|
||||||
|
mStorageManager(mgr)
|
||||||
|
{}
|
||||||
|
|
||||||
|
virtual void onObbResult(const android::String16& filename, const android::String16& state) {
|
||||||
|
LOGD("Got obb result (%s, %s)\n", String8(filename).string(), String8(state).string());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct AStorageManager : public RefBase {
|
||||||
|
protected:
|
||||||
|
void* mObbCallback;
|
||||||
|
sp<ObbActionListener> mObbActionListener;
|
||||||
|
sp<IMountService> mMountService;
|
||||||
|
|
||||||
|
public:
|
||||||
|
AStorageManager() :
|
||||||
|
mObbCallback(NULL)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool initialize() {
|
||||||
|
sp<IServiceManager> sm = defaultServiceManager();
|
||||||
|
if (sm == NULL) {
|
||||||
|
LOGE("Couldn't get default ServiceManager\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
mMountService = interface_cast<IMountService>(sm->getService(String16("mount")));
|
||||||
|
if (mMountService == NULL) {
|
||||||
|
LOGE("Couldn't get connection to MountService\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
mObbActionListener = new ObbActionListener(this);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setObbCallback(void* cb) {
|
||||||
|
mObbCallback = cb;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mountObb(const char* filename, const char* key) {
|
||||||
|
String16 filename16(filename);
|
||||||
|
String16 key16(key);
|
||||||
|
mMountService->mountObb(filename16, key16, mObbActionListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
void unmountObb(const char* filename, const bool force) {
|
||||||
|
String16 filename16(filename);
|
||||||
|
mMountService->unmountObb(filename16, force);
|
||||||
|
}
|
||||||
|
|
||||||
|
int isObbMounted(const char* filename) {
|
||||||
|
String16 filename16(filename);
|
||||||
|
return mMountService->isObbMounted(filename16);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* getMountedObbPath(const char* filename) {
|
||||||
|
String16 filename16(filename);
|
||||||
|
String16 path16;
|
||||||
|
if (mMountService->getMountedObbPath(filename16, path16)) {
|
||||||
|
return String8(path16).string();
|
||||||
|
} else {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
AStorageManager* AStorageManager_new() {
|
||||||
|
sp<AStorageManager> mgr = new AStorageManager();
|
||||||
|
if (mgr == NULL || !mgr->initialize()) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
mgr->incStrong((void*)AStorageManager_new);
|
||||||
|
return static_cast<AStorageManager*>(mgr.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
void AStorageManager_delete(AStorageManager* mgr) {
|
||||||
|
if (mgr) {
|
||||||
|
mgr->decStrong((void*)AStorageManager_new);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AStorageManager_setObbCallback(AStorageManager* mgr, void* cb) {
|
||||||
|
mgr->setObbCallback(cb);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AStorageManager_mountObb(AStorageManager* mgr, const char* filename, const char* key) {
|
||||||
|
mgr->mountObb(filename, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AStorageManager_unmountObb(AStorageManager* mgr, const char* filename, const int force) {
|
||||||
|
mgr->unmountObb(filename, force != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int AStorageManager_isObbMounted(AStorageManager* mgr, const char* filename) {
|
||||||
|
return mgr->isObbMounted(filename) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* AStorageManager_getMountedObbPath(AStorageManager* mgr, const char* filename) {
|
||||||
|
return mgr->getMountedObbPath(filename);
|
||||||
|
}
|
||||||
69
native/include/android/storage_manager.h
Normal file
69
native/include/android/storage_manager.h
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef ANDROID_STORAGE_MANAGER_H
|
||||||
|
#define ANDROID_STORAGE_MANAGER_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct AStorageManager;
|
||||||
|
typedef struct AStorageManager AStorageManager;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains a new instance of AStorageManager.
|
||||||
|
*/
|
||||||
|
AStorageManager* AStorageManager_new();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Release AStorageManager instance.
|
||||||
|
*/
|
||||||
|
void AStorageManager_delete(AStorageManager* mgr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback to call when requested OBB is complete.
|
||||||
|
*/
|
||||||
|
void AStorageManager_setObbCallback(AStorageManager* mgr, void* cb);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempts to mount an OBB file.
|
||||||
|
*/
|
||||||
|
void AStorageManager_mountObb(AStorageManager* mgr, const char* filename, const char* key);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempts to unmount an OBB file.
|
||||||
|
*/
|
||||||
|
void AStorageManager_unmountObb(AStorageManager* mgr, const char* filename, const int force);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether an OBB is mounted.
|
||||||
|
*/
|
||||||
|
int AStorageManager_isObbMounted(AStorageManager* mgr, const char* filename);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the mounted path for an OBB.
|
||||||
|
*/
|
||||||
|
const char* AStorageManager_getMountedObbPath(AStorageManager* mgr, const char* filename);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // ANDROID_PACKAGE_MANAGER_H
|
||||||
Reference in New Issue
Block a user