/*
 * Copyright 2003-2011, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
 
 
#include <stdio.h>
#include <stdlib.h>
 
#include <KernelExport.h>
#include <util/kernel_cpp.h>
 
#include "ddm_userland_interface.h"
#include "KDiskDeviceManager.h"
#include "KDiskDeviceUtils.h"
#include "KDiskSystem.h"
 
 
// debugging
//#define TRACE_KDISK_SYSTEM
#ifdef TRACE_KDISK_SYSTEM
#	define TRACE(x...) dprintf(x)
#else
#	define TRACE(x...)	do { } while (false)
#endif
 
 
// constructor
KDiskSystem::KDiskSystem(const char *name)
	: fID(_NextID()),
	  fName(NULL),
	  fShortName(NULL),
	  fPrettyName(NULL),
	  fLoadCounter(0)
{
	set_string(fName, name);
}
 
 
// destructor
KDiskSystem::~KDiskSystem()
{
	free(fName);
	free(fShortName);
	free(fPrettyName);
}
 
 
// Init
status_t
KDiskSystem::Init()
{
	return fName ? B_OK : B_NO_MEMORY;
}
 
 
// SetID
/*void
KDiskSystem::SetID(disk_system_id id)
{
	fID = id;
}*/
 
 
// ID
disk_system_id
KDiskSystem::ID() const
{
	return fID;
}
 
 
// Name
const char *
KDiskSystem::Name() const
{
	return fName;
}
 
 
// ShortName
const char *
KDiskSystem::ShortName() const
{
	return fShortName;
}
 
 
// PrettyName
const char *
KDiskSystem::PrettyName() const
{
	return fPrettyName;
}
 
 
// Flags
uint32
KDiskSystem::Flags() const
{
	return fFlags;
}
 
 
// IsFileSystem
bool
KDiskSystem::IsFileSystem() const
{
	return (fFlags & B_DISK_SYSTEM_IS_FILE_SYSTEM);
}
 
 
// IsPartitioningSystem
bool
KDiskSystem::IsPartitioningSystem() const
{
	return !(fFlags & B_DISK_SYSTEM_IS_FILE_SYSTEM);
}
 
 
// GetInfo
void
KDiskSystem::GetInfo(user_disk_system_info *info)
{
	if (!info)
		return;
 
	info->id = ID();
	strlcpy(info->name, Name(), sizeof(info->name));
	strlcpy(info->short_name, ShortName(), sizeof(info->short_name));
	strlcpy(info->pretty_name, PrettyName(), sizeof(info->pretty_name));
	info->flags = Flags();
}
 
 
// Load
status_t
KDiskSystem::Load()
{
	ManagerLocker locker(KDiskDeviceManager::Default());
TRACE("KDiskSystem::Load(): %s -> %ld\n", Name(), fLoadCounter + 1);
	status_t error = B_OK;
	if (fLoadCounter == 0)
		error = LoadModule();
	if (error == B_OK)
		fLoadCounter++;
	return error;
}
 
 
// Unload
void
KDiskSystem::Unload()
{
	ManagerLocker locker(KDiskDeviceManager::Default());
TRACE("KDiskSystem::Unload(): %s -> %ld\n", Name(), fLoadCounter - 1);
	if (fLoadCounter > 0 && --fLoadCounter == 0)
		UnloadModule();
}
 
 
// IsLoaded
bool
KDiskSystem::IsLoaded() const
{
	ManagerLocker locker(KDiskDeviceManager::Default());
	return (fLoadCounter > 0);
}
 
 
// Identify
float
KDiskSystem::Identify(KPartition *partition, void **cookie)
{
	// to be implemented by derived classes
	return -1;
}
 
 
// Scan
status_t
KDiskSystem::Scan(KPartition *partition, void *cookie)
{
	// to be implemented by derived classes
	return B_ERROR;
}
 
 
// FreeIdentifyCookie
void
KDiskSystem::FreeIdentifyCookie(KPartition *partition, void *cookie)
{
	// to be implemented by derived classes
}
 
 
// FreeCookie
void
KDiskSystem::FreeCookie(KPartition *partition)
{
	// to be implemented by derived classes
}
 
 
// FreeContentCookie
void
KDiskSystem::FreeContentCookie(KPartition *partition)
{
	// to be implemented by derived classes
}
 
 
// Defragment
status_t
KDiskSystem::Defragment(KPartition* partition, disk_job_id job)
{
	// to be implemented by derived classes
	return B_ERROR;
}
 
 
// Repair
status_t
KDiskSystem::Repair(KPartition* partition, bool checkOnly, disk_job_id job)
{
	// to be implemented by derived classes
	return B_ERROR;
}
 
 
// Resize
status_t
KDiskSystem::Resize(KPartition* partition, off_t size, disk_job_id job)
{
	// to be implemented by derived classes
	return B_ERROR;
}
 
 
// ResizeChild
status_t
KDiskSystem::ResizeChild(KPartition* child, off_t size, disk_job_id job)
{
	// to be implemented by derived classes
	return B_ERROR;
}
 
 
// Move
status_t
KDiskSystem::Move(KPartition* partition, off_t offset, disk_job_id job)
{
	// to be implemented by derived classes
	return B_ERROR;
}
 
 
// MoveChild
status_t
KDiskSystem::MoveChild(KPartition* child, off_t offset, disk_job_id job)
{
	// to be implemented by derived classes
	return B_ERROR;
}
 
 
// SetName
status_t
KDiskSystem::SetName(KPartition* partition, const char* name, disk_job_id job)
{
	// to be implemented by derived classes
	return B_ERROR;
}
 
 
// SetContentName
status_t
KDiskSystem::SetContentName(KPartition* partition, const char* name,
	disk_job_id job)
{
	// to be implemented by derived classes
	return B_ERROR;
}
 
 
// SetType
status_t
KDiskSystem::SetType(KPartition* partition, const char *type, disk_job_id job)
{
	// to be implemented by derived classes
	return B_ERROR;
}
 
 
// SetParameters
status_t
KDiskSystem::SetParameters(KPartition* partition, const char* parameters,
	disk_job_id job)
{
	// to be implemented by derived classes
	return B_ERROR;
}
 
 
// SetContentParameters
status_t
KDiskSystem::SetContentParameters(KPartition* partition,
	const char* parameters, disk_job_id job)
{
	// to be implemented by derived classes
	return B_ERROR;
}
 
 
// Initialize
status_t
KDiskSystem::Initialize(KPartition* partition, const char* name,
	const char* parameters, disk_job_id job)
{
	// to be implemented by derived classes
	return B_ERROR;
}
 
 
status_t
KDiskSystem::Uninitialize(KPartition* partition, disk_job_id job)
{
	// to be implemented by derived classes
	return B_NOT_SUPPORTED;
}
 
 
// CreateChild
status_t
KDiskSystem::CreateChild(KPartition* partition, off_t offset, off_t size,
	const char* type, const char* name, const char* parameters, disk_job_id job,
	KPartition **child, partition_id childID)
{
	// to be implemented by derived classes
	return B_ERROR;
}
 
 
// DeleteChild
status_t
KDiskSystem::DeleteChild(KPartition* child, disk_job_id job)
{
	// to be implemented by derived classes
	return B_ERROR;
}
 
 
// LoadModule
status_t
KDiskSystem::LoadModule()
{
	// to be implemented by derived classes
	return B_ERROR;
}
 
 
// UnloadModule
void
KDiskSystem::UnloadModule()
{
	// to be implemented by derived classes
}
 
 
// SetShortName
status_t
KDiskSystem::SetShortName(const char *name)
{
	return set_string(fShortName, name);
}
 
 
// SetPrettyName
status_t
KDiskSystem::SetPrettyName(const char *name)
{
	return set_string(fPrettyName, name);
}
 
 
// SetFlags
void
KDiskSystem::SetFlags(uint32 flags)
{
	fFlags = flags;
}
 
 
// _NextID
int32
KDiskSystem::_NextID()
{
	return atomic_add(&fNextID, 1);
}
 
 
// fNextID
int32 KDiskSystem::fNextID = 0;
 

V730 Not all members of a class are initialized inside the constructor. Consider inspecting: fFlags.