BParameter::GetValue() now only copies as much data as specified by the reply.
BParameterGroup::Unflatten() did not set the mWeb member of BParameter. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3873 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
37ac95056d
commit
7b96988a72
@ -16,11 +16,6 @@
|
|||||||
#include "DataExchange.h"
|
#include "DataExchange.h"
|
||||||
#include "MediaMisc.h"
|
#include "MediaMisc.h"
|
||||||
|
|
||||||
// for now!
|
|
||||||
#ifdef DEBUG
|
|
||||||
# undef DEBUG
|
|
||||||
#endif
|
|
||||||
//#define DEBUG 3
|
|
||||||
|
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
@ -1171,6 +1166,7 @@ BParameterGroup::Unflatten(type_code code, const void *buffer, ssize_t size)
|
|||||||
|
|
||||||
// add the item to the list
|
// add the item to the list
|
||||||
parameter->mGroup = this;
|
parameter->mGroup = this;
|
||||||
|
parameter->mWeb = mWeb;
|
||||||
mControls->AddItem(parameter);
|
mControls->AddItem(parameter);
|
||||||
|
|
||||||
// add it's old pointer value to the RefFix list kept by the owner web
|
// add it's old pointer value to the RefFix list kept by the owner web
|
||||||
@ -1331,38 +1327,39 @@ BParameter::Flags() const
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
BParameter::GetValue(void *buffer, size_t *ioSize, bigtime_t *when)
|
BParameter::GetValue(void *buffer, size_t *_ioSize, bigtime_t *_when)
|
||||||
{
|
{
|
||||||
CALLED();
|
CALLED();
|
||||||
|
|
||||||
controllable_get_parameter_data_request request;
|
if (buffer == NULL || _ioSize == NULL)
|
||||||
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;
|
return B_BAD_VALUE;
|
||||||
if (*ioSize <= 0)
|
|
||||||
|
size_t ioSize = *_ioSize;
|
||||||
|
if (ioSize <= 0)
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
if (mWeb == 0) {
|
if (mWeb == NULL) {
|
||||||
ERROR("BParameter::GetValue: no parent BParameterWeb\n");
|
ERROR("BParameter::GetValue: no parent BParameterWeb\n");
|
||||||
return B_NO_INIT;
|
return B_NO_INIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
node = mWeb->Node();
|
media_node node = mWeb->Node();
|
||||||
if (IS_INVALID_NODE(node)) {
|
if (IS_INVALID_NODE(node)) {
|
||||||
ERROR("BParameter::GetValue: the parent BParameterWeb is not assigned to a BMediaNode\n");
|
ERROR("BParameter::GetValue: the parent BParameterWeb is not assigned to a BMediaNode\n");
|
||||||
return B_NO_INIT;
|
return B_NO_INIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*ioSize > MAX_PARAMETER_DATA) {
|
controllable_get_parameter_data_request request;
|
||||||
|
controllable_get_parameter_data_reply reply;
|
||||||
|
|
||||||
|
area_id area;
|
||||||
|
void *data;
|
||||||
|
if (ioSize > MAX_PARAMETER_DATA) {
|
||||||
// create an area if large data needs to be transfered
|
// 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);
|
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) {
|
if (area < B_OK) {
|
||||||
ERROR("BParameter::GetValue can't create area of %ld bytes\n", *ioSize);
|
ERROR("BParameter::GetValue can't create area of %ld bytes\n", ioSize);
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -1371,26 +1368,30 @@ BParameter::GetValue(void *buffer, size_t *ioSize, bigtime_t *when)
|
|||||||
}
|
}
|
||||||
|
|
||||||
request.parameter_id = mID;
|
request.parameter_id = mID;
|
||||||
request.requestsize = *ioSize;
|
request.requestsize = ioSize;
|
||||||
request.area = area;
|
request.area = area;
|
||||||
|
|
||||||
rv = QueryPort(node.port, CONTROLLABLE_GET_PARAMETER_DATA, &request, sizeof(request), &reply, sizeof(reply));
|
status_t status = QueryPort(node.port, CONTROLLABLE_GET_PARAMETER_DATA, &request,
|
||||||
|
sizeof(request), &reply, sizeof(reply));
|
||||||
|
if (status == B_OK) {
|
||||||
|
// we don't want to copy more than the buffer provides
|
||||||
|
if (reply.size < ioSize)
|
||||||
|
ioSize = reply.size;
|
||||||
|
|
||||||
if (rv == B_OK) {
|
memcpy(buffer, data, ioSize);
|
||||||
// we don't care about the reported data size and copy the full buffer
|
|
||||||
memcpy(buffer, data, *ioSize);
|
// store reported values
|
||||||
// store reported data size
|
|
||||||
*ioSize = reply.size;
|
*_ioSize = reply.size;
|
||||||
// store last update time if when != NULL
|
if (_when != NULL)
|
||||||
if (when != 0)
|
*_when = reply.last_change;
|
||||||
*when = reply.last_change;
|
|
||||||
} else
|
} else
|
||||||
ERROR("BParameter::GetValue querying node failed\n");
|
ERROR("BParameter::GetValue querying node failed: %s\n", strerror(status));
|
||||||
|
|
||||||
if (area != -1)
|
if (area >= B_OK)
|
||||||
delete_area(area);
|
delete_area(area);
|
||||||
|
|
||||||
return rv;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user