File indexing completed on 2024-04-14 04:44:45

0001 /*
0002     SPDX-FileCopyrightText: 1998-2009 Sebastian Trueg <trueg@k3b.org>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 #include "k3bscsicommand.h"
0006 #include "k3bdevice.h"
0007 
0008 #include <QDebug>
0009 
0010 
0011 QString K3b::Device::commandString( const unsigned char& command )
0012 {
0013     if( command == MMC_BLANK )
0014         return "BLANK";
0015     if( command == MMC_CLOSE_TRACK_SESSION )
0016         return "CLOSE TRACK/SESSION";
0017     if( command == MMC_ERASE )
0018         return "ERASE";
0019     if( command == MMC_FORMAT_UNIT )
0020         return "FORMAT UNIT";
0021     if( command == MMC_GET_CONFIGURATION )
0022         return "GET CONFIGURATION";
0023     if( command == MMC_GET_EVENT_STATUS_NOTIFICATION )
0024         return "GET EVENT STATUS NOTIFICATION";
0025     if( command == MMC_GET_PERFORMANCE )
0026         return "GET PERFORMANCE";
0027     if( command == MMC_INQUIRY )
0028         return "INQUIRY";
0029     if( command == MMC_LOAD_UNLOAD_MEDIUM )
0030         return "LOAD/UNLOAD MEDIUM";
0031     if( command == MMC_MECHANISM_STATUS )
0032         return "MECHANISM STATUS";
0033     if( command == MMC_MODE_SELECT )
0034         return "MODE SELECT";
0035     if( command == MMC_MODE_SENSE )
0036         return "MODE SENSE";
0037     if( command == MMC_PAUSE_RESUME )
0038         return "PAUSE/RESUME";
0039     if( command == MMC_PLAY_AUDIO_10 )
0040         return "PLAY AUDIO (10)";
0041     if( command == MMC_PLAY_AUDIO_12 )
0042         return "PLAY AUDIO (12)";
0043     if( command == MMC_PLAY_AUDIO_MSF )
0044         return "PLAY AUDIO (MSF)";
0045     if( command == MMC_PREVENT_ALLOW_MEDIUM_REMOVAL )
0046         return "PREVENT ALLOW MEDIUM REMOVAL";
0047     if( command == MMC_READ_10 )
0048         return "READ (10)";
0049     if( command == MMC_READ_12 )
0050         return "READ (12)";
0051     if( command == MMC_READ_BUFFER )
0052         return "READ BUFFER";
0053     if( command == MMC_READ_BUFFER_CAPACITY )
0054         return "READ BUFFER CAPACITY";
0055     if( command == MMC_READ_CAPACITY )
0056         return "READ CAPACITY";
0057     if( command == MMC_READ_CD )
0058         return "READ CD";
0059     if( command == MMC_READ_CD_MSF )
0060         return "READ CD MSF";
0061     if( command == MMC_READ_DISC_INFORMATION )
0062         return "READ DISC INFORMATION";
0063     if( command == MMC_READ_DVD_STRUCTURE )
0064         return "READ DVD STRUCTURE";
0065     if( command == MMC_READ_FORMAT_CAPACITIES )
0066         return "READ FORMAT CAPACITIES";
0067     if( command == MMC_READ_SUB_CHANNEL )
0068         return "READ SUB-CHANNEL";
0069     if( command == MMC_READ_TOC_PMA_ATIP )
0070         return "READ TOC/PMA/ATIP";
0071     if( command == MMC_READ_TRACK_INFORMATION )
0072         return "READ TRACK INFORMATION";
0073     if( command == MMC_REPAIR_TRACK )
0074         return "REPAIR TRACK";
0075     if( command == MMC_REPORT_KEY )
0076         return "REPORT KEY";
0077     if( command == MMC_REQUEST_SENSE )
0078         return "REQUEST SENSE";
0079     if( command == MMC_RESERVE_TRACK )
0080         return "RESERVE TRACK";
0081     if( command == MMC_SCAN )
0082         return "SCAN";
0083     if( command == MMC_SEEK_10 )
0084         return "SEEK (10)";
0085     if( command == MMC_SEND_CUE_SHEET )
0086         return "SEND CUE SHEET";
0087     if( command == MMC_SEND_DVD_STRUCTURE )
0088         return "SEND DVD STRUCTURE";
0089     if( command == MMC_SEND_KEY )
0090         return "SEND KEY";
0091     if( command == MMC_SEND_OPC_INFORMATION )
0092         return "SEND OPC INFORMATION";
0093     if( command == MMC_SET_SPEED )
0094         return "SET SPEED";
0095     if( command == MMC_SET_READ_AHEAD )
0096         return "SET READ AHEAD";
0097     if( command == MMC_SET_STREAMING )
0098         return "SET STREAMING";
0099     if( command == MMC_START_STOP_UNIT )
0100         return "START STOP UNIT";
0101     if( command == MMC_STOP_PLAY_SCAN )
0102         return "STOP PLAY/SCAN";
0103     if( command == MMC_SYNCHRONIZE_CACHE )
0104         return "SYNCHRONIZE CACHE";
0105     if( command == MMC_TEST_UNIT_READY )
0106         return "TEST UNIT READY";
0107     if( command == MMC_VERIFY_10 )
0108         return "VERIFY (10)";
0109     if( command == MMC_WRITE_10 )
0110         return "WRITE (10)";
0111     if( command == MMC_WRITE_12 )
0112         return "WRITE (12)";
0113     if( command == MMC_WRITE_AND_VERIFY_10 )
0114         return "WRITE AND VERIFY (10)";
0115     if( command == MMC_WRITE_BUFFER )
0116         return "WRITE BUFFER";
0117 
0118     return "unknown";
0119 }
0120 
0121 
0122 QString K3b::Device::ScsiCommand::senseKeyToString( int key )
0123 {
0124     switch( key ) {
0125     case 0x0:
0126         return "NO SENSE (2)";
0127     case 0x1:
0128         return "RECOVERED ERROR (1)";
0129     case 0x2:
0130         return "NOT READY (2)";
0131     case 0x3:
0132         return "MEDIUM ERROR (3)";
0133     case 0x4:
0134         return "HARDWARE ERROR (4)";
0135     case 0x5:
0136         return "ILLEGAL REQUEST (5)";
0137     case 0x6:
0138         return "UNIT ATTENTION (6)";
0139     case 0x7:
0140         return "DATA PROTECT (7)";
0141     case 0x8:
0142         return "BLANK CHECK (8)";
0143     case 0x9:
0144         return "VENDOR SPECIFIC (9)";
0145     case 0xA:
0146         return "COPY ABORTED (A)";
0147     case 0xB:
0148         return "ABORTED COMMAND (B)";
0149     case 0xC:
0150         return "0xC is obsolete... ??";
0151     }
0152 
0153     return "unknown";
0154 }
0155 
0156 
0157 void K3b::Device::ScsiCommand::debugError( int command, int errorCode, int senseKey, int asc, int ascq ) {
0158     if( m_printErrors ) {
0159         qDebug() << "(K3b::Device::ScsiCommand) failed: " << Qt::endl
0160                  << "                           command:    " << QString("%1 (%2)")
0161             .arg( K3b::Device::commandString( command ) )
0162             .arg( QString::number(command, 16) ) << Qt::endl
0163                  << "                           errorcode:  " << QString::number(errorCode, 16) << Qt::endl
0164                  << "                           sense key:  " << senseKeyToString(senseKey) << Qt::endl
0165                  << "                           asc:        " << QString::number(asc, 16) << Qt::endl
0166                  << "                           ascq:       " << QString::number(ascq, 16) << Qt::endl;
0167     }
0168 }
0169 
0170 
0171 
0172 #ifdef Q_OS_LINUX
0173 #include "k3bscsicommand_linux.cpp"
0174 #endif
0175 #ifdef Q_OS_FREEBSD
0176 #include "k3bscsicommand_bsd.cpp"
0177 #endif
0178 #ifdef Q_OS_NETBSD
0179 #include "k3bscsicommand_netbsd.cpp"
0180 #endif
0181 #ifdef Q_OS_WIN32
0182 #include "k3bscsicommand_win.cpp"
0183 #endif
0184 
0185 
0186 K3b::Device::ScsiCommand::ScsiCommand( const K3b::Device::Device* dev )
0187     : d(new Private),
0188       m_device(dev),
0189       m_printErrors(true)
0190 {
0191     clear();
0192 }
0193 
0194 
0195 K3b::Device::ScsiCommand::~ScsiCommand()
0196 {
0197     delete d;
0198 }
0199