1// AbstractFileInterfaceAddOn.cpp
2//
3// Andrew Bachmann, 2002
4//
5// AbstractFileInterfaceAddOn is an add-on
6// that can make instances of AbstractFileInterfaceNode
7//
8// AbstractFileInterfaceNode handles a file and a multistream
9
10
11#include "AbstractFileInterfaceNode.h"
12#include "AbstractFileInterfaceAddOn.h"
13#include "debug.h"
14
15#include <Errors.h>
16#include <MediaDefs.h>
17#include <MediaAddOn.h>
18#include <Mime.h>
19#include <Node.h>
20#include <StorageDefs.h>
21
22
23#include <limits.h>
24#include <stdio.h>
25#include <string.h>
26
27
28AbstractFileInterfaceAddOn::~AbstractFileInterfaceAddOn()
29{
30}
31
32
33AbstractFileInterfaceAddOn::AbstractFileInterfaceAddOn(image_id image) :
34	BMediaAddOn(image)
35{
36	CALLED();
37	refCount = 0;
38}
39
40
41// -------------------------------------------------------- //
42// BMediaAddOn impl
43// -------------------------------------------------------- //
44status_t AbstractFileInterfaceAddOn::InitCheck(
45	const char ** out_failure_text)
46{
47	CALLED();
48	return B_OK;
49}
50
51int32 AbstractFileInterfaceAddOn::CountFlavors()
52{
53	CALLED();
54	return 1;
55}
56
57status_t AbstractFileInterfaceAddOn::GetFlavorAt(
58	int32 n,
59	const flavor_info ** out_info)
60{
61	CALLED();
62
63	if (n != 0) {
64		PRINT("\t<- B_BAD_INDEX\n");
65		return B_BAD_INDEX;
66	}
67
68	flavor_info * infos = new flavor_info[1];
69	AbstractFileInterfaceNode::GetFlavor(&infos[0],n);
70	(*out_info) = infos;
71	return B_OK;
72}
73
74
75status_t AbstractFileInterfaceAddOn::GetConfigurationFor(
76				BMediaNode * your_node,
77				BMessage * into_message)
78{
79	CALLED();
80	AbstractFileInterfaceNode * node
81		= dynamic_cast<AbstractFileInterfaceNode*>(your_node);
82	if (node == 0) {
83		PRINT("\t<- B_BAD_TYPE\n");
84		return B_BAD_TYPE;
85	}
86	return node->GetConfigurationFor(into_message);
87}
88
89
90bool AbstractFileInterfaceAddOn::WantsAutoStart()
91{
92	CALLED();
93	return false;
94}
95
96
97status_t AbstractFileInterfaceAddOn::AutoStart(
98				int in_count,
99				BMediaNode ** out_node,
100				int32 * out_internal_id,
101				bool * out_has_more)
102{
103	CALLED();
104	return B_OK;
105}
106
107
108// -------------------------------------------------------- //
109// BMediaAddOn impl for B_FILE_INTERFACE nodes
110// -------------------------------------------------------- //
111status_t AbstractFileInterfaceAddOn::SniffRef(
112				const entry_ref & file,
113				BMimeType * io_mime_type,
114				float * out_quality,
115				int32 * out_internal_id)
116{
117	CALLED();
118
119	*out_internal_id = 0; // only one flavor
120	char mime_string[B_MIME_TYPE_LENGTH+1];
121	status_t status =  AbstractFileInterfaceNode::StaticSniffRef(file,mime_string,out_quality);
122	io_mime_type->SetTo(mime_string);
123	return status;
124}
125
126
127// even though I implemented SniffTypeKind below and this shouldn't get called,
128// I am going to implement it anyway.  I'll use it later anyhow.
129status_t AbstractFileInterfaceAddOn::SniffType(
130				const BMimeType & type,
131				float * out_quality,
132				int32 * out_internal_id)
133{
134	CALLED();
135
136	*out_quality = 1.0;
137	*out_internal_id = 0;
138	return B_OK;
139}
140
141
142status_t AbstractFileInterfaceAddOn::GetFileFormatList(
143				int32 flavor_id,
144				media_file_format * out_writable_formats,
145				int32 in_write_items,
146				int32 * out_write_items,
147				media_file_format * out_readable_formats,
148				int32 in_read_items,
149				int32 * out_read_items,
150				void * _reserved)
151{
152	CALLED();
153
154	if (flavor_id != 0) {
155		// this is a sanity check for now
156		PRINT("\t<- B_BAD_INDEX\n");
157		return B_BAD_INDEX;
158	}
159
160	*out_write_items = 0;
161	*out_read_items = 0;
162
163	return B_OK;
164}
165
166
167status_t AbstractFileInterfaceAddOn::SniffTypeKind(
168				const BMimeType & type,
169				uint64 in_kinds,
170				uint64 io_kind,
171				float * out_quality,
172				int32 * out_internal_id,
173				void * _reserved)
174{
175	CALLED();
176
177	if (in_kinds & (io_kind | B_FILE_INTERFACE | B_CONTROLLABLE)) {
178		return SniffType(type,out_quality,out_internal_id);
179	} else {
180		// They asked for some kind we don't supply.  We set the output
181		// just in case they try to do something with it anyway (!)
182		*out_quality = 0;
183		*out_internal_id = -1;
184		PRINT("\t<- B_BAD_TYPE\n");
185		return B_BAD_TYPE;
186	}
187}
188
189
190// -------------------------------------------------------- //
191// main
192// -------------------------------------------------------- //
193
194// int main(int argc, char *argv[])
195//{
196//}
197
198// -------------------------------------------------------- //
199// stuffing
200// -------------------------------------------------------- //
201
202status_t AbstractFileInterfaceAddOn::_Reserved_AbstractFileInterfaceAddOn_0(void *) {return B_ERROR;};
203status_t AbstractFileInterfaceAddOn::_Reserved_AbstractFileInterfaceAddOn_1(void *) {return B_ERROR;};
204status_t AbstractFileInterfaceAddOn::_Reserved_AbstractFileInterfaceAddOn_2(void *) {return B_ERROR;};
205status_t AbstractFileInterfaceAddOn::_Reserved_AbstractFileInterfaceAddOn_3(void *) {return B_ERROR;};
206status_t AbstractFileInterfaceAddOn::_Reserved_AbstractFileInterfaceAddOn_4(void *) {return B_ERROR;};
207status_t AbstractFileInterfaceAddOn::_Reserved_AbstractFileInterfaceAddOn_5(void *) {return B_ERROR;};
208status_t AbstractFileInterfaceAddOn::_Reserved_AbstractFileInterfaceAddOn_6(void *) {return B_ERROR;};
209status_t AbstractFileInterfaceAddOn::_Reserved_AbstractFileInterfaceAddOn_7(void *) {return B_ERROR;};
210status_t AbstractFileInterfaceAddOn::_Reserved_AbstractFileInterfaceAddOn_8(void *) {return B_ERROR;};
211status_t AbstractFileInterfaceAddOn::_Reserved_AbstractFileInterfaceAddOn_9(void *) {return B_ERROR;};
212status_t AbstractFileInterfaceAddOn::_Reserved_AbstractFileInterfaceAddOn_10(void *) {return B_ERROR;};
213status_t AbstractFileInterfaceAddOn::_Reserved_AbstractFileInterfaceAddOn_11(void *) {return B_ERROR;};
214status_t AbstractFileInterfaceAddOn::_Reserved_AbstractFileInterfaceAddOn_12(void *) {return B_ERROR;};
215status_t AbstractFileInterfaceAddOn::_Reserved_AbstractFileInterfaceAddOn_13(void *) {return B_ERROR;};
216status_t AbstractFileInterfaceAddOn::_Reserved_AbstractFileInterfaceAddOn_14(void *) {return B_ERROR;};
217status_t AbstractFileInterfaceAddOn::_Reserved_AbstractFileInterfaceAddOn_15(void *) {return B_ERROR;};
218