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/os/IHardwareService.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/INetStatService.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/libreverbtest_intermediates)
|
||||
$(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
|
||||
|
||||
@@ -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 \
|
||||
native_activity.cpp \
|
||||
native_window.cpp \
|
||||
sensor.cpp
|
||||
sensor.cpp \
|
||||
storage_manager.cpp
|
||||
|
||||
LOCAL_SHARED_LIBRARIES := \
|
||||
libcutils \
|
||||
@@ -23,6 +24,9 @@ LOCAL_SHARED_LIBRARIES := \
|
||||
libsurfaceflinger_client \
|
||||
libandroid_runtime
|
||||
|
||||
LOCAL_STATIC_LIBRARIES := \
|
||||
libstorage
|
||||
|
||||
LOCAL_C_INCLUDES += \
|
||||
frameworks/base/native/include \
|
||||
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