am c0a7e690: Add Parcel::readExceptionCode() and Parcel::writeNoException()

Merge commit 'c0a7e690bfd32dd897ceccd04dd0fa6bf6e9cee6' into gingerbread-plus-aosp

* commit 'c0a7e690bfd32dd897ceccd04dd0fa6bf6e9cee6':
  Add Parcel::readExceptionCode() and Parcel::writeNoException()
This commit is contained in:
Brad Fitzpatrick
2010-07-13 15:55:05 -07:00
committed by Android Git Automerger
5 changed files with 29 additions and 8 deletions

View File

@ -39,7 +39,7 @@ int openContentProviderFile(const String16& uri)
data.writeString16(uri);
status_t ret = am->transact(OPEN_CONTENT_URI_TRANSACTION, data, &reply);
if (ret == NO_ERROR) {
int32_t exceptionCode = reply.readInt32();
int32_t exceptionCode = reply.readExceptionCode();
if (!exceptionCode) {
// Success is indicated here by a nonzero int followed by the fd;
// failure by a zero int with no data following.

View File

@ -103,6 +103,11 @@ public:
status_t writeObject(const flat_binder_object& val, bool nullMetaData);
// Like Parcel.java's writeNoException(). Just writes a zero int32.
// Currently the native implementation doesn't do any of the StrictMode
// stack gathering and serialization that the Java implementation does.
status_t writeNoException();
void remove(size_t start, size_t amt);
status_t read(void* outData, size_t len) const;
@ -125,7 +130,14 @@ public:
sp<IBinder> readStrongBinder() const;
wp<IBinder> readWeakBinder() const;
status_t read(Flattenable& val) const;
// Like Parcel.java's readExceptionCode(). Reads the first int32
// off of a Parcel's header, returning 0 or the negative error
// code on exceptions, but also deals with skipping over rich
// response headers. Callers should use this to read & parse the
// response headers rather than doing it by hand.
int32_t readExceptionCode() const;
// Retrieve native_handle from the parcel. This returns a copy of the
// parcel's native_handle (the caller takes ownership). The caller
// must free the native_handle with native_handle_close() and

View File

@ -36,7 +36,7 @@ public:
: BpInterface<IPermissionController>(impl)
{
}
virtual bool checkPermission(const String16& permission, int32_t pid, int32_t uid)
{
Parcel data, reply;
@ -46,7 +46,7 @@ public:
data.writeInt32(uid);
remote()->transact(CHECK_PERMISSION_TRANSACTION, data, &reply);
// fail on exception
if (reply.readInt32() != 0) return 0;
if (reply.readExceptionCode() != 0) return 0;
return reply.readInt32() != 0;
}
};
@ -66,8 +66,7 @@ status_t BnPermissionController::onTransact(
int32_t pid = data.readInt32();
int32_t uid = data.readInt32();
bool res = checkPermission(permission, pid, uid);
// write exception
reply->writeInt32(0);
reply->writeNoException();
reply->writeInt32(res ? 1 : 0);
return NO_ERROR;
} break;
@ -77,4 +76,3 @@ status_t BnPermissionController::onTransact(
}
}; // namespace android

View File

@ -158,7 +158,7 @@ public:
data.writeString16(name);
data.writeStrongBinder(service);
status_t err = remote()->transact(ADD_SERVICE_TRANSACTION, data, &reply);
return err == NO_ERROR ? reply.readInt32() : err;
return err == NO_ERROR ? reply.readExceptionCode() : err;
}
virtual Vector<String16> listServices()

View File

@ -754,6 +754,11 @@ restart_write:
goto restart_write;
}
status_t Parcel::writeNoException()
{
return writeInt32(0);
}
void Parcel::remove(size_t start, size_t amt)
{
LOG_ALWAYS_FATAL("Parcel::remove() not yet implemented!");
@ -942,6 +947,12 @@ wp<IBinder> Parcel::readWeakBinder() const
return val;
}
int32_t Parcel::readExceptionCode() const
{
int32_t exception_code = readAligned<int32_t>();
// TODO: skip over the response header here, once that's in.
return exception_code;
}
native_handle* Parcel::readNativeHandle() const
{