Android Open Source - drive-mount Command Status Wrapper






From Project

Back to project page drive-mount.

License

The source code is released under:

Apache License

If you think the Android project drive-mount listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/**
 * Copyright  2014 Jan Seeger/* w  w  w  . j a  va 2s  .  co  m*/
 *
 * 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 net.alphadev.usbstorage.scsi;

import net.alphadev.usbstorage.util.BitStitching;

import java.nio.ByteOrder;

/**
 * @author Jan Seeger <jan@alphadev.net>
 */
public class CommandStatusWrapper {
    private byte[] mSignature;
    private int mTag;
    private int mDataResidue;
    private byte mStatus;

    public CommandStatusWrapper(byte[] data) {
        if (data.length != 13) {
            throw new IllegalArgumentException("CSW always has a length of 13 bytes!");
        }

        mSignature = new byte[4];
        mSignature[0x0] = data[0x0];
        mSignature[0x1] = data[0x1];
        mSignature[0x2] = data[0x2];
        mSignature[0x3] = data[0x3];

        if (!"USBS".equals(getSignature())) {
            System.out.println(BitStitching.convertBytesToHex(data));
            throw new IllegalArgumentException("Invalid CSW header!");
        }

        mTag = BitStitching.convertToInt(data, 0x4, ByteOrder.LITTLE_ENDIAN);
        mDataResidue = BitStitching.convertToInt(data, 0x8, ByteOrder.LITTLE_ENDIAN);
        mStatus = data[0xc];
    }

    public String getSignature() {
        return new String(mSignature);
    }

    public int getTag() {
        return mTag;
    }

    public int getDataResidue() {
        return mDataResidue;
    }

    public Status getStatus() {
        switch (mStatus) {
            case 0:
                return Status.COMMAND_PASSED;
            case 2:
                return Status.CHECK_CONDITION;
            case 4:
                return Status.CONDITION_MET;
            case 8:
                return Status.BUSY;
            case 16:
                return Status.INTERMEDIATE;
            case 20:
                return Status.INTERMEDIATE_CONDITION_MET;
            case 24:
                return Status.RESERVATION_CONFLICT;
            case 34:
                return Status.COMMAND_TERMINATED;
            case 40:
                return Status.QUEUE_FULL;
            default:
                return Status.RESERVED;
        }
    }

    public static enum Status {
        /**
         * This status indicates that the target has successfully completed the command.
         */
        COMMAND_PASSED,

        /**
         * This status indicates that a contingent allegiance condition has occurred.
         */
        CHECK_CONDITION,

        /**
         * This status or INTERMEDIATE-CONDITION MET is returned whenever the requested operation is
         * satisfied (see the SEARCH DATA and PRE-FETCH commands).
         */
        CONDITION_MET,

        /**
         * This status indicates that the target is busy.  This status shall be returned whenever a
         * target is unable to accept a command from an otherwise acceptable initiator (i.e., no
         * reservation conflicts).  The recommended initiator recovery action is to issue the
         * command again at a later time.
         */
        BUSY,

        /**
         * This status or INTERMEDIATE-CONDITION MET shall be returned for every successfully
         * completed command in a series of linked commands (except the last command), unless the
         * command is terminated with CHECK CONDITION, RESERVATION CONFLICT, or COMMAND TERMINATED
         * status.  If INTERMEDIATE or INTERMEDIATE-CONDITION MET status is not returned, the series
         * of linked commands is terminated and the I/O process is ended.
         */
        INTERMEDIATE,

        /**
         * This status is the combination of the CONDITION MET and INTERMEDIATE statuses.
         */
        INTERMEDIATE_CONDITION_MET,

        /**
         * This status shall be returned whenever an initiator attempts to access a logical unit or
         * an extent within a logical unit that is reserved with a conflicting reservation type for
         * another SCSI device (see the RESERVE and RESERVE UNIT commands).  The recommended
         * initiator recovery action is to issue the command again at a later time.
         */
        RESERVATION_CONFLICT,

        /**
         * This status shall be returned whenever the target terminates the current I/O process
         * after receiving a TERMINATE I/O PROCESS message (see 5.6.22). This status also indicates
         * that a contingent allegiance condition has occurred (see 6.6).
         */
        COMMAND_TERMINATED,

        /**
         * This status shall be implemented if tagged queuing is implemented. This status is
         * returned when a SIMPLE QUEUE TAG, ORDERED QUEUE TAG, or HEAD OF QUEUE TAG message is
         * received and the command queue is full. The I/O process is not placed in the command
         * queue.
         */
        QUEUE_FULL,

        /**
         * Reserved for future use.
         */
        RESERVED
    }
}




Java Source Code List

net.alphadev.fat32wrapper.Fat32Provider.java
net.alphadev.fat32wrapper.FatBlockDeviceWrapper.java
net.alphadev.fat32wrapper.FatStorage.java
net.alphadev.fat32wrapper.ReadingFileHandle.java
net.alphadev.usbstorage.DeviceManager.java
net.alphadev.usbstorage.DocumentProviderImpl.java
net.alphadev.usbstorage.StorageManager.java
net.alphadev.usbstorage.UsbBulkDevice.java
net.alphadev.usbstorage.api.Identifiable.java
net.alphadev.usbstorage.api.device.BlockDevice.java
net.alphadev.usbstorage.api.device.BulkDevice.java
net.alphadev.usbstorage.api.device.ReadOnlyException.java
net.alphadev.usbstorage.api.filesystem.FileAttribute.java
net.alphadev.usbstorage.api.filesystem.FileHandle.java
net.alphadev.usbstorage.api.filesystem.FileSystemProvider.java
net.alphadev.usbstorage.api.filesystem.Path.java
net.alphadev.usbstorage.api.filesystem.StorageDevice.java
net.alphadev.usbstorage.api.scsi.ScsiTransferable.java
net.alphadev.usbstorage.api.scsi.Transmittable.java
net.alphadev.usbstorage.bbb.BulkBlockDevice.java
net.alphadev.usbstorage.partition.FileSystemDescriptor.java
net.alphadev.usbstorage.partition.MasterBootRecord.java
net.alphadev.usbstorage.partition.PartitionParameters.java
net.alphadev.usbstorage.partition.Partition.java
net.alphadev.usbstorage.scsi.CommandBlockWrapper.java
net.alphadev.usbstorage.scsi.CommandStatusWrapper.java
net.alphadev.usbstorage.scsi.answer.ModeSenseResponse.java
net.alphadev.usbstorage.scsi.answer.ReadCapacityResponse.java
net.alphadev.usbstorage.scsi.answer.ReadFormatCapacitiesEntry.java
net.alphadev.usbstorage.scsi.answer.ReadFormatCapacitiesHeader.java
net.alphadev.usbstorage.scsi.answer.RequestSenseResponse.java
net.alphadev.usbstorage.scsi.answer.StandardInquiryAnswer.java
net.alphadev.usbstorage.scsi.command.Inquiry.java
net.alphadev.usbstorage.scsi.command.ModeSense.java
net.alphadev.usbstorage.scsi.command.Read10.java
net.alphadev.usbstorage.scsi.command.ReadCapacity.java
net.alphadev.usbstorage.scsi.command.ReadFormatCapacities.java
net.alphadev.usbstorage.scsi.command.RequestSense.java
net.alphadev.usbstorage.scsi.command.ScsiCommand.java
net.alphadev.usbstorage.scsi.command.TestUnitReady.java
net.alphadev.usbstorage.util.BitStitching.java
net.alphadev.usbstorage.util.ParcelFileDescriptorUtil.java