From 6938364b3992fe594a30cc4ec76ca0bd5f951886 Mon Sep 17 00:00:00 2001 From: Maurice Kalinowski Date: Sun, 30 Mar 2008 01:35:58 +0000 Subject: [PATCH] * 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 --- headers/private/media/DataExchange.h | 42 ++++++++++++++ src/kits/media/FileInterface.cpp | 70 +++++++++++++++++++++-- src/kits/media/MediaRoster.cpp | 83 ++++++++++++++++++++++++---- 3 files changed, 179 insertions(+), 16 deletions(-) diff --git a/headers/private/media/DataExchange.h b/headers/private/media/DataExchange.h index db2e266a73..2d46f42653 100644 --- a/headers/private/media/DataExchange.h +++ b/headers/private/media/DataExchange.h @@ -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; diff --git a/src/kits/media/FileInterface.cpp b/src/kits/media/FileInterface.cpp index 6ca5165a05..1ba5e4cf6b 100644 --- a/src/kits/media/FileInterface.cpp +++ b/src/kits/media/FileInterface.cpp @@ -3,8 +3,18 @@ * FILE: FileInterface.cpp * DESCR: ***********************************************************************/ -#include +/* + * Copyright 2008 Maurice Kalinowski, haiku@kaldience.com + * + * All rights reserved. Distributed under the terms of the MIT License. + * + */ + #include "debug.h" +#include "DataExchange.h" +#include +#include + /************************************************************* * 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; } /************************************************************* diff --git a/src/kits/media/MediaRoster.cpp b/src/kits/media/MediaRoster.cpp index e1f30aa1be..b43e3ae9db 100644 --- a/src/kits/media/MediaRoster.cpp +++ b/src/kits/media/MediaRoster.cpp @@ -26,6 +26,13 @@ * THE SOFTWARE. * */ +/* + * Copyright 2008 Maurice Kalinowski, haiku@kaldience.com + * + * 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 +#include +#include #include #include #include -#include +#include #include +#include +#include #include #include -#include -#include -#include #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; }