From 37333bf25ad9a4c538250f5af2f9f1d666362883 Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features. BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdeadmin@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- kdat/TapeDrive.h | 247 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 247 insertions(+) create mode 100644 kdat/TapeDrive.h (limited to 'kdat/TapeDrive.h') diff --git a/kdat/TapeDrive.h b/kdat/TapeDrive.h new file mode 100644 index 0000000..4709eed --- /dev/null +++ b/kdat/TapeDrive.h @@ -0,0 +1,247 @@ +// KDat - a tar-based DAT archiver +// Copyright (C) 1998-2000 Sean Vyain, svyain@mail.tds.net +// Copyright (C) 2001-2002 Lawrence Widman, kdat@cardiothink.com +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +#ifndef _TapeDrive_h_ +#define _TapeDrive_h_ + +#include + +class Tape; + +/** + * @short An OO interface to the tape drive. + */ +class TapeDrive : public QObject { + Q_OBJECT + int _fd; + bool _readOnly; + Tape* _tape; + char* _writeBuf; + char* _readBuf; + int _writeBufIdx; + int _readBufIdx; + + static TapeDrive* _instance; + + TapeDrive(); +public: + /** + * Destroy the tape drive (figuratively speaking, of course). + */ + ~TapeDrive(); + + /** + * Get a reference to the single instance of the tape drive object. + * + * @return A pointer to the tape drive object. + */ + static TapeDrive* instance(); + + /** + * Close the tape device. If data was written to the tape drive, then this + * will also cause a single end-of-file marker to be written out. This is + * the preferred way to write an end-of-file marker to the tape. + */ + void close(); + + /** + * Physically eject the tape from the drive. Some tape drives do not + * support this operation well. + */ + void eject(); + + /** + * If there is unwritten data in the buffer, it will be flushed out. This + * method is called when necessary by the other tape drive methods. + */ + void flush(); + + /** + * Get the current tape file number. The first tape file is number 0. + * + * @return >= 0 on success, -1 on failure. + */ + int getFile(); + + /** + * Get the current tape block number within the current file. The first + * tape block number within a file is 0. + * + * @return >= 0 on success, -1 on failure. + */ + int getBlock(); + + /** + * Determine whether the tape can be written to. + * + * @return TRUE if the tape cannot be written to, otherwise FALSE. + */ + bool isReadOnly(); + + /** + * Determine whether there is a tape in the drive. + * + * @return TRUE if there is a tape, otherwise FALSE. + */ + bool isTapePresent(); + + /** + * Load the tape into the drive. + * + * @return TRUE on success, otherwise FALSE. + */ + bool load(); + + /** + * Lock the tape in the drive, so that it cannot be ejected manually by the + * user. Not all tape drives support this operation. + * + * @return TRUE on success, otherwise FALSE. + */ + bool lock(); + + /** + * Skip over one or more end-of-file markers on the tape. The tape is + * positioned just after the last skipped end-of-file marker. + * + * @param count The number of end-of-file markers to skip over. + * + * @return TRUE on success, otherwise FALSE. + */ + bool nextFile( int count ); + + /** + * Skip over one or more tape blocks within the current tape file. + * + * @param count The number of tape blocks to skip over. + * + * @return TRUE on success, otherwise FALSE. + */ + bool nextRecord( int count ); + + /** + * Open the tape device for reading and writing. If this fails, try + * opening the tape device for reading only. Check isReadOnly() to see + * if the tape device was opened for reading and writing. + * + * @return TRUE if the tape device was opened for reading and/or writing, + * otherwise FALSE. + */ + void open(); + + /** + * Determine wether the tape is positioned just after an end-of-file + * marker. + * + * @return TRUE if the tape is positioned after an end-of-file marker, + * otherwise FALSE. + */ + bool pastEOF(); + + /** + * Backspace over one or more end-of-file markers. The tape is positioned + * just before the last end-of-file marker. + * + * @param count The number of end-of-file markers to backspace over. + * + * @return TRUE on success, otherwise FALSE. + */ + bool prevFile( int count ); + + /** + * Backspace over one or more tape blocks. + * + * @param count The number of tape block to backspace over. + * + * @return TRUE on success, otherwise FALSE. + */ + bool prevRecord( int count ); + + /** + * Read data from the tape. + * + * @param buf The buffer to read into. + * @param len The number of bytes to read. + * + * @return The actual number of bytes read, or -1 on failure. + */ + int read( char* buf, int len ); + + /** + * Read the KDat tape header (if there is one), and get the index + * associated with the tape. + * + * @return A pointer to the tape index, or NULL if the tape does not have + * a KDat header. + */ + Tape* readHeader(); + + /** + * Rewind the tape. + * + * @return TRUE on success, otherwise FALSE. + */ + bool rewind(); + + /** + * Move the tape to the given tar block within the given tape file. This + * method will intelligently move the tape to the desired position. + * + * @param file The tape file number. + * @param tarBlock The desired tar block (NOT tape block). + * + * @return TRUE on success, otherwise FALSE. + */ + bool seek( int file, int tarBlock ); + + /** + * Set the hardware tape block size. + * + * @param blockSize The new tape block size in bytes. + * + * @return TRUE on success, otherwise FALSE. + */ + bool setBlockSize( int blockSize ); + + /** + * Unlock the tape in the drive, so that it can be ejected manually by the + * user. Not all tape drives support this operation. + * + * @return TRUE on success, otherwise FALSE. + */ + bool unlock(); + + /** + * Write data to the tape. + * + * @param buf The buffer to write from. + * @param len The number of bytes to write. + * + * @return The actual number of bytes written, or -1 on failure. + */ + int write( const char* buf, int len ); +signals: + /** + * This signal is emitted for one-line, informational messages. + * + * @param msg The informational message. + */ + void sigStatus( const QString & msg ); +}; + +#endif -- cgit v1.2.1