* 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:
Maurice Kalinowski
2008-03-30 01:35:58 +00:00
parent ae824ff9c8
commit 6938364b39
3 changed files with 179 additions and 16 deletions
+42
View File
@@ -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;
+64 -6
View File
@@ -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;
}
/*************************************************************
+73 -10
View File
@@ -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;
}