File indexing completed on 2025-03-16 04:29:57
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