Imported ViewState.cpp|h 1.2 from OpenTracker CVS.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18996 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2006-10-04 13:06:39 +00:00
parent 1f9f5e4e63
commit f974492c2d
2 changed files with 211 additions and 201 deletions
+116 -114
View File
@@ -32,9 +32,6 @@ names are registered trademarks or trademarks of their respective holders.
All rights reserved. All rights reserved.
*/ */
#include <string.h>
#include <stdlib.h>
#include <Debug.h> #include <Debug.h>
#include <AppDefs.h> #include <AppDefs.h>
#include <InterfaceDefs.h> #include <InterfaceDefs.h>
@@ -45,6 +42,11 @@ All rights reserved.
#include "Utilities.h" #include "Utilities.h"
#include "ViewState.h" #include "ViewState.h"
#include <new>
#include <string.h>
#include <stdlib.h>
const char *kColumnVersionName = "BColumn:version"; const char *kColumnVersionName = "BColumn:version";
const char *kColumnTitleName = "BColumn:fTitle"; const char *kColumnTitleName = "BColumn:fTitle";
const char *kColumnOffsetName = "BColumn:fOffset"; const char *kColumnOffsetName = "BColumn:fOffset";
@@ -56,25 +58,41 @@ const char *kColumnAttrTypeName = "BColumn:fAttrType";
const char *kColumnStatFieldName = "BColumn:fStatField"; const char *kColumnStatFieldName = "BColumn:fStatField";
const char *kColumnEditableName = "BColumn:fEditable"; const char *kColumnEditableName = "BColumn:fEditable";
BColumn::BColumn(const char *title, float offset, float width, alignment a, const char *kViewStateVersionName = "ViewState:version";
const char *attributeName, uint32 attr_type, bool stat_field, const char *kViewStateViewModeName = "ViewState:fViewMode";
const char *kViewStateLastIconModeName = "ViewState:fLastIconMode";
const char *kViewStateListOriginName = "ViewState:fListOrigin";
const char *kViewStateIconOriginName = "ViewState:fIconOrigin";
const char *kViewStatePrimarySortAttrName = "ViewState:fPrimarySortAttr";
const char *kViewStatePrimarySortTypeName = "ViewState:fPrimarySortType";
const char *kViewStateSecondarySortAttrName = "ViewState:fSecondarySortAttr";
const char *kViewStateSecondarySortTypeName = "ViewState:fSecondarySortType";
const char *kViewStateReverseSortName = "ViewState:fReverseSort";
const char *kViewStateIconSizeName = "ViewState:fIconSize";
BColumn::BColumn(const char *title, float offset, float width, alignment align,
const char *attributeName, uint32 attrType, bool statField,
bool editable) bool editable)
: fTitle(title), :
fTitle(title),
fAttrName(attributeName) fAttrName(attributeName)
{ {
fOffset = offset; fOffset = offset;
fWidth = width; fWidth = width;
fAlignment = a; fAlignment = align;
fAttrHash = AttrHashString(attributeName, attr_type); fAttrHash = AttrHashString(attributeName, attrType);
fAttrType = attr_type; fAttrType = attrType;
fStatField = stat_field; fStatField = statField;
fEditable = editable; fEditable = editable;
} }
BColumn::~BColumn() BColumn::~BColumn()
{ {
} }
BColumn::BColumn(BMallocIO *stream, bool endianSwap) BColumn::BColumn(BMallocIO *stream, bool endianSwap)
{ {
StringFromStream(&fTitle, stream, endianSwap); StringFromStream(&fTitle, stream, endianSwap);
@@ -98,6 +116,7 @@ BColumn::BColumn(BMallocIO *stream, bool endianSwap)
} }
} }
BColumn::BColumn(const BMessage &message, int32 index) BColumn::BColumn(const BMessage &message, int32 index)
{ {
message.FindString(kColumnTitleName, index, &fTitle); message.FindString(kColumnTitleName, index, &fTitle);
@@ -111,6 +130,7 @@ BColumn::BColumn(const BMessage &message, int32 index)
message.FindBool(kColumnEditableName, index, &fEditable); message.FindBool(kColumnEditableName, index, &fEditable);
} }
BColumn * BColumn *
BColumn::InstantiateFromStream(BMallocIO *stream, bool endianSwap) BColumn::InstantiateFromStream(BMallocIO *stream, bool endianSwap)
{ {
@@ -118,7 +138,6 @@ BColumn::InstantiateFromStream(BMallocIO *stream, bool endianSwap)
uint32 key = AttrHashString("BColumn", B_OBJECT_TYPE); uint32 key = AttrHashString("BColumn", B_OBJECT_TYPE);
int32 version = kColumnStateArchiveVersion; int32 version = kColumnStateArchiveVersion;
if (endianSwap) { if (endianSwap) {
key = SwapUInt32(key); key = SwapUInt32(key);
version = SwapInt32(version); version = SwapInt32(version);
@@ -129,28 +148,9 @@ BColumn::InstantiateFromStream(BMallocIO *stream, bool endianSwap)
return 0; return 0;
// PRINT(("instantiating column, %s\n", endianSwap ? "endian swapping," : "")); // PRINT(("instantiating column, %s\n", endianSwap ? "endian swapping," : ""));
BColumn *result = new BColumn(stream, endianSwap); return _Sanitize(new (std::nothrow) BColumn(stream, endianSwap));
// sanity-check the resulting column
if (result->fTitle.Length() > 500
|| result->fOffset < 0
|| result->fOffset > 10000
|| result->fWidth < 0
|| result->fWidth > 10000
|| (int32)result->fAlignment < B_ALIGN_LEFT
|| (int32)result->fAlignment > B_ALIGN_CENTER
|| result->fAttrName.Length() > 500) {
PRINT(("column data not valid\n"));
delete result;
return 0;
} }
#if DEBUG
else if (endianSwap)
PRINT(("Instantiated foreign column ok\n"));
#endif
return result;
}
BColumn * BColumn *
BColumn::InstantiateFromMessage(const BMessage &message, int32 index) BColumn::InstantiateFromMessage(const BMessage &message, int32 index)
@@ -164,23 +164,9 @@ BColumn::InstantiateFromMessage(const BMessage &message, int32 index)
if (version != messageVersion) if (version != messageVersion)
return NULL; return NULL;
BColumn *result = new BColumn(message, index); return _Sanitize(new (std::nothrow) BColumn(message, index));
}
// sanity-check the resulting column
if (result->fTitle.Length() > 500
|| result->fOffset < 0
|| result->fOffset > 10000
|| result->fWidth < 0
|| result->fWidth > 10000
|| (int32)result->fAlignment < B_ALIGN_LEFT
|| (int32)result->fAlignment > B_ALIGN_CENTER
|| result->fAttrName.Length() > 500) {
PRINT(("column data not valid\n"));
delete result;
return NULL;
}
return result;
}
void void
BColumn::ArchiveToStream(BMallocIO *stream) const BColumn::ArchiveToStream(BMallocIO *stream) const
@@ -204,6 +190,7 @@ BColumn::ArchiveToStream(BMallocIO *stream) const
stream->Write(&fEditable, sizeof(bool)); stream->Write(&fEditable, sizeof(bool));
} }
void void
BColumn::ArchiveToMessage(BMessage &message) const BColumn::ArchiveToMessage(BMessage &message) const
{ {
@@ -220,17 +207,37 @@ BColumn::ArchiveToMessage(BMessage &message) const
message.AddBool(kColumnEditableName, fEditable); message.AddBool(kColumnEditableName, fEditable);
} }
const char *kViewStateVersionName = "ViewState:version";
const char *kViewStateViewModeName = "ViewState:fViewMode"; BColumn *
const char *kViewStateLastIconModeName = "ViewState:fLastIconMode"; BColumn::_Sanitize(BColumn *column)
const char *kViewStateListOriginName = "ViewState:fListOrigin"; {
const char *kViewStateIconOriginName = "ViewState:fIconOrigin"; if (column == NULL)
const char *kViewStatePrimarySortAttrName = "ViewState:fPrimarySortAttr"; return NULL;
const char *kViewStatePrimarySortTypeName = "ViewState:fPrimarySortType";
const char *kViewStateSecondarySortAttrName = "ViewState:fSecondarySortAttr"; // sanity-check the resulting column
const char *kViewStateSecondarySortTypeName = "ViewState:fSecondarySortType"; if (column->fTitle.Length() > 500
const char *kViewStateReverseSortName = "ViewState:fReverseSort"; || column->fOffset < 0
const char *kViewStateIconSizeName = "ViewState:fIconSize"; || column->fOffset > 10000
|| column->fWidth < 0
|| column->fWidth > 10000
|| (int32)column->fAlignment < B_ALIGN_LEFT
|| (int32)column->fAlignment > B_ALIGN_CENTER
|| column->fAttrName.Length() > 500) {
PRINT(("column data not valid\n"));
delete column;
return NULL;
}
#if DEBUG
else if (endianSwap)
PRINT(("Instantiated foreign column ok\n"));
#endif
return column;
}
// #pragma mark -
BViewState::BViewState() BViewState::BViewState()
{ {
@@ -247,6 +254,7 @@ BViewState::BViewState()
fStateNeedsSaving = false; fStateNeedsSaving = false;
} }
BViewState::BViewState(BMallocIO *stream, bool endianSwap) BViewState::BViewState(BMallocIO *stream, bool endianSwap)
{ {
stream->Read(&fViewMode, sizeof(uint32)); stream->Read(&fViewMode, sizeof(uint32));
@@ -273,15 +281,12 @@ BViewState::BViewState(BMallocIO *stream, bool endianSwap)
fSecondarySortType = B_SWAP_INT32(fSecondarySortType); fSecondarySortType = B_SWAP_INT32(fSecondarySortType);
} }
// assure a sane state
if (fIconSize < 16)
fIconSize = 16;
if (fIconSize > 64)
fIconSize = 64;
fStateNeedsSaving = false; fStateNeedsSaving = false;
_Sanitize(this, true);
} }
BViewState::BViewState(const BMessage &message) BViewState::BViewState(const BMessage &message)
{ {
message.FindInt32(kViewStateViewModeName, (int32 *)&fViewMode); message.FindInt32(kViewStateViewModeName, (int32 *)&fViewMode);
@@ -293,17 +298,12 @@ BViewState::BViewState(const BMessage &message)
message.FindInt32(kViewStateSecondarySortAttrName, (int32 *)&fSecondarySortAttr); message.FindInt32(kViewStateSecondarySortAttrName, (int32 *)&fSecondarySortAttr);
message.FindInt32(kViewStateSecondarySortTypeName, (int32 *)&fSecondarySortType); message.FindInt32(kViewStateSecondarySortTypeName, (int32 *)&fSecondarySortType);
message.FindBool(kViewStateReverseSortName, &fReverseSort); message.FindBool(kViewStateReverseSortName, &fReverseSort);
message.FindInt32(kViewStateIconSizeName, (int32 *)&fIconSize);
// assure a sane state
if (fIconSize < 16)
fIconSize = 16;
if (fIconSize > 64)
fIconSize = 64;
fStateNeedsSaving = false; fStateNeedsSaving = false;
_Sanitize(this, true);
} }
void void
BViewState::ArchiveToStream(BMallocIO *stream) const BViewState::ArchiveToStream(BMallocIO *stream) const
{ {
@@ -344,7 +344,6 @@ BViewState::ArchiveToMessage(BMessage &message) const
} }
BViewState * BViewState *
BViewState::InstantiateFromStream(BMallocIO *stream, bool endianSwap) BViewState::InstantiateFromStream(BMallocIO *stream, bool endianSwap)
{ {
@@ -360,65 +359,68 @@ BViewState::InstantiateFromStream(BMallocIO *stream, bool endianSwap)
if (!ValidateStream(stream, key, version)) if (!ValidateStream(stream, key, version))
return NULL; return NULL;
BViewState *result = new BViewState(stream, endianSwap); return _Sanitize(new (std::nothrow) BViewState(stream, endianSwap));
// do a sanity check here
if ((result->fViewMode != kListMode
&& result->fViewMode != kIconMode
&& result->fViewMode != kMiniIconMode
&& result->fViewMode != kScaleIconMode
&& result->fViewMode != 0)
|| (result->fLastIconMode != kListMode
&& result->fLastIconMode != kIconMode
&& result->fLastIconMode != kMiniIconMode
&& result->fLastIconMode != kScaleIconMode
&& result->fLastIconMode != 0)) {
PRINT(("Bad data instantiating ViewState, view mode %x, lastIconMode %x\n",
result->fViewMode, result->fLastIconMode));
delete result;
return NULL;
}
#if DEBUG
else if (endianSwap)
PRINT(("Instantiated foreign view state ok\n"));
#endif
return result;
} }
BViewState * BViewState *
BViewState::InstantiateFromMessage(const BMessage &message) BViewState::InstantiateFromMessage(const BMessage &message)
{ {
int32 version = kViewStateArchiveVersion; int32 version = kViewStateArchiveVersion;
int32 messageVersion; int32 messageVersion;
if (message.FindInt32(kViewStateVersionName, &messageVersion) != B_OK) if (message.FindInt32(kViewStateVersionName, &messageVersion) != B_OK)
return NULL; return NULL;
if (version != messageVersion) if (version != messageVersion)
return NULL; return NULL;
BViewState *result = new BViewState(message); return _Sanitize(new (std::nothrow) BViewState(message));
}
BViewState *
BViewState::_Sanitize(BViewState *state, bool fixOnly)
{
if (state == NULL)
return NULL;
if (state->fViewMode == kListMode) {
if (state->fListOrigin.x < 0)
state->fListOrigin.x = 0;
if (state->fListOrigin.y < 0)
state->fListOrigin.y = 0;
}
if (state->fIconSize < 16)
state->fIconSize = 16;
if (state->fIconSize > 64)
state->fIconSize = 64;
if (fixOnly)
return state;
// do a sanity check here // do a sanity check here
if ((result->fViewMode != kListMode if ((state->fViewMode != kListMode
&& result->fViewMode != kIconMode && state->fViewMode != kIconMode
&& result->fViewMode != kMiniIconMode && state->fViewMode != kMiniIconMode
&& result->fViewMode != kScaleIconMode && state->fViewMode != kScaleIconMode
&& result->fViewMode != 0) && state->fViewMode != 0)
|| (result->fLastIconMode != kListMode || (state->fLastIconMode != kListMode
&& result->fLastIconMode != kIconMode && state->fLastIconMode != kIconMode
&& result->fLastIconMode != kMiniIconMode && state->fLastIconMode != kMiniIconMode
&& result->fLastIconMode != kScaleIconMode && state->fLastIconMode != kScaleIconMode
&& result->fLastIconMode != 0)) { && state->fLastIconMode != 0)) {
PRINT(("Bad data instantiating ViewState, view mode %x, lastIconMode %x\n", PRINT(("Bad data instantiating ViewState, view mode %x, lastIconMode %x\n",
result->fViewMode, result->fLastIconMode)); state->fViewMode, state->fLastIconMode));
delete result; delete state;
return NULL; return NULL;
} }
return result; #if DEBUG
else if (endianSwap)
PRINT(("Instantiated foreign view state ok\n"));
#endif
return state;
} }
+13 -5
View File
@@ -31,13 +31,14 @@ of Be Incorporated in the United States and other countries. Other brand product
names are registered trademarks or trademarks of their respective holders. names are registered trademarks or trademarks of their respective holders.
All rights reserved. All rights reserved.
*/ */
#ifndef _VIEW_STATE_H #ifndef _VIEW_STATE_H
#define _VIEW_STATE_H #define _VIEW_STATE_H
#include <DataIO.h> #include <DataIO.h>
#include <String.h> #include <String.h>
namespace BPrivate { namespace BPrivate {
const int32 kColumnStateArchiveVersion = 21; const int32 kColumnStateArchiveVersion = 21;
@@ -46,14 +47,16 @@ const int32 kColumnStateArchiveVersion = 21;
class BColumn { class BColumn {
public: public:
BColumn(const char *title, float offset, float width, BColumn(const char *title, float offset, float width,
alignment, const char *attributeName, uint32 attr_type, alignment align, const char *attributeName, uint32 attrType,
bool stat_field, bool editable); bool statField, bool editable);
~BColumn(); ~BColumn();
BColumn(BMallocIO *stream, bool endianSwap = false); BColumn(BMallocIO *stream, bool endianSwap = false);
BColumn(const BMessage &, int32 index = 0); BColumn(const BMessage &, int32 index = 0);
static BColumn *InstantiateFromStream(BMallocIO *stream, bool endianSwap = false); static BColumn *InstantiateFromStream(BMallocIO *stream,
static BColumn *InstantiateFromMessage(const BMessage &, int32 index = 0); bool endianSwap = false);
static BColumn *InstantiateFromMessage(const BMessage &archive,
int32 index = 0);
void ArchiveToStream(BMallocIO *stream) const; void ArchiveToStream(BMallocIO *stream) const;
void ArchiveToMessage(BMessage &) const; void ArchiveToMessage(BMessage &) const;
@@ -71,6 +74,8 @@ public:
void SetWidth(float); void SetWidth(float);
private: private:
static BColumn *_Sanitize(BColumn *column);
BString fTitle; BString fTitle;
float fOffset; float fOffset;
float fWidth; float fWidth;
@@ -123,6 +128,8 @@ class BViewState {
void MarkSaved(); void MarkSaved();
private: private:
static BViewState *_Sanitize(BViewState *state, bool fixOnly = false);
uint32 fViewMode; uint32 fViewMode;
uint32 fLastIconMode; uint32 fLastIconMode;
uint32 fIconSize; uint32 fIconSize;
@@ -136,6 +143,7 @@ private:
bool fStateNeedsSaving; bool fStateNeedsSaving;
}; };
inline const char * inline const char *
BColumn::Title() const BColumn::Title() const
{ {