/*
 * Copyright 2007, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
 
#include "MoveJob.h"
 
#include <new>
 
#include <AutoDeleter.h>
 
#include <syscalls.h>
 
#include "DiskDeviceUtils.h"
#include "PartitionReference.h"
 
 
using std::nothrow;
 
 
// constructor
MoveJob::MoveJob(PartitionReference* partition, PartitionReference* child)
	: DiskDeviceJob(partition, child),
	  fContents(NULL),
	  fContentsCount(0)
{
}
 
 
// destructor
MoveJob::~MoveJob()
{
	if (fContents) {
		for (int32 i = 0; i < fContentsCount; i++)
			fContents[i]->ReleaseReference();
		delete[] fContents;
	}
}
 
 
// Init
status_t
MoveJob::Init(off_t offset, PartitionReference** contents, int32 contentsCount)
{
	fContents = new(nothrow) PartitionReference*[contentsCount];
	if (!fContents)
		return B_NO_MEMORY;
 
	fContentsCount = contentsCount;
	for (int32 i = 0; i < contentsCount; i++) {
		fContents[i] = contents[i];
		fContents[i]->AcquireReference();
	}
 
	fOffset = offset;
 
	return B_OK;
}
 
 
// Do
status_t
MoveJob::Do()
{
	int32 changeCounter = fPartition->ChangeCounter();
	int32 childChangeCounter = fChild->ChangeCounter();
 
	partition_id* descendantIDs = new(nothrow) partition_id[fContentsCount];
	int32* descendantChangeCounters = new(nothrow) int32[fContentsCount];
	ArrayDeleter<partition_id> _(descendantIDs);
	ArrayDeleter<int32> _2(descendantChangeCounters);
 
	if (!descendantIDs || !descendantChangeCounters)
		return B_NO_MEMORY;
 
	for (int32 i = 0; i < fContentsCount; i++) {
		descendantIDs[i] = fContents[i]->PartitionID();
		descendantChangeCounters[i] = fContents[i]->ChangeCounter();
	}
 
	status_t error = _kern_move_partition(fPartition->PartitionID(),
		&changeCounter, fChild->PartitionID(), &childChangeCounter, fOffset,
		descendantIDs, descendantChangeCounters, fContentsCount);
 
	if (error != B_OK)
		return error;
 
	fPartition->SetChangeCounter(changeCounter);
	fChild->SetChangeCounter(childChangeCounter);
 
	for (int32 i = 0; i < fContentsCount; i++)
		fContents[i]->SetChangeCounter(descendantChangeCounters[i]);
 
	return B_OK;
}
 

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