Files
haiku-beta6/src/kits/storage/DiskDeviceJob.cpp
T
Ingo Weinhold 48c0bc75f8 Now <syscalls.h> declares the DDM syscalls.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@9640 a95241bf-73f2-0310-859d-f6bbb57e9c96
2004-10-29 01:41:30 +00:00

168 lines
3.1 KiB
C++

//----------------------------------------------------------------------
// This software is part of the OpenBeOS distribution and is covered
// by the OpenBeOS license.
//---------------------------------------------------------------------
#include <syscalls.h>
#include <DiskDeviceJob.h>
// constructor
BDiskDeviceJob::BDiskDeviceJob()
: fID(B_NO_INIT),
fType(B_DISK_DEVICE_JOB_BAD_TYPE),
fPartitionID(-1),
fDescription()
{
}
// destructor
BDiskDeviceJob::~BDiskDeviceJob()
{
}
// InitCheck
status_t
BDiskDeviceJob::InitCheck() const
{
return (fID >= 0 ? B_OK : fID);
}
// SetTo
status_t
BDiskDeviceJob::SetTo(disk_job_id id)
{
Unset();
user_disk_device_job_info info;
status_t error = _kern_get_disk_device_job_info(id, &info);
if (error != B_OK)
return error;
return _SetTo(&info);
}
// Unset
void
BDiskDeviceJob::Unset()
{
fID = B_NO_INIT;
fType = B_DISK_DEVICE_JOB_BAD_TYPE;
fPartitionID = -1;
fDescription.SetTo(NULL);
}
// ID
disk_job_id
BDiskDeviceJob::ID() const
{
return fID;
}
// Type
uint32
BDiskDeviceJob::Type() const
{
return fType;
}
// PartitionID
partition_id
BDiskDeviceJob::PartitionID() const
{
return fPartitionID;
}
// Description
const char *
BDiskDeviceJob::Description() const
{
return fDescription.String();
}
// Status
uint32
BDiskDeviceJob::Status() const
{
if (InitCheck() != B_OK)
return B_DISK_DEVICE_JOB_UNINITIALIZED;
disk_device_job_progress_info info;
status_t error = _kern_get_disk_device_job_progress_info(fID, &info);
if (error != B_OK)
return B_DISK_DEVICE_JOB_UNINITIALIZED;
return info.status;
}
// Progress
float
BDiskDeviceJob::Progress() const
{
if (InitCheck() != B_OK)
return 0;
disk_device_job_progress_info info;
status_t error = _kern_get_disk_device_job_progress_info(fID, &info);
if (error != B_OK)
return 0;
if (info.task_count < 1 || info.task_count <= info.completed_tasks)
return 1;
if (info.current_task_progress < 0)
info.current_task_progress = 0;
if (info.current_task_progress > 1)
info.current_task_progress = 1;
return (info.completed_tasks + info.current_task_progress)
/ info.task_count;
}
// GetProgressInfo
status_t
BDiskDeviceJob::GetProgressInfo(disk_device_job_progress_info *info) const
{
if (InitCheck() != B_OK)
return InitCheck();
return _kern_get_disk_device_job_progress_info(fID, info);
}
// InterruptProperties
uint32
BDiskDeviceJob::InterruptProperties() const
{
if (InitCheck() != B_OK)
return 0;
disk_device_job_progress_info info;
status_t error = _kern_get_disk_device_job_progress_info(fID, &info);
if (error != B_OK)
return 0;
return info.interrupt_properties;
}
// Cancel
status_t
BDiskDeviceJob::Cancel(bool reverse)
{
if (InitCheck() != B_OK)
return InitCheck();
return _kern_cancel_disk_device_job(fID, reverse);
}
// Pause
status_t
BDiskDeviceJob::Pause()
{
if (InitCheck() != B_OK)
return InitCheck();
return _kern_pause_disk_device_job(fID);
}
// _SetTo
status_t
BDiskDeviceJob::_SetTo(user_disk_device_job_info *info)
{
Unset();
if (!info)
return B_BAD_VALUE;
fID = info->id;
fType = info->type;
fPartitionID = info->partition;
fDescription.SetTo(info->description);
return B_OK;
}