/* * Copyright 2002-2013 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT license. * * Authors: * Ithamar R. Adema * Stephan Aßmus * Axel Dörfler, axeld@pinc-software.de. * Bryce Groff * Erik Jaesler */ #include "Support.h" #include #include #include #include #include #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("\tPhysicalBlockSize(): %" B_PRId32 "\n", partition->PhysicalBlockSize()); 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->RawContentName()); 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(), 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; }