ECode PdfEditor::constructor(
    /* [in] */ /*@NonNull*/ IParcelFileDescriptor* input) /*throws IOException*/
{
    if (input == NULL) {
        // throw new NullPointerException("input cannot be NULL");
        return E_NULL_POINTER_EXCEPTION;
    }

    Int64 size = 0;
    // try {
    AutoPtr<IFileDescriptor> fd;
    input->GetFileDescriptor((IFileDescriptor**)&fd);
    AutoPtr<ILibcore> lc;
    CLibcore::AcquireSingleton((ILibcore**)&lc);
    AutoPtr<IOs> os;
    lc->GetOs((IOs**)&os);
    if (FAILED((os->Lseek(fd, 0, OsConstants::_SEEK_SET, &size)))) {
        return E_ILLEGAL_ARGUMENT_EXCEPTION;
    }
    AutoPtr<IStructStat> ss;
    if (FAILED((os->Fstat(fd, (IStructStat**)&ss)))) {
        return E_ILLEGAL_ARGUMENT_EXCEPTION;
    }
    ss->GetSize(&size);
    // } catch (ErrnoException ee) {
    //     throw new IllegalArgumentException("file descriptor not seekable");
    // }

    mInput = input;
    Int32 iFd = 0;
    FAIL_RETURN(NativeOpen(mInput->GetFd(&iFd), size, &mNativeDocument));
    mPageCount = NativeGetPageCount(mNativeDocument);
    return mCloseGuard->Open(String("PdfEditor::Close"));
}
ECode CSerialService::OpenSerialPort(
    /* [in] */ const String& path,
    /* [out] */ IParcelFileDescriptor** descriptor)
{
    VALIDATE_NOT_NULL(descriptor);
    *descriptor = NULL;

    FAIL_RETURN(mContext->EnforceCallingOrSelfPermission(Elastos::Droid::Manifest::Permission::SERIAL_PORT, String(NULL)));
    return NativeOpen(path, descriptor);
}