diff --git a/headers/os/media/ParameterWeb.h b/headers/os/media/ParameterWeb.h index 5d2ed617ed..93276244cd 100644 --- a/headers/os/media/ParameterWeb.h +++ b/headers/os/media/ParameterWeb.h @@ -85,6 +85,7 @@ class BParameter; class BNullParameter; class BContinuousParameter; class BDiscreteParameter; +class BTextParameter; /* Set these flags on parameters and groups to control how a Theme will */ @@ -192,6 +193,12 @@ public: media_type m_type, const char * name, const char * kind); + BTextParameter * MakeTextParameter( + int32 id, + media_type m_type, + const char * name, + const char * kind, + size_t max_bytes); BParameterGroup * MakeGroup( const char * name); @@ -253,7 +260,8 @@ public: { B_NULL_PARAMETER, B_DISCRETE_PARAMETER, - B_CONTINUOUS_PARAMETER + B_CONTINUOUS_PARAMETER, + B_TEXT_PARAMETER }; media_parameter_type Type() const; @@ -307,6 +315,7 @@ private: friend class BNullParameter; friend class BContinuousParameter; friend class BDiscreteParameter; + friend class BTextParameter; friend class BParameterGroup; friend class BParameterWeb; @@ -520,4 +529,43 @@ virtual status_t _Reserved_NullParameter_7(void *); }; +class BTextParameter : + public BParameter +{ +public: + + size_t MaxBytes() const; +virtual type_code ValueType(); + +virtual ssize_t FlattenedSize() const; +virtual status_t Flatten(void *buffer, ssize_t size) const; +virtual status_t Unflatten(type_code c, const void *buf, ssize_t size); + +private: + /* Mmmh, stuffing! */ +virtual status_t _Reserved_TextParameter_0(void *); +virtual status_t _Reserved_TextParameter_1(void *); +virtual status_t _Reserved_TextParameter_2(void *); +virtual status_t _Reserved_TextParameter_3(void *); +virtual status_t _Reserved_TextParameter_4(void *); +virtual status_t _Reserved_TextParameter_5(void *); +virtual status_t _Reserved_TextParameter_6(void *); +virtual status_t _Reserved_TextParameter_7(void *); + + friend class BParameterGroup; + + uint32 mMaxBytes; + uint32 _reserved_control_junction_[8]; + + BTextParameter( + int32 id, + media_type m_type, + BParameterWeb * web, + const char * name, + const char * kind, + size_t max_bytes); + ~BTextParameter(); + +}; + #endif /* _CONTROL_WEB_H */ diff --git a/src/kits/media/ParameterWeb.cpp b/src/kits/media/ParameterWeb.cpp index 1b2342fb81..1fbb74a94e 100644 --- a/src/kits/media/ParameterWeb.cpp +++ b/src/kits/media/ParameterWeb.cpp @@ -782,6 +782,21 @@ BParameterGroup::MakeNullParameter(int32 id, media_type mediaType, const char *n } +BTextParameter * +BParameterGroup::MakeTextParameter(int32 id, media_type mediaType, const char *name, + const char *kind, size_t max_bytes) +{ + CALLED(); + ASSERT(mControls != NULL); + + BTextParameter *parameter = new BTextParameter(id, mediaType, mWeb, name, kind, max_bytes); + parameter->mGroup = this; + mControls->AddItem(parameter); + + return parameter; +} + + BContinuousParameter * BParameterGroup::MakeContinuousParameter(int32 id, media_type mediaType, const char *name, const char *kind, const char *unit, @@ -1246,6 +1261,9 @@ BParameterGroup::MakeControl(int32 type) case BParameter::B_CONTINUOUS_PARAMETER: return new BContinuousParameter(-1, B_MEDIA_NO_TYPE, NULL, NULL, NULL, NULL, 0, 0, 0); + case BParameter::B_TEXT_PARAMETER: + return new BTextParameter(-1, B_MEDIA_NO_TYPE, NULL, NULL, NULL, NULL); + default: ERROR("BParameterGroup::MakeControl unknown type %ld\n", type); return NULL; @@ -2386,6 +2404,125 @@ BNullParameter::~BNullParameter() } +// #pragma mark - + +/************************************************************* + * public BTextParameter + *************************************************************/ + + +size_t +BTextParameter::MaxBytes() const +{ + // NULL parameters have no value type + return mMaxBytes; +} + + +type_code +BTextParameter::ValueType() +{ + // NULL parameters have no value type + return 0; +} + + +ssize_t +BTextParameter::FlattenedSize() const +{ + return BParameter::FlattenedSize() + sizeof(mMaxBytes); +} + + +status_t +BTextParameter::Flatten(void *buffer, ssize_t size) const +{ + if (buffer == NULL) { + ERROR("BTextParameter::Flatten(): buffer is NULL\n"); + return B_NO_INIT; + } + + ssize_t parameterSize = BParameter::FlattenedSize(); + if (size < static_cast(parameterSize + sizeof(mMaxBytes))) { + ERROR("BContinuousParameter::Flatten(): size to small\n"); + return B_NO_MEMORY; + } + + status_t status = BParameter::Flatten(buffer, size); + if (status != B_OK) { + ERROR("BTextParameter::Flatten(): BParameter::Flatten() failed\n"); + return status; + } + + // add our data to the general flattened BParameter + + skip_in_buffer(&buffer, parameterSize); + + write_to_buffer(&buffer, mMaxBytes); + + return B_OK; +} + + +status_t +BTextParameter::Unflatten(type_code code, const void *buffer, ssize_t size) +{ + // we try to check if the buffer size is long enough to hold an object + // as early as possible. + + if (!AllowsTypeCode(code)) { + ERROR("BTextParameter::Unflatten wrong type code\n"); + return B_BAD_TYPE; + } + + if (buffer == NULL) { + ERROR("BTextParameter::Unflatten buffer is NULL\n"); + return B_NO_INIT; + } + + if (size < static_cast(sizeof(mMaxBytes))) { + ERROR("BTextParameter::Unflatten size too small\n"); + return B_ERROR; + } + + status_t status = BParameter::Unflatten(code, buffer, size); + if (status != B_OK) { + ERROR("BTextParameter::Unflatten(): BParameter::Unflatten failed\n"); + return status; + } + + ssize_t parameterSize = BParameter::FlattenedSize(); + skip_in_buffer(&buffer, parameterSize); + + if (size < static_cast(parameterSize + sizeof(mMaxBytes))) { + ERROR("BTextParameter::Unflatten(): buffer too small\n"); + return B_BAD_VALUE; + } + + mMaxBytes = read_from_buffer_swap32(&buffer, SwapOnUnflatten()); + + return B_OK; +} + + +/************************************************************* + * private BTextParameter + *************************************************************/ + + +BTextParameter::BTextParameter(int32 id, media_type mediaType, BParameterWeb *web, + const char *name, const char *kind, size_t max_bytes) + : BParameter(id, mediaType, B_NULL_PARAMETER, web, name, kind, NULL) +{ + mMaxBytes = max_bytes; +} + + +BTextParameter::~BTextParameter() +{ +} + + // #pragma mark - // reserved functions @@ -2444,4 +2581,13 @@ status_t BNullParameter::_Reserved_NullParameter_5(void *) { return B_ERROR; } status_t BNullParameter::_Reserved_NullParameter_6(void *) { return B_ERROR; } status_t BNullParameter::_Reserved_NullParameter_7(void *) { return B_ERROR; } +status_t BTextParameter::_Reserved_TextParameter_0(void *) { return B_ERROR; } +status_t BTextParameter::_Reserved_TextParameter_1(void *) { return B_ERROR; } +status_t BTextParameter::_Reserved_TextParameter_2(void *) { return B_ERROR; } +status_t BTextParameter::_Reserved_TextParameter_3(void *) { return B_ERROR; } +status_t BTextParameter::_Reserved_TextParameter_4(void *) { return B_ERROR; } +status_t BTextParameter::_Reserved_TextParameter_5(void *) { return B_ERROR; } +status_t BTextParameter::_Reserved_TextParameter_6(void *) { return B_ERROR; } +status_t BTextParameter::_Reserved_TextParameter_7(void *) { return B_ERROR; } +