Implemented BParameter::GetValue() and BControllable::GetParameterValue()

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3488 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
beveloper 2003-06-13 00:42:55 +00:00
parent dbafe172c0
commit 17488f48b1
2 changed files with 90 additions and 5 deletions

View File

@ -132,6 +132,34 @@ BControllable::HandleMessage(int32 message, const void *data, size_t size)
status_t rv;
switch (message) {
case CONTROLLABLE_GET_PARAMETER_DATA:
{
const controllable_get_parameter_data_request *request = static_cast<const controllable_get_parameter_data_request *>(data);
controllable_get_parameter_data_reply reply;
area_id area;
void *data;
if (request->area == -1) {
// small data transfer uses buffer in reply
area = -1;
data = reply.rawdata;
} else {
// large data transfer, clone area
area = clone_area("get parameter data clone", &data, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, request->area);
if (area < B_OK) {
FATAL("CONTROLLABLE_GET_PARAMETER_DATA cloning area failed\n");
request->SendReply(B_NO_MEMORY, &reply, sizeof(reply));
return B_OK;
}
}
reply.size = request->requestsize;
rv = GetParameterValue(request->parameter_id, &reply.last_change, data, &reply.size);
if (area != -1)
delete_area(area);
request->SendReply(rv, &reply, sizeof(reply));
return B_OK;
}
case CONTROLLABLE_GET_PARAMETER_WEB:
{
const controllable_get_parameter_web_request *request = static_cast<const controllable_get_parameter_web_request *>(data);

View File

@ -4,13 +4,17 @@
**
** Author: Zousar Shaker
** Axel Dörfler, axeld@pinc-software.de
** Marcus Overhagen
**
** This file may be used under the terms of the OpenBeOS License.
*/
#include <ParameterWeb.h>
#include <MediaNode.h>
#include <string.h>
#include "DataExchange.h"
#include "MediaMisc.h"
// for now!
#ifdef DEBUG
@ -1328,11 +1332,64 @@ BParameter::Flags() const
status_t
BParameter::GetValue(void *buffer, size_t *ioSize, bigtime_t *when)
{
UNIMPLEMENTED();
/*
* XXX ToDo: call BControllable::GetControlValue() here.
*/
return B_BAD_VALUE;
CALLED();
controllable_get_parameter_data_request request;
controllable_get_parameter_data_reply reply;
media_node node;
area_id area;
status_t rv;
void *data;
if (buffer == 0 || ioSize == 0)
return B_BAD_VALUE;
if (*ioSize <= 0)
return B_NO_MEMORY;
if (mWeb == 0) {
FATAL("BParameter::GetValue: no parent BParameterWeb\n");
return B_NO_INIT;
}
node = mWeb->Node();
if (IS_INVALID_NODE(node)) {
FATAL("BParameter::GetValue: the parent BParameterWeb is not assigned to a BMediaNode\n");
return B_NO_INIT;
}
if (*ioSize > MAX_PARAMETER_DATA) {
// create an area if large data needs to be transfered
area = create_area("get parameter data", &data, B_ANY_ADDRESS, ROUND_UP_TO_PAGE(*ioSize), B_NO_LOCK, B_READ_AREA | B_WRITE_AREA);
if (area < B_OK) {
FATAL("BParameter::GetValue can't create area of %ld bytes\n", *ioSize);
return B_NO_MEMORY;
}
} else {
area = -1;
data = reply.rawdata;
}
request.parameter_id = mID;
request.requestsize = *ioSize;
request.area = area;
rv = QueryPort(node.port, CONTROLLABLE_GET_PARAMETER_DATA, &request, sizeof(request), &reply, sizeof(reply));
if (rv == B_OK) {
// we don't care about the reported data size and copy the full buffer
memcpy(buffer, data, *ioSize);
// store reported data size
*ioSize = reply.size;
// store last update time if when != NULL
if (when != 0)
*when = reply.last_change;
} else
FATAL("BParameter::GetValue querying node failed\n");
if (area != -1)
delete_area(area);
return rv;
}