From a7ceac7567d73bb6713e9fa247738018fba16daf Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 27 Apr 2010 20:33:18 +0200 Subject: [PATCH 1/2] added scsi support with libusal --- libhimd/himd.h | 31 +++++++++++++- libhimd/libhimd.pro | 10 ++++- qhimdtransfer/qhimddetection.h | 1 + qhimdtransfer/qhimdformatdialog.cpp | 80 +++++++++++++++++++++++++++++++++++ qhimdtransfer/qhimdformatdialog.h | 11 +++++ qhimdtransfer/qhimdmainwindow.cpp | 27 ++++++++++-- qhimdtransfer/qhimdmainwindow.h | 1 + qhimdtransfer/qhimdwindetection.cpp | 3 +- 8 files changed, 155 insertions(+), 9 deletions(-) diff --git a/libhimd/himd.h b/libhimd/himd.h index c283c1f..f6469f4 100644 --- a/libhimd/himd.h +++ b/libhimd/himd.h @@ -60,7 +60,12 @@ enum himdstatus { HIMD_OK, HIMD_ERROR_BAD_DATA_FORMAT, HIMD_ERROR_UNSUPPORTED_ENCRYPTION, HIMD_ERROR_ENCRYPTION_FAILURE, - HIMD_ERROR_OUT_OF_MEMORY }; + HIMD_ERROR_OUT_OF_MEMORY, + HIMD_ERROR_CANT_OPEN_SCSI_DEVICE, + HIMD_ERROR_DEVICE_ALREADY_OPENED, + HIMD_ERROR_DEVICE_NOT_OPENED, + HIMD_ERROR_SCSI_COMMAND_FAILED, + HIMD_ERROR_DEVICE_NOT_READY }; /* a track on the HiMD */ struct trackinfo { @@ -195,6 +200,30 @@ struct himd_holelist { int himd_find_holes(struct himd * himd, struct himd_holelist * holes, struct himderrinfo * status); +/* himd_scsi.c */ +#ifdef CONFIG_WITH_LIBUSAL +#include +#include +#endif + +#define MAX_DEVICE_LEN 256 +#define SILENT_MODE 1 /* silent mode will prevent gui applications to crash if usal_cmd() returns < 0 */ + +struct sdev { + char device[MAX_DEVICE_LEN]; + char errstr[80]; +#ifdef CONFIG_WITH_LIBUSAL + SCSI * usalp; +#endif +}; + +void himdll_reset_device(struct sdev * sdev); +int himdll_open_device(struct sdev * sdev, int mode, struct himderrinfo * status); +int himdll_send_format_cmd(struct sdev * sdev, struct himderrinfo * status); +int himdll_wait_for_unit_ready(struct sdev * sdev, struct himderrinfo * status); +const char * himdll_get_discid(struct sdev * sdev, char * buf, int len, struct himderrinfo * status); +void himdll_close_device(struct sdev * sdev); + #ifdef __cplusplus } diff --git a/libhimd/libhimd.pro b/libhimd/libhimd.pro index 45390d0..a2eddd4 100644 --- a/libhimd/libhimd.pro +++ b/libhimd/libhimd.pro @@ -16,7 +16,13 @@ else: !build_pass: message(You disabled mcrypt: No PCM and ATRAC transfer will b } else: !build_pass: message(You disabled mad: MP3 transfer will be limited) +!without_libusal: { + LIBS += -lusal + DEFINES += CONFIG_WITH_LIBUSAL +} +else:!build_pass:message(You disabled libusal: Formating of himd will not be supported) + PKGCONFIG += glib-2.0 HEADERS += himd.h himd_private.h sony_oma.h -SOURCES += encryption.c himd.c mdstream.c trackindex.c sony_oma.c frag.c -LIBS += -lmad -lmcrypt +SOURCES += encryption.c himd.c mdstream.c trackindex.c sony_oma.c frag.c himd_scsi.c +LIBS += -lmad -lmcrypt -lusal diff --git a/qhimdtransfer/qhimddetection.h b/qhimdtransfer/qhimddetection.h index 5c30be9..5a417a6 100644 --- a/qhimdtransfer/qhimddetection.h +++ b/qhimdtransfer/qhimddetection.h @@ -24,6 +24,7 @@ struct himd_device { QString path; bool md_inserted; QString recorder_name; + QString scsi_device; virtual ~himd_device(){} /* for polymorphic delete */ }; diff --git a/qhimdtransfer/qhimdformatdialog.cpp b/qhimdtransfer/qhimdformatdialog.cpp index f3e0452..9ae4304 100644 --- a/qhimdtransfer/qhimdformatdialog.cpp +++ b/qhimdtransfer/qhimdformatdialog.cpp @@ -1,5 +1,42 @@ #include "qhimdformatdialog.h" #include "ui_qhimdformatdialog.h" +#include +#include +#include "../libhimd/himd.h" + +static void clear_device(struct sdev * sdev) +{ + memset(sdev->device, 0x0, sizeof(sdev->device)); + himdll_reset_device(sdev); +} + +static void set_device(struct sdev * sdev, QString device) +{ + clear_device(sdev); + strcpy(sdev->device, device.toLocal8Bit().data()); +} + +void QHiMDFormatDialog::open_scsidevice(QString device) +{ + struct himderrinfo status; + if(device.isEmpty()) + goto clean; + + set_device(&sdev, device); + + if(himdll_open_device(&sdev, SILENT_MODE, &status) < 0) + { + qDebug() << status.statusmsg; + goto clean; + } + + show(); + return; + +clean: + clear_device(&sdev); + emit format_finished(); +} QHiMDFormatDialog::QHiMDFormatDialog(QWidget *parent) : QDialog(parent), @@ -23,3 +60,46 @@ void QHiMDFormatDialog::changeEvent(QEvent *e) break; } } + +void QHiMDFormatDialog::closeEvent(QEvent *event) +{ + himdll_close_device(&sdev); + clear_device(&sdev); + emit format_finished(); +} + +void QHiMDFormatDialog::on_buttonBox_accepted() +{ + struct himderrinfo status; + QMessageBox formatStatus; + char buffer[0x10]; + QByteArray diskID; + QString id; + + if(himdll_send_format_cmd(&sdev, &status) < 0) + { + formatStatus.setText(tr("Error formatting HiMD:\n") + status.statusmsg); + } + else + { + if(himdll_wait_for_unit_ready(&sdev, &status) < 0) + formatStatus.setText(tr("Error formatting HiMD: ") + status.statusmsg); + else + { + diskID = QByteArray(himdll_get_discid(&sdev, buffer, sizeof(buffer), &status), sizeof(buffer)); + if(diskID.isNull()) + id = tr("not available\n") + status.statusmsg; + else + id = QString(diskID.toHex()); + formatStatus.setText(tr("HiMD successfully formatted\nNew disk ID is ") + id); + } + } + + formatStatus.exec(); + closeEvent(NULL); +} + +void QHiMDFormatDialog::on_buttonBox_rejected() +{ + closeEvent(NULL); +} \ No newline at end of file diff --git a/qhimdtransfer/qhimdformatdialog.h b/qhimdtransfer/qhimdformatdialog.h index 5b92c8a..676e961 100644 --- a/qhimdtransfer/qhimdformatdialog.h +++ b/qhimdtransfer/qhimdformatdialog.h @@ -2,6 +2,7 @@ #define QHIMDFORMATDIALOG_H #include +#include namespace Ui { class QHiMDFormatDialog; @@ -13,12 +14,22 @@ class QHiMDFormatDialog : public QDialog { public: explicit QHiMDFormatDialog(QWidget *parent = 0); virtual ~QHiMDFormatDialog(); + void open_scsidevice(QString device); protected: virtual void changeEvent(QEvent *e); + virtual void closeEvent(QEvent *event); private: Ui::QHiMDFormatDialog *m_ui; + struct sdev sdev; + +private slots: + void on_buttonBox_rejected(); + void on_buttonBox_accepted(); + +signals: + void format_finished(); }; #endif // QHIMDFORMATDIALOG_H diff --git a/qhimdtransfer/qhimdmainwindow.cpp b/qhimdtransfer/qhimdmainwindow.cpp index 359c91e..d88a4b0 100644 --- a/qhimdtransfer/qhimdmainwindow.cpp +++ b/qhimdtransfer/qhimdmainwindow.cpp @@ -154,7 +154,7 @@ QString QHiMDMainWindow::dumppcm(const QHiMDTrack & track, QString file) while(himd_nonmp3stream_read_block(&str, &data, &len, NULL, &status) >= 0) { - + for(i = 0; i < len/4; i++) { left = data[i*4]*256+data[i*4+1]; @@ -309,7 +309,7 @@ void QHiMDMainWindow::upload_to(const QString & UploadDirectory) allblocks += tracks[i].blockcount(); uploadDialog->init(tracks.length(), allblocks); - + for(int i = 0;i < tracks.length(); i++) { QString filename, errmsg; @@ -360,7 +360,7 @@ void QHiMDMainWindow::upload_to(const QString & UploadDirectory) QHiMDMainWindow::QHiMDMainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::QHiMDMainWindowClass) -{ +{ aboutDialog = new QHiMDAboutDialog; formatDialog = new QHiMDFormatDialog; uploadDialog = new QHiMDUploadDialog; @@ -374,6 +374,7 @@ QHiMDMainWindow::QHiMDMainWindow(QWidget *parent) ui->himd_devices->hide(); if(!autodetect_init()) ui->statusBar->showMessage(" autodetection disabled", 10000); + QObject::connect(formatDialog, SIGNAL(format_finished()), this, SLOT(formatDialog_finished())); } QHiMDMainWindow::~QHiMDMainWindow() @@ -423,7 +424,14 @@ void QHiMDMainWindow::on_action_About_triggered() void QHiMDMainWindow::on_action_Format_triggered() { - formatDialog->show(); + himd_device * dev = detect->find_by_path(ui->himd_devices->currentText()); + if(dev == NULL || dev->scsi_device.isEmpty()) + return; + + emit himd_busy(ui->himd_devices->currentText()); + ui->himd_devices->setEnabled(false); + ui->action_Connect->setEnabled(false); + formatDialog->open_scsidevice(dev->scsi_device); } void QHiMDMainWindow::on_action_Connect_triggered() @@ -509,11 +517,13 @@ void QHiMDMainWindow::himd_removed(QString HiMDPath) if(HiMDPath.isEmpty()) return; - if (ui->himdpath->text() == HiMDPath) + if (ui->himd_devices->currentText() == HiMDPath) { ui->himdpath->setText(tr("(disconnected)")); ui->statusBar->clearMessage(); trackmodel.close(); + if(formatDialog->isVisible()) + formatDialog->close(); } index = ui->himd_devices->findText(HiMDPath); @@ -533,3 +543,10 @@ void QHiMDMainWindow::on_himd_devices_activated(QString device) { open_himd_at(device); } + +void QHiMDMainWindow::formatDialog_finished() +{ + ui->himd_devices->setEnabled(true); + ui->action_Connect->setEnabled(true); + emit himd_idle(ui->himd_devices->currentText()); +} diff --git a/qhimdtransfer/qhimdmainwindow.h b/qhimdtransfer/qhimdmainwindow.h index 694622a..a523610 100644 --- a/qhimdtransfer/qhimdmainwindow.h +++ b/qhimdtransfer/qhimdmainwindow.h @@ -66,6 +66,7 @@ private slots: void himd_found(QString path); void himd_removed(QString path); void on_himd_devices_activated(QString device); + void formatDialog_finished(); signals: void himd_busy(QString path); diff --git a/qhimdtransfer/qhimdwindetection.cpp b/qhimdtransfer/qhimdwindetection.cpp index 1dc437a..01c6c28 100644 --- a/qhimdtransfer/qhimdwindetection.cpp +++ b/qhimdtransfer/qhimdwindetection.cpp @@ -58,7 +58,7 @@ QHiMDDetection * createDetection(QObject * parent) return new QHiMDWinDetection(parent); } -QHiMDWinDetection::QHiMDWinDetection(QObject * parent) +QHiMDWinDetection::QHiMDWinDetection(QObject * parent) : QHiMDDetection(parent), QWidget(0) { // ask for Window ID to have Qt create the window. @@ -222,6 +222,7 @@ void QHiMDWinDetection::add_himddevice(QString path, QString name) new_device->is_busy = false; new_device->path = path; new_device->recorder_name = name; + new_device->scsi_device = path.at(0); file[0] = path.at(0).toAscii(); if(OpenFile(file, &OFfile, OF_EXIST) != HFILE_ERROR) -- 1.6.4.msysgit.0