1/***********************************************************************
2 * AUTHOR: Marcus Overhagen
3 *   FILE: FileInterface.cpp
4 *  DESCR:
5 ***********************************************************************/
6/*
7 * Copyright 2008 Maurice Kalinowski, haiku@kaldience.com
8 *
9 * All rights reserved. Distributed under the terms of the MIT License.
10 *
11 */
12
13#include "MediaDebug.h"
14#include "DataExchange.h"
15#include <string.h>
16#include <FileInterface.h>
17#include <MimeType.h>
18
19
20/*************************************************************
21 * protected BFileInterface
22 *************************************************************/
23
24BFileInterface::~BFileInterface()
25{
26}
27
28/*************************************************************
29 * public BFileInterface
30 *************************************************************/
31
32/* nothing */
33
34/*************************************************************
35 * protected BFileInterface
36 *************************************************************/
37
38BFileInterface::BFileInterface()
39	: BMediaNode("called by FileInterface")
40{
41	CALLED();
42
43	AddNodeKind(B_FILE_INTERFACE);
44}
45
46
47status_t
48BFileInterface::HandleMessage(int32 message,
49							  const void *data,
50							  size_t size)
51{
52	CALLED();
53
54	status_t rv;
55
56	switch(message) {
57		case FILEINTERFACE_SET_REF:
58		{
59			const fileinterface_set_ref_request *request =
60					(const fileinterface_set_ref_request*) data;
61			fileinterface_set_ref_reply reply;
62			entry_ref ref(request->device, request->directory,
63								request->name);
64			reply.duration = request->duration;
65
66			rv = SetRef(ref, request->create, &reply.duration);
67
68			request->SendReply(rv, &reply, sizeof(reply));
69			return B_OK;
70		}
71		case FILEINTERFACE_GET_REF:
72		{
73			const fileinterface_get_ref_request *request =
74					(const fileinterface_get_ref_request*) data;
75			fileinterface_get_ref_reply reply;
76			entry_ref resultRef;
77			rv = GetRef(&resultRef, reply.mimetype);
78			if (rv == B_OK) {
79				reply.device = resultRef.device;
80				reply.directory = resultRef.directory;
81				strcpy(reply.name, resultRef.name);
82			}
83			request->SendReply(rv, &reply, sizeof(reply));
84			return B_OK;
85		}
86		case FILEINTERFACE_SNIFF_REF:
87		{
88			const fileinterface_sniff_ref_request *request =
89					(const fileinterface_sniff_ref_request*) data;
90			fileinterface_sniff_ref_reply reply;
91
92			entry_ref ref(request->device, request->directory,
93						  request->name);
94
95			rv = SniffRef(ref, reply.mimetype, &reply.capability);
96			request->SendReply(rv, &reply, sizeof(reply));
97
98			return B_OK;
99		}
100		case FILEINTERFACE_GET_FORMATS:
101		{
102			const fileinterface_get_formats_request *request =
103					(const fileinterface_get_formats_request*) data;
104			fileinterface_get_formats_reply reply;
105
106			media_file_format* formats;
107			area_id area = clone_area("client formats area",
108				(void**)&formats, B_ANY_ADDRESS, B_WRITE_AREA,
109				request->data_area);
110
111			if (area < 0) {
112				ERROR("BBufferConsumer::FILEINTERFACE_GET_FORMATS:"
113					" can't clone area\n");
114				break;
115			}
116
117			int32 cookie = 0;
118			while (GetNextFileFormat(&cookie, formats) == B_OK) {
119				if (cookie >= request->num_formats)
120					break;
121				formats += sizeof(media_format);
122			}
123			reply.filled_slots = cookie;
124			request->SendReply(B_OK, &reply, sizeof(reply));
125
126			delete_area(area);
127			return B_OK;
128		}
129		default:
130			return B_ERROR;
131	}
132	return B_ERROR;
133}
134
135/*************************************************************
136 * private BFileInterface
137 *************************************************************/
138
139/*
140private unimplemented
141BFileInterface::BFileInterface(const BFileInterface &clone)
142FileInterface & BFileInterface::operator=(const BFileInterface &clone)
143*/
144
145status_t BFileInterface::_Reserved_FileInterface_0(void *) { return B_ERROR; }
146status_t BFileInterface::_Reserved_FileInterface_1(void *) { return B_ERROR; }
147status_t BFileInterface::_Reserved_FileInterface_2(void *) { return B_ERROR; }
148status_t BFileInterface::_Reserved_FileInterface_3(void *) { return B_ERROR; }
149status_t BFileInterface::_Reserved_FileInterface_4(void *) { return B_ERROR; }
150status_t BFileInterface::_Reserved_FileInterface_5(void *) { return B_ERROR; }
151status_t BFileInterface::_Reserved_FileInterface_6(void *) { return B_ERROR; }
152status_t BFileInterface::_Reserved_FileInterface_7(void *) { return B_ERROR; }
153status_t BFileInterface::_Reserved_FileInterface_8(void *) { return B_ERROR; }
154status_t BFileInterface::_Reserved_FileInterface_9(void *) { return B_ERROR; }
155status_t BFileInterface::_Reserved_FileInterface_10(void *) { return B_ERROR; }
156status_t BFileInterface::_Reserved_FileInterface_11(void *) { return B_ERROR; }
157status_t BFileInterface::_Reserved_FileInterface_12(void *) { return B_ERROR; }
158status_t BFileInterface::_Reserved_FileInterface_13(void *) { return B_ERROR; }
159status_t BFileInterface::_Reserved_FileInterface_14(void *) { return B_ERROR; }
160status_t BFileInterface::_Reserved_FileInterface_15(void *) { return B_ERROR; }
161
162