* Implemented BMediaRoster hooks GetRefFor, SetRefFor, SniffRefFor to access BFileInterface related file functions.
* Implemented BFileInterface class which was nearly empty so far. Added handling of messages passed to BFileInterface class. * Added needed structs and message values to DataExchange. * This is needed to get for instance the reader.media_addon to work. Usually one calls above functions to set a file to be decoded by the node. If the target is a consumer, they are used for setting the target for encoding data. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24671 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -171,6 +171,9 @@ enum {
|
||||
|
||||
PRODUCER_MESSAGE_END,
|
||||
FILEINTERFACE_MESSAGE_START = 0x500,
|
||||
FILEINTERFACE_SET_REF,
|
||||
FILEINTERFACE_GET_REF,
|
||||
FILEINTERFACE_SNIFF_REF,
|
||||
FILEINTERFACE_MESSAGE_END,
|
||||
CONTROLLABLE_MESSAGE_START = 0x600,
|
||||
CONTROLLABLE_GET_PARAMETER_WEB,
|
||||
@@ -979,6 +982,45 @@ struct timesource_get_start_latency_reply : public reply_data
|
||||
bigtime_t start_latency;
|
||||
};
|
||||
|
||||
struct fileinterface_set_ref_request : public request_data
|
||||
{
|
||||
dev_t device;
|
||||
ino_t directory;
|
||||
char name[B_FILE_NAME_LENGTH];
|
||||
bigtime_t duration;
|
||||
bool create;
|
||||
};
|
||||
|
||||
struct fileinterface_set_ref_reply : public reply_data
|
||||
{
|
||||
bigtime_t duration;
|
||||
};
|
||||
|
||||
struct fileinterface_get_ref_request : public request_data
|
||||
{
|
||||
};
|
||||
|
||||
struct fileinterface_get_ref_reply : public reply_data
|
||||
{
|
||||
dev_t device;
|
||||
ino_t directory;
|
||||
char name[B_FILE_NAME_LENGTH];
|
||||
char mimetype[256];
|
||||
};
|
||||
|
||||
struct fileinterface_sniff_ref_request : public request_data
|
||||
{
|
||||
dev_t device;
|
||||
ino_t directory;
|
||||
char name[B_FILE_NAME_LENGTH];
|
||||
};
|
||||
|
||||
struct fileinterface_sniff_ref_reply : public reply_data
|
||||
{
|
||||
char mimetype[256];
|
||||
float capability;
|
||||
};
|
||||
|
||||
struct controllable_get_parameter_web_request : public request_data
|
||||
{
|
||||
area_id area;
|
||||
|
||||
@@ -3,8 +3,18 @@
|
||||
* FILE: FileInterface.cpp
|
||||
* DESCR:
|
||||
***********************************************************************/
|
||||
#include <FileInterface.h>
|
||||
/*
|
||||
* Copyright 2008 Maurice Kalinowski, [email protected]
|
||||
*
|
||||
* All rights reserved. Distributed under the terms of the MIT License.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "debug.h"
|
||||
#include "DataExchange.h"
|
||||
#include <FileInterface.h>
|
||||
#include <MimeType.h>
|
||||
|
||||
|
||||
/*************************************************************
|
||||
* protected BFileInterface
|
||||
@@ -12,7 +22,6 @@
|
||||
|
||||
BFileInterface::~BFileInterface()
|
||||
{
|
||||
UNIMPLEMENTED();
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
@@ -26,9 +35,9 @@ BFileInterface::~BFileInterface()
|
||||
*************************************************************/
|
||||
|
||||
BFileInterface::BFileInterface()
|
||||
: BMediaNode("XXX fixme")
|
||||
: BMediaNode("called by FileInterface")
|
||||
{
|
||||
UNIMPLEMENTED();
|
||||
CALLED();
|
||||
|
||||
AddNodeKind(B_FILE_INTERFACE);
|
||||
}
|
||||
@@ -39,9 +48,58 @@ BFileInterface::HandleMessage(int32 message,
|
||||
const void *data,
|
||||
size_t size)
|
||||
{
|
||||
PRINT(4, "BFileInterface::HandleMessage %#lx, node %ld\n", message, ID());
|
||||
CALLED();
|
||||
|
||||
return B_OK;
|
||||
status_t rv;
|
||||
|
||||
switch(message) {
|
||||
case FILEINTERFACE_SET_REF:
|
||||
{
|
||||
const fileinterface_set_ref_request *request =
|
||||
(const fileinterface_set_ref_request*) data;
|
||||
fileinterface_set_ref_reply reply;
|
||||
entry_ref ref(request->device, request->directory,
|
||||
request->name);
|
||||
reply.duration = request->duration;
|
||||
|
||||
rv = SetRef(ref, request->create, &reply.duration);
|
||||
reply.duration = request->duration;
|
||||
request->SendReply(rv, &reply, sizeof(reply));
|
||||
return B_OK;
|
||||
}
|
||||
case FILEINTERFACE_GET_REF:
|
||||
{
|
||||
const fileinterface_get_ref_request *request =
|
||||
(const fileinterface_get_ref_request*) data;
|
||||
fileinterface_get_ref_reply reply;
|
||||
entry_ref resultRef;
|
||||
rv = GetRef(&resultRef, reply.mimetype);
|
||||
if (rv == B_OK) {
|
||||
reply.device = resultRef.device;
|
||||
reply.directory = resultRef.directory;
|
||||
strcpy(reply.name, resultRef.name);
|
||||
}
|
||||
request->SendReply(rv, &reply, sizeof(reply));
|
||||
return B_OK;
|
||||
}
|
||||
case FILEINTERFACE_SNIFF_REF:
|
||||
{
|
||||
const fileinterface_sniff_ref_request *request =
|
||||
(const fileinterface_sniff_ref_request*) data;
|
||||
fileinterface_sniff_ref_reply reply;
|
||||
|
||||
entry_ref ref(request->device, request->directory,
|
||||
request->name);
|
||||
|
||||
rv = SniffRef(ref, reply.mimetype, &reply.capability);
|
||||
request->SendReply(rv, &reply, sizeof(reply));
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
default:
|
||||
return B_ERROR;
|
||||
}
|
||||
return B_ERROR;
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
|
||||
@@ -26,6 +26,13 @@
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* Copyright 2008 Maurice Kalinowski, [email protected]
|
||||
*
|
||||
* All rights reserved. Distributed under the terms of the MIT License.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* to comply with the license above, do not remove the following line */
|
||||
char __dont_remove_copyright_from_binary[] = "Copyright (c) 2002-2006 Marcus "
|
||||
@@ -36,16 +43,17 @@ char __dont_remove_copyright_from_binary[] = "Copyright (c) 2002-2006 Marcus "
|
||||
|
||||
#include <new>
|
||||
|
||||
#include <BufferConsumer.h>
|
||||
#include <BufferProducer.h>
|
||||
#include <Locker.h>
|
||||
#include <Message.h>
|
||||
#include <Messenger.h>
|
||||
#include <StopWatch.h>
|
||||
#include <MimeType.h>
|
||||
#include <OS.h>
|
||||
#include <ParameterWeb.h>
|
||||
#include <StopWatch.h>
|
||||
#include <String.h>
|
||||
#include <TimeSource.h>
|
||||
#include <ParameterWeb.h>
|
||||
#include <BufferProducer.h>
|
||||
#include <BufferConsumer.h>
|
||||
|
||||
#include "debug.h"
|
||||
#include "MediaRosterEx.h"
|
||||
@@ -2589,8 +2597,27 @@ BMediaRoster::SetRefFor(const media_node & file_interface,
|
||||
bool create_and_truncate,
|
||||
bigtime_t * out_length) /* if create is false */
|
||||
{
|
||||
UNIMPLEMENTED();
|
||||
return B_ERROR;
|
||||
CALLED();
|
||||
|
||||
fileinterface_set_ref_request request;
|
||||
fileinterface_set_ref_reply reply;
|
||||
status_t rv;
|
||||
|
||||
request.device = file.device;
|
||||
request.directory = file.directory;
|
||||
strcpy(request.name, file.name);
|
||||
request.create = create_and_truncate;
|
||||
if (out_length)
|
||||
request.duration = *out_length;
|
||||
|
||||
rv = QueryPort(file_interface.port, FILEINTERFACE_SET_REF, &request, sizeof(request), &reply, sizeof(reply));
|
||||
if (rv != B_OK)
|
||||
return rv;
|
||||
|
||||
if (!create_and_truncate && out_length)
|
||||
*out_length = reply.duration;
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -2599,8 +2626,25 @@ BMediaRoster::GetRefFor(const media_node & node,
|
||||
entry_ref * out_file,
|
||||
BMimeType * mime_type)
|
||||
{
|
||||
UNIMPLEMENTED();
|
||||
return B_ERROR;
|
||||
CALLED();
|
||||
|
||||
if (!out_file)
|
||||
return B_BAD_VALUE;
|
||||
|
||||
fileinterface_get_ref_request request;
|
||||
fileinterface_get_ref_reply reply;
|
||||
status_t rv;
|
||||
|
||||
rv = QueryPort(node.port, FILEINTERFACE_GET_REF, &request, sizeof(request), &reply, sizeof(reply));
|
||||
if (rv != B_OK)
|
||||
return rv;
|
||||
|
||||
*out_file = entry_ref(reply.device, reply.directory, reply.name);
|
||||
|
||||
if (mime_type)
|
||||
mime_type->SetTo(reply.mimetype);
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -2610,8 +2654,27 @@ BMediaRoster::SniffRefFor(const media_node & file_interface,
|
||||
BMimeType * mime_type,
|
||||
float * out_capability)
|
||||
{
|
||||
UNIMPLEMENTED();
|
||||
return B_ERROR;
|
||||
CALLED();
|
||||
|
||||
if (!mime_type || !out_capability)
|
||||
return B_BAD_VALUE;
|
||||
|
||||
fileinterface_sniff_ref_request request;
|
||||
fileinterface_sniff_ref_reply reply;
|
||||
status_t rv;
|
||||
|
||||
request.device = file.device;
|
||||
request.directory = file.directory;
|
||||
strcpy(request.name, file.name);
|
||||
|
||||
rv = QueryPort(file_interface.port, FILEINTERFACE_SNIFF_REF, &request, sizeof(request), &reply, sizeof(reply));
|
||||
if (rv != B_OK)
|
||||
return rv;
|
||||
|
||||
mime_type->SetTo(reply.mimetype);
|
||||
*out_capability = reply.capability;
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user