haiku/src/apps/drivesetup/Support.cpp

192 lines
4.4 KiB
C++

/*
* Copyright 2002-2013 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT license.
*
* Authors:
* Ithamar R. Adema <ithamar@unet.nl>
* Stephan Aßmus <superstippi@gmx.de>
* Axel Dörfler, axeld@pinc-software.de.
* Bryce Groff <bgroff@hawaii.edu>
* Erik Jaesler <ejakowatz@users.sourceforge.net>
*/
#include "Support.h"
#include <stdio.h>
#include <Catalog.h>
#include <Locale.h>
#include <Partition.h>
#include <String.h>
#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "Support"
static const int32 kMaxSliderLimit = 0x7fffff80;
// this is the maximum value that BSlider seem to work with fine
void
dump_partition_info(const BPartition* partition)
{
char size[1024];
printf("\tOffset(): %" B_PRIdOFF "\n", partition->Offset());
printf("\tSize(): %s\n", string_for_size(partition->Size(), size,
sizeof(size)));
printf("\tContentSize(): %s\n", string_for_size(partition->ContentSize(),
size, sizeof(size)));
printf("\tBlockSize(): %" B_PRId32 "\n", partition->BlockSize());
printf("\tIndex(): %" B_PRId32 "\n", partition->Index());
printf("\tStatus(): %" B_PRId32 "\n\n", partition->Status());
printf("\tContainsFileSystem(): %s\n",
partition->ContainsFileSystem() ? "true" : "false");
printf("\tContainsPartitioningSystem(): %s\n\n",
partition->ContainsPartitioningSystem() ? "true" : "false");
printf("\tIsDevice(): %s\n", partition->IsDevice() ? "true" : "false");
printf("\tIsReadOnly(): %s\n", partition->IsReadOnly() ? "true" : "false");
printf("\tIsMounted(): %s\n", partition->IsMounted() ? "true" : "false");
printf("\tIsBusy(): %s\n\n", partition->IsBusy() ? "true" : "false");
printf("\tFlags(): %" B_PRIx32 "\n\n", partition->Flags());
printf("\tName(): %s\n", partition->Name());
printf("\tContentName(): %s\n", partition->ContentName());
printf("\tType(): %s\n", partition->Type());
printf("\tContentType(): %s\n", partition->ContentType());
printf("\tID(): %" B_PRIx32 "\n\n", partition->ID());
}
bool
is_valid_partitionable_space(size_t size)
{
// TODO: remove this again, the DiskDeviceAPI should
// not even show these spaces to begin with
return size >= 8 * 1024 * 1024;
}
// #pragma mark - SpaceIDMap
SpaceIDMap::SpaceIDMap()
:
HashMap<HashString, partition_id>(),
fNextSpaceID(-2)
{
}
SpaceIDMap::~SpaceIDMap()
{
}
partition_id
SpaceIDMap::SpaceIDFor(partition_id parentID, off_t spaceOffset)
{
BString key;
key << parentID << ':' << (uint64)spaceOffset;
if (ContainsKey(key.String()))
return Get(key.String());
partition_id newID = fNextSpaceID--;
Put(key.String(), newID);
return newID;
}
// #pragma mark -
SizeSlider::SizeSlider(const char* name, const char* label,
BMessage* message, off_t offset, off_t size, uint32 minGranularity)
:
BSlider(name, label, message, 0, kMaxSliderLimit, B_HORIZONTAL,
B_TRIANGLE_THUMB),
fStartOffset(offset),
fEndOffset(offset + size),
fMaxPartitionSize(size),
fGranularity(minGranularity)
{
rgb_color fillColor = ui_color(B_CONTROL_HIGHLIGHT_COLOR);
UseFillColor(true, &fillColor);
// Lazy loop to get a power of two granularity
while (size / fGranularity > kMaxSliderLimit)
fGranularity *= 2;
SetKeyIncrementValue(int32(1024 * 1024 * 1.0 * kMaxSliderLimit
/ ((MaxPartitionSize() - 1) / fGranularity) + 0.5));
char buffer[64];
char minString[64];
char maxString[64];
snprintf(minString, sizeof(minString), B_TRANSLATE("Offset: %s"),
string_for_size(fStartOffset, buffer, sizeof(buffer)));
snprintf(maxString, sizeof(maxString), B_TRANSLATE("End: %s"),
string_for_size(fEndOffset, buffer, sizeof(buffer)));
SetLimitLabels(minString, maxString);
}
SizeSlider::~SizeSlider()
{
}
void
SizeSlider::SetValue(int32 value)
{
BSlider::SetValue(value);
fSize = (off_t(1.0 * (MaxPartitionSize() - 1) * Value()
/ kMaxSliderLimit + 0.5) / fGranularity) * fGranularity;
}
const char*
SizeSlider::UpdateText() const
{
return string_for_size(Size(), fStatusLabel, sizeof(fStatusLabel));
}
off_t
SizeSlider::Size() const
{
return fSize;
}
void
SizeSlider::SetSize(off_t size)
{
if (size == fSize)
return;
SetValue(int32(1.0 * kMaxSliderLimit / fGranularity * size
/ ((MaxPartitionSize() - 1) / fGranularity) + 0.5));
fSize = size;
UpdateTextChanged();
}
off_t
SizeSlider::Offset() const
{
// TODO: This should be the changed offset once a double
// headed slider is implemented.
return fStartOffset;
}
off_t
SizeSlider::MaxPartitionSize() const
{
return fMaxPartitionSize;
}