1/*
2 * Copyright (c) 1999-2000, Eric Moon.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions, and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions, and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * 3. The name of the author may not be used to endorse or promote products
17 *    derived from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 * OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
27 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31
32// LiveNodeIO.cpp
33
34#include "LiveNodeIO.h"
35#include "ImportContext.h"
36#include "ExportContext.h"
37#include "NodeSetIOContext.h"
38#include "StringContent.h"
39
40#include "NodeManager.h"
41
42#include <Debug.h>
43#include <MediaAddOn.h>
44#include <MediaDefs.h>
45#include <MediaRoster.h>
46#include <Path.h>
47
48#include "route_app_io.h"
49
50__USE_CORTEX_NAMESPACE
51
52// -------------------------------------------------------- //
53// *** ctor/dtor
54// -------------------------------------------------------- //
55
56LiveNodeIO::~LiveNodeIO() {}
57
58LiveNodeIO::LiveNodeIO() :
59	m_kind(0LL),
60	m_exportValid(false) {}
61
62LiveNodeIO::LiveNodeIO(
63	const NodeManager*			manager,
64	const NodeSetIOContext*	context,
65	media_node_id						node) :
66	m_exportValid(false) {
67
68	status_t err;
69	ASSERT(manager);
70	ASSERT(context);
71
72	err = _get_node_signature(
73		manager,
74		context,
75		node,
76		m_key,
77		m_name,
78		m_kind);
79	if(err < B_OK)
80		return;
81
82	m_exportValid = true;
83}
84
85// -------------------------------------------------------- //
86// *** import operations
87// -------------------------------------------------------- //
88
89// locate the referenced live node
90status_t LiveNodeIO::getNode(
91	const NodeManager*			manager,
92	const NodeSetIOContext*	context,
93	media_node_id*					outNode) const {
94
95	ASSERT(manager);
96	ASSERT(context);
97	status_t err;
98
99	if(hasKey()) {
100		// match key against previously imported nodes
101		err = context->getNodeFor(key(), outNode);
102
103		if(err < B_OK) {
104			// match key against system nodes
105			err = _match_system_node_key(key(), manager, outNode);
106
107			if(err < B_OK) {
108				PRINT((
109					"!!! No node found for key '%s'\n",
110					key()));
111				return B_NAME_NOT_FOUND;
112			}
113		}
114	}
115	else {
116		err = _match_node_signature(
117			name(),
118			kind(),
119			outNode);
120		if(err < B_OK) {
121			PRINT((
122				"!!! No node found named '%s' with kinds %" B_PRId64 "\n",
123				name(),
124				kind()));
125			return B_NAME_NOT_FOUND;
126		}
127	}
128
129	return B_OK;
130}
131
132// -------------------------------------------------------- //
133// *** document-type setup
134// -------------------------------------------------------- //
135
136/*static*/
137void LiveNodeIO::AddTo(
138	XML::DocumentType*			docType) {
139
140	// map self
141	docType->addMapping(new Mapping<LiveNodeIO>(_LIVE_NODE_ELEMENT));
142}
143
144// -------------------------------------------------------- //
145// *** IPersistent
146// -------------------------------------------------------- //
147
148// -------------------------------------------------------- //
149// EXPORT:
150// -------------------------------------------------------- //
151
152void LiveNodeIO::xmlExportBegin(
153	ExportContext&					context) const {
154
155	if(!m_exportValid) {
156		context.reportError(
157			"LiveNodeIO::xmlExportBegin():\n"
158			"*** invalid ***\n");
159		return;
160	}
161
162	context.beginElement(_LIVE_NODE_ELEMENT);
163}
164
165void LiveNodeIO::xmlExportAttributes(
166	ExportContext&					context) const {
167
168	if(m_key.Length() > 0)
169		context.writeAttr("key", m_key.String());
170}
171
172void LiveNodeIO::xmlExportContent(
173	ExportContext&					context) const {
174
175	if(m_name.Length() > 0) {
176		context.beginContent();
177
178		_write_simple(_NAME_ELEMENT, m_name.String(), context);
179		_write_node_kinds(m_kind, context);
180	}
181}
182
183void LiveNodeIO::xmlExportEnd(
184	ExportContext&					context) const {
185
186	context.endElement();
187}
188
189// -------------------------------------------------------- //
190// IMPORT:
191// -------------------------------------------------------- //
192
193void LiveNodeIO::xmlImportBegin(
194	ImportContext&					context) {}
195
196void LiveNodeIO::xmlImportAttribute(
197	const char*							key,
198	const char*							value,
199	ImportContext&					context) {
200
201	if(!strcmp(key, "key")) {
202		m_key = value;
203	}
204	else {
205		BString err;
206		err << "LiveNodeIO: unknown attribute '" << key << "'\n";
207		context.reportError(err.String());
208	}
209}
210
211void LiveNodeIO::xmlImportContent(
212	const char*							data,
213	uint32									length,
214	ImportContext&					context) {}
215
216void LiveNodeIO::xmlImportChild(
217	IPersistent*						child,
218	ImportContext&					context) {
219
220	StringContent* obj = dynamic_cast<StringContent*>(child);
221	if(!obj) {
222		BString err;
223		err << "LiveNodeIO: unexpected element '" <<
224			context.element() << "'\n";
225		context.reportError(err.String());
226		return;
227	}
228
229	if(!strcmp(context.element(), _NAME_ELEMENT))
230		m_name = obj->content;
231	else if(!strcmp(context.element(), _KIND_ELEMENT))
232		_read_node_kind(m_kind, obj->content.String(), context);
233	else {
234		BString err;
235		err << "LiveNodeIO: unexpected element '" <<
236			context.element() << "'\n";
237		context.reportError(err.String());
238	}
239
240	delete child;
241}
242
243void LiveNodeIO::xmlImportComplete(
244	ImportContext&					context) {}
245
246// END -- LiveNodeIO.cpp --
247
248