1*c284bb0fSMatt Madia /* 2*c284bb0fSMatt Madia * Copyright (c) 1999-2000, Eric Moon. 3*c284bb0fSMatt Madia * All rights reserved. 4*c284bb0fSMatt Madia * 5*c284bb0fSMatt Madia * Redistribution and use in source and binary forms, with or without 6*c284bb0fSMatt Madia * modification, are permitted provided that the following conditions 7*c284bb0fSMatt Madia * are met: 8*c284bb0fSMatt Madia * 9*c284bb0fSMatt Madia * 1. Redistributions of source code must retain the above copyright 10*c284bb0fSMatt Madia * notice, this list of conditions, and the following disclaimer. 11*c284bb0fSMatt Madia * 12*c284bb0fSMatt Madia * 2. Redistributions in binary form must reproduce the above copyright 13*c284bb0fSMatt Madia * notice, this list of conditions, and the following disclaimer in the 14*c284bb0fSMatt Madia * documentation and/or other materials provided with the distribution. 15*c284bb0fSMatt Madia * 16*c284bb0fSMatt Madia * 3. The name of the author may not be used to endorse or promote products 17*c284bb0fSMatt Madia * derived from this software without specific prior written permission. 18*c284bb0fSMatt Madia * 19*c284bb0fSMatt Madia * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR 20*c284bb0fSMatt Madia * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21*c284bb0fSMatt Madia * OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22*c284bb0fSMatt Madia * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 23*c284bb0fSMatt Madia * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24*c284bb0fSMatt Madia * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25*c284bb0fSMatt Madia * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 26*c284bb0fSMatt Madia * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 27*c284bb0fSMatt Madia * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28*c284bb0fSMatt Madia * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29*c284bb0fSMatt Madia */ 30*c284bb0fSMatt Madia 31*c284bb0fSMatt Madia 32a0795c6fSMarcus Overhagen // ConnectionIO.cpp 33a0795c6fSMarcus Overhagen 34a0795c6fSMarcus Overhagen #include "ConnectionIO.h" 35a0795c6fSMarcus Overhagen #include "LiveNodeIO.h" 36a0795c6fSMarcus Overhagen #include "NodeManager.h" 37a0795c6fSMarcus Overhagen #include "NodeSetIOContext.h" 38a0795c6fSMarcus Overhagen 39a0795c6fSMarcus Overhagen #include "MediaFormatIO.h" 40a0795c6fSMarcus Overhagen #include "route_app_io.h" 41a0795c6fSMarcus Overhagen 42a0795c6fSMarcus Overhagen #include <vector> 43a0795c6fSMarcus Overhagen #include <Debug.h> 44a0795c6fSMarcus Overhagen 4523e67806SIthamar R. Adema using namespace std; 4623e67806SIthamar R. Adema 47a0795c6fSMarcus Overhagen __USE_CORTEX_NAMESPACE 48a0795c6fSMarcus Overhagen 49a0795c6fSMarcus Overhagen // -------------------------------------------------------- // 50a0795c6fSMarcus Overhagen // *** ctor/dtor 51a0795c6fSMarcus Overhagen // -------------------------------------------------------- // 52a0795c6fSMarcus Overhagen 53a0795c6fSMarcus Overhagen ConnectionIO::~ConnectionIO() { 54a0795c6fSMarcus Overhagen if(m_inputNodeIO) delete m_inputNodeIO; 55a0795c6fSMarcus Overhagen if(m_outputNodeIO) delete m_outputNodeIO; 56a0795c6fSMarcus Overhagen } 57a0795c6fSMarcus Overhagen 58a0795c6fSMarcus Overhagen // initialize for import 59a0795c6fSMarcus Overhagen ConnectionIO::ConnectionIO() : 60a0795c6fSMarcus Overhagen m_inputNodeIO(0), 61a0795c6fSMarcus Overhagen m_outputNodeIO(0), 62a0795c6fSMarcus Overhagen m_flags(0), 63a0795c6fSMarcus Overhagen m_exportValid(false), 64a0795c6fSMarcus Overhagen m_importState(IMPORT_NONE) { 65a0795c6fSMarcus Overhagen 66a0795c6fSMarcus Overhagen m_outputFormat.type = B_MEDIA_NO_TYPE; 67a0795c6fSMarcus Overhagen m_inputFormat.type = B_MEDIA_NO_TYPE; 68a0795c6fSMarcus Overhagen m_requestedFormat.type = B_MEDIA_NO_TYPE; 69a0795c6fSMarcus Overhagen } 70a0795c6fSMarcus Overhagen 71a0795c6fSMarcus Overhagen // initialize for export 72a0795c6fSMarcus Overhagen ConnectionIO::ConnectionIO( 73a0795c6fSMarcus Overhagen const Connection* con, 74a0795c6fSMarcus Overhagen const NodeManager* manager, 75a0795c6fSMarcus Overhagen const NodeSetIOContext* context) : 76a0795c6fSMarcus Overhagen 77a0795c6fSMarcus Overhagen m_inputNodeIO(0), 78a0795c6fSMarcus Overhagen m_outputNodeIO(0), 79a0795c6fSMarcus Overhagen m_exportValid(false), 80a0795c6fSMarcus Overhagen m_importState(IMPORT_NONE) { 81a0795c6fSMarcus Overhagen 82a0795c6fSMarcus Overhagen ASSERT(con); 83a0795c6fSMarcus Overhagen ASSERT(manager); 84a0795c6fSMarcus Overhagen ASSERT(context); 85a0795c6fSMarcus Overhagen 86a0795c6fSMarcus Overhagen if(!con->isValid()) { 87a0795c6fSMarcus Overhagen PRINT(( 88a0795c6fSMarcus Overhagen "!!! ConnectionIO(): invalid connection\n")); 89a0795c6fSMarcus Overhagen return; 90a0795c6fSMarcus Overhagen } 91a0795c6fSMarcus Overhagen 92a0795c6fSMarcus Overhagen m_outputNodeIO = new LiveNodeIO( 93a0795c6fSMarcus Overhagen manager, 94a0795c6fSMarcus Overhagen context, 95a0795c6fSMarcus Overhagen con->sourceNode()); 96a0795c6fSMarcus Overhagen 97a0795c6fSMarcus Overhagen // fetch output (connection-point) description 98a0795c6fSMarcus Overhagen const char* name; 99a0795c6fSMarcus Overhagen if(con->getOutputHint( 100a0795c6fSMarcus Overhagen &name, 101a0795c6fSMarcus Overhagen &m_outputFormat) == B_OK) 102a0795c6fSMarcus Overhagen m_outputName = name; 103a0795c6fSMarcus Overhagen else { 104a0795c6fSMarcus Overhagen m_outputName = con->outputName(); 105a0795c6fSMarcus Overhagen } 106a0795c6fSMarcus Overhagen 107a0795c6fSMarcus Overhagen m_inputNodeIO = new LiveNodeIO( 108a0795c6fSMarcus Overhagen manager, 109a0795c6fSMarcus Overhagen context, 110a0795c6fSMarcus Overhagen con->destinationNode()); 111a0795c6fSMarcus Overhagen 112a0795c6fSMarcus Overhagen // fetch input (connection-point) description 113a0795c6fSMarcus Overhagen if(con->getInputHint( 114a0795c6fSMarcus Overhagen &name, 115a0795c6fSMarcus Overhagen &m_inputFormat) == B_OK) 116a0795c6fSMarcus Overhagen m_inputName = name; 117a0795c6fSMarcus Overhagen 118a0795c6fSMarcus Overhagen else { 119a0795c6fSMarcus Overhagen m_inputName = con->inputName(); 120a0795c6fSMarcus Overhagen } 121a0795c6fSMarcus Overhagen 122a0795c6fSMarcus Overhagen m_requestedFormat = con->requestedFormat(); 123a0795c6fSMarcus Overhagen m_flags = con->flags(); 124a0795c6fSMarcus Overhagen 125a0795c6fSMarcus Overhagen m_exportValid = true; 126a0795c6fSMarcus Overhagen } 127a0795c6fSMarcus Overhagen 128a0795c6fSMarcus Overhagen // -------------------------------------------------------- // 129a0795c6fSMarcus Overhagen // *** operations 130a0795c6fSMarcus Overhagen // -------------------------------------------------------- // 131a0795c6fSMarcus Overhagen 132a0795c6fSMarcus Overhagen // call when object imported to create the described 133a0795c6fSMarcus Overhagen // connection 134a0795c6fSMarcus Overhagen 135a0795c6fSMarcus Overhagen // +++++ to do 136a0795c6fSMarcus Overhagen // smarter input/output matching -- if no name/format provided, 137a0795c6fSMarcus Overhagen // pick the first available endpoint. otherwise, make two passes: 138a0795c6fSMarcus Overhagen // 1) match all nodes w/ given name (pass wildcards through to roster) 139a0795c6fSMarcus Overhagen // 2) filter by format 140a0795c6fSMarcus Overhagen 141a0795c6fSMarcus Overhagen status_t ConnectionIO::instantiate( 142a0795c6fSMarcus Overhagen NodeManager* manager, 143a0795c6fSMarcus Overhagen const NodeSetIOContext* context, 144a0795c6fSMarcus Overhagen Connection* outCon) { 145a0795c6fSMarcus Overhagen 146a0795c6fSMarcus Overhagen // sanity checks 147a0795c6fSMarcus Overhagen ASSERT(manager); 148a0795c6fSMarcus Overhagen if(!m_inputNodeIO || !m_outputNodeIO) 149a0795c6fSMarcus Overhagen return B_NOT_ALLOWED; 150a0795c6fSMarcus Overhagen 151a0795c6fSMarcus Overhagen status_t err; 152a0795c6fSMarcus Overhagen media_node_id node; 153a0795c6fSMarcus Overhagen 154a0795c6fSMarcus Overhagen // find output node 155a0795c6fSMarcus Overhagen NodeRef* outputRef; 156a0795c6fSMarcus Overhagen err = m_outputNodeIO->getNode(manager, context, &node); 157a0795c6fSMarcus Overhagen if(err < B_OK) 158a0795c6fSMarcus Overhagen return err; 159a0795c6fSMarcus Overhagen err = manager->getNodeRef( 160a0795c6fSMarcus Overhagen node, 161a0795c6fSMarcus Overhagen &outputRef); 162a0795c6fSMarcus Overhagen if(err < B_OK) 163a0795c6fSMarcus Overhagen return err; 164a0795c6fSMarcus Overhagen 165a0795c6fSMarcus Overhagen // find output +++++ currently matches by name only 166a0795c6fSMarcus Overhagen const int32 outputBufferSize = 16; 167a0795c6fSMarcus Overhagen media_output outputs[outputBufferSize]; 168a0795c6fSMarcus Overhagen int32 count = outputBufferSize; 169a0795c6fSMarcus Overhagen 170a0795c6fSMarcus Overhagen //vector<media_output> outputs; 171a0795c6fSMarcus Overhagen // err = outputRef->getFreeOutputs( 172a0795c6fSMarcus Overhagen // outputs/*, 173a0795c6fSMarcus Overhagen // m_outputFormat.type*/); 174a0795c6fSMarcus Overhagen 175a0795c6fSMarcus Overhagen err = outputRef->getFreeOutputs( 176a0795c6fSMarcus Overhagen outputs, 177a0795c6fSMarcus Overhagen outputBufferSize, 178a0795c6fSMarcus Overhagen &count); 179a0795c6fSMarcus Overhagen if(err < B_OK) 180a0795c6fSMarcus Overhagen return err; 181a0795c6fSMarcus Overhagen 182a0795c6fSMarcus Overhagen media_output output; 183a0795c6fSMarcus Overhagen bool found = false; 184a0795c6fSMarcus Overhagen for(int n = 0; n < count; ++n) { 185a0795c6fSMarcus Overhagen if(m_outputName == outputs[n].name) { 186a0795c6fSMarcus Overhagen output = outputs[n]; 187a0795c6fSMarcus Overhagen found = true; 188a0795c6fSMarcus Overhagen break; 189a0795c6fSMarcus Overhagen } 190a0795c6fSMarcus Overhagen } 191a0795c6fSMarcus Overhagen if(!found) { 192a0795c6fSMarcus Overhagen PRINT(("!!! output '%s' of node '%s' not found\n", 193a0795c6fSMarcus Overhagen m_outputName.String(), 194a0795c6fSMarcus Overhagen outputRef->name())); 195a0795c6fSMarcus Overhagen return B_NAME_NOT_FOUND; 196a0795c6fSMarcus Overhagen } 197a0795c6fSMarcus Overhagen 198a0795c6fSMarcus Overhagen // find input node 199a0795c6fSMarcus Overhagen NodeRef* inputRef; 200a0795c6fSMarcus Overhagen err = m_inputNodeIO->getNode(manager, context, &node); 201a0795c6fSMarcus Overhagen if(err < B_OK) 202a0795c6fSMarcus Overhagen return err; 203a0795c6fSMarcus Overhagen err = manager->getNodeRef( 204a0795c6fSMarcus Overhagen node, 205a0795c6fSMarcus Overhagen &inputRef); 206a0795c6fSMarcus Overhagen if(err < B_OK) 207a0795c6fSMarcus Overhagen return err; 208a0795c6fSMarcus Overhagen 209a0795c6fSMarcus Overhagen // find input +++++ currently matches by name only 210a0795c6fSMarcus Overhagen vector<media_input> inputs; 211a0795c6fSMarcus Overhagen err = inputRef->getFreeInputs( 212a0795c6fSMarcus Overhagen inputs /*, 213a0795c6fSMarcus Overhagen m_inputFormat.type*/); 214a0795c6fSMarcus Overhagen if(err < B_OK) 215a0795c6fSMarcus Overhagen return err; 216a0795c6fSMarcus Overhagen 217a0795c6fSMarcus Overhagen media_input input; 218a0795c6fSMarcus Overhagen found = false; 219a0795c6fSMarcus Overhagen for(unsigned int n = 0; n < inputs.size(); ++n) { 220a0795c6fSMarcus Overhagen if(m_inputName == inputs[n].name) { 221a0795c6fSMarcus Overhagen input = inputs[n]; 222a0795c6fSMarcus Overhagen found = true; 223a0795c6fSMarcus Overhagen break; 224a0795c6fSMarcus Overhagen } 225a0795c6fSMarcus Overhagen } 226a0795c6fSMarcus Overhagen if(!found) { 227a0795c6fSMarcus Overhagen PRINT(("!!! input '%s' of node '%s' not found\n", 228a0795c6fSMarcus Overhagen m_inputName.String(), 229a0795c6fSMarcus Overhagen inputRef->name())); 230a0795c6fSMarcus Overhagen return B_NAME_NOT_FOUND; 231a0795c6fSMarcus Overhagen } 232a0795c6fSMarcus Overhagen 233a0795c6fSMarcus Overhagen // connect 234a0795c6fSMarcus Overhagen Connection con; 235a0795c6fSMarcus Overhagen if(m_requestedFormat.type != B_MEDIA_NO_TYPE) 236a0795c6fSMarcus Overhagen err = manager->connect( 237a0795c6fSMarcus Overhagen output, 238a0795c6fSMarcus Overhagen input, 239a0795c6fSMarcus Overhagen m_requestedFormat, 240a0795c6fSMarcus Overhagen &con); 241a0795c6fSMarcus Overhagen else 242a0795c6fSMarcus Overhagen err = manager->connect( 243a0795c6fSMarcus Overhagen output, 244a0795c6fSMarcus Overhagen input, 245a0795c6fSMarcus Overhagen &con); 246a0795c6fSMarcus Overhagen 247a0795c6fSMarcus Overhagen if(err < B_OK) 248a0795c6fSMarcus Overhagen return err; 249a0795c6fSMarcus Overhagen 250a0795c6fSMarcus Overhagen if(outCon) 251a0795c6fSMarcus Overhagen *outCon = con; 252a0795c6fSMarcus Overhagen return B_OK; 253a0795c6fSMarcus Overhagen } 254a0795c6fSMarcus Overhagen 255a0795c6fSMarcus Overhagen // -------------------------------------------------------- // 256a0795c6fSMarcus Overhagen // *** document-type setup 257a0795c6fSMarcus Overhagen // -------------------------------------------------------- // 258a0795c6fSMarcus Overhagen 259a0795c6fSMarcus Overhagen /*static*/ 260a0795c6fSMarcus Overhagen void ConnectionIO::AddTo( 261a0795c6fSMarcus Overhagen XML::DocumentType* docType) { 262a0795c6fSMarcus Overhagen 263a0795c6fSMarcus Overhagen // map self 264a0795c6fSMarcus Overhagen docType->addMapping(new Mapping<ConnectionIO>(_CONNECTION_ELEMENT)); 265a0795c6fSMarcus Overhagen 266a0795c6fSMarcus Overhagen // map simple (content-only) elements 267a0795c6fSMarcus Overhagen // +++++ should these be added at a higher level, since they're 268a0795c6fSMarcus Overhagen // shared? no harm is done if one is added more than once, 269a0795c6fSMarcus Overhagen // since they'll always map to StringContent -- but it's way 270a0795c6fSMarcus Overhagen // messy! 271a0795c6fSMarcus Overhagen // +++++ 272a0795c6fSMarcus Overhagen //docType->addMapping(new Mapping<StringContent>(_LIVE_NODE_ELEMENT)); 273a0795c6fSMarcus Overhagen // docType->addMapping(new Mapping<StringContent>(_NAME_ELEMENT)); 274a0795c6fSMarcus Overhagen // docType->addMapping(new Mapping<StringContent>(_KIND_ELEMENT)); 275a0795c6fSMarcus Overhagen // docType->addMapping(new Mapping<StringContent>(_FLAG_ELEMENT)); 276a0795c6fSMarcus Overhagen } 277a0795c6fSMarcus Overhagen 278a0795c6fSMarcus Overhagen // -------------------------------------------------------- // 279a0795c6fSMarcus Overhagen // *** IPersistent 280a0795c6fSMarcus Overhagen // -------------------------------------------------------- // 281a0795c6fSMarcus Overhagen 282a0795c6fSMarcus Overhagen // -------------------------------------------------------- // 283a0795c6fSMarcus Overhagen // EXPORT: 284a0795c6fSMarcus Overhagen // -------------------------------------------------------- // 285a0795c6fSMarcus Overhagen 286a0795c6fSMarcus Overhagen 287a0795c6fSMarcus Overhagen // -------------------------------------------------------- // 288a0795c6fSMarcus Overhagen void ConnectionIO::xmlExportBegin( 289a0795c6fSMarcus Overhagen ExportContext& context) const { 290a0795c6fSMarcus Overhagen 291a0795c6fSMarcus Overhagen if(!m_exportValid) { 292a0795c6fSMarcus Overhagen context.reportError( 293a0795c6fSMarcus Overhagen "ConnectionIO::xmlExportBegin():\n" 294a0795c6fSMarcus Overhagen "*** invalid ***\n"); 295a0795c6fSMarcus Overhagen return; 296a0795c6fSMarcus Overhagen } 297a0795c6fSMarcus Overhagen 298a0795c6fSMarcus Overhagen context.beginElement(_CONNECTION_ELEMENT); 299a0795c6fSMarcus Overhagen } 300a0795c6fSMarcus Overhagen 301a0795c6fSMarcus Overhagen void ConnectionIO::xmlExportAttributes( 302a0795c6fSMarcus Overhagen ExportContext& context) const { TOUCH(context); } 303a0795c6fSMarcus Overhagen 304a0795c6fSMarcus Overhagen void ConnectionIO::xmlExportContent( 305a0795c6fSMarcus Overhagen ExportContext& context) const { 306a0795c6fSMarcus Overhagen 307a0795c6fSMarcus Overhagen context.beginContent(); 308a0795c6fSMarcus Overhagen 309a0795c6fSMarcus Overhagen // write output 310a0795c6fSMarcus Overhagen { 311a0795c6fSMarcus Overhagen context.beginElement(_OUTPUT_ELEMENT); 312a0795c6fSMarcus Overhagen context.beginContent(); 313a0795c6fSMarcus Overhagen 314a0795c6fSMarcus Overhagen // describe the node 315a0795c6fSMarcus Overhagen // LiveNodeIO nodeIO( 316a0795c6fSMarcus Overhagen // m_manager, 317a0795c6fSMarcus Overhagen // dynamic_cast<NodeSetIOContext*>(&context), 318a0795c6fSMarcus Overhagen // m_outputNode); 319a0795c6fSMarcus Overhagen context.writeObject(m_outputNodeIO); 320a0795c6fSMarcus Overhagen 321a0795c6fSMarcus Overhagen // context.beginElement(_LIVE_NODE_ELEMENT); 322a0795c6fSMarcus Overhagen // if(m_outputNodeKey.Length()) { 323a0795c6fSMarcus Overhagen // context.writeAttr("key", m_outputNodeKey); 324a0795c6fSMarcus Overhagen // } 325a0795c6fSMarcus Overhagen // else { 326a0795c6fSMarcus Overhagen // _write_simple("name", m_outputNodeName.String(), context); 327a0795c6fSMarcus Overhagen // _write_node_kinds(m_outputNodeKind, context); 328a0795c6fSMarcus Overhagen // } 329a0795c6fSMarcus Overhagen // context.endElement(); // _LIVE_NODE_ELEMENT 330a0795c6fSMarcus Overhagen 331a0795c6fSMarcus Overhagen // describe the output 332a0795c6fSMarcus Overhagen 333a0795c6fSMarcus Overhagen _write_simple("name", m_outputName.String(), context); 334a0795c6fSMarcus Overhagen 335a0795c6fSMarcus Overhagen if(m_outputFormat.type > B_MEDIA_UNKNOWN_TYPE) { 336a0795c6fSMarcus Overhagen MediaFormatIO io(m_outputFormat); 337a0795c6fSMarcus Overhagen context.writeObject(&io); 338a0795c6fSMarcus Overhagen } 339a0795c6fSMarcus Overhagen 340a0795c6fSMarcus Overhagen context.endElement(); // _OUTPUT_ELEMENT 341a0795c6fSMarcus Overhagen } 342a0795c6fSMarcus Overhagen 343a0795c6fSMarcus Overhagen // write input 344a0795c6fSMarcus Overhagen { 345a0795c6fSMarcus Overhagen context.beginElement(_INPUT_ELEMENT); 346a0795c6fSMarcus Overhagen context.beginContent(); 347a0795c6fSMarcus Overhagen 348a0795c6fSMarcus Overhagen // describe the node 349a0795c6fSMarcus Overhagen // LiveNodeIO nodeIO( 350a0795c6fSMarcus Overhagen // m_manager, 351a0795c6fSMarcus Overhagen // dynamic_cast<NodeSetIOContext*>(&context), 352a0795c6fSMarcus Overhagen // m_inputNode); 353a0795c6fSMarcus Overhagen context.writeObject(m_inputNodeIO); 354a0795c6fSMarcus Overhagen 355a0795c6fSMarcus Overhagen // context.beginElement(_LIVE_NODE_ELEMENT); 356a0795c6fSMarcus Overhagen // if(m_inputNodeKey.Length()) { 357a0795c6fSMarcus Overhagen // context.writeAttr("key", m_inputNodeKey); 358a0795c6fSMarcus Overhagen // } 359a0795c6fSMarcus Overhagen // else { 360a0795c6fSMarcus Overhagen // _write_simple("name", m_inputNodeName.String(), context); 361a0795c6fSMarcus Overhagen // _write_node_kinds(m_inputNodeKind, context); 362a0795c6fSMarcus Overhagen // } 363a0795c6fSMarcus Overhagen // context.endElement(); // _LIVE_NODE_ELEMENT 364a0795c6fSMarcus Overhagen 365a0795c6fSMarcus Overhagen // describe the input 366a0795c6fSMarcus Overhagen 367a0795c6fSMarcus Overhagen _write_simple("name", m_inputName.String(), context); 368a0795c6fSMarcus Overhagen 369a0795c6fSMarcus Overhagen if(m_inputFormat.type > B_MEDIA_UNKNOWN_TYPE) { 370a0795c6fSMarcus Overhagen MediaFormatIO io(m_inputFormat); 371a0795c6fSMarcus Overhagen context.writeObject(&io); 372a0795c6fSMarcus Overhagen } 373a0795c6fSMarcus Overhagen 374a0795c6fSMarcus Overhagen context.endElement(); // _INPUT_ELEMENT 375a0795c6fSMarcus Overhagen } 376a0795c6fSMarcus Overhagen 377a0795c6fSMarcus Overhagen // write requested format 378a0795c6fSMarcus Overhagen if(m_requestedFormat.type > B_MEDIA_UNKNOWN_TYPE) { 379a0795c6fSMarcus Overhagen MediaFormatIO io(m_requestedFormat); 380a0795c6fSMarcus Overhagen BString comment = "\n"; 381a0795c6fSMarcus Overhagen comment << context.indentString(); 382a0795c6fSMarcus Overhagen comment << "<!-- initial requested format -->"; 383a0795c6fSMarcus Overhagen context.writeString(comment); 384a0795c6fSMarcus Overhagen context.writeObject(&io); 385a0795c6fSMarcus Overhagen } 386a0795c6fSMarcus Overhagen } 387a0795c6fSMarcus Overhagen 388a0795c6fSMarcus Overhagen void ConnectionIO::xmlExportEnd( 389a0795c6fSMarcus Overhagen ExportContext& context) const { 390a0795c6fSMarcus Overhagen 391a0795c6fSMarcus Overhagen context.endElement(); // _CONNECTION_ELEMENT 392a0795c6fSMarcus Overhagen } 393a0795c6fSMarcus Overhagen 394a0795c6fSMarcus Overhagen // -------------------------------------------------------- // 395a0795c6fSMarcus Overhagen // IMPORT: 396a0795c6fSMarcus Overhagen // -------------------------------------------------------- // 397a0795c6fSMarcus Overhagen 398a0795c6fSMarcus Overhagen void ConnectionIO::xmlImportBegin( 399a0795c6fSMarcus Overhagen ImportContext& context) { TOUCH(context); } 400a0795c6fSMarcus Overhagen 401a0795c6fSMarcus Overhagen void ConnectionIO::xmlImportAttribute( 402a0795c6fSMarcus Overhagen const char* key, 403a0795c6fSMarcus Overhagen const char* value, 404a0795c6fSMarcus Overhagen ImportContext& context) { TOUCH(key); TOUCH(value); TOUCH(context); } 405a0795c6fSMarcus Overhagen 406a0795c6fSMarcus Overhagen void ConnectionIO::xmlImportContent( 407a0795c6fSMarcus Overhagen const char* data, 408a0795c6fSMarcus Overhagen uint32 length, 409a0795c6fSMarcus Overhagen ImportContext& context) { TOUCH(data); TOUCH(length); TOUCH(context); } 410a0795c6fSMarcus Overhagen 411a0795c6fSMarcus Overhagen void ConnectionIO::xmlImportChild( 412a0795c6fSMarcus Overhagen IPersistent* child, 413a0795c6fSMarcus Overhagen ImportContext& context) { 414a0795c6fSMarcus Overhagen 415a0795c6fSMarcus Overhagen status_t err; 416a0795c6fSMarcus Overhagen 417a0795c6fSMarcus Overhagen if(!strcmp(context.element(), _LIVE_NODE_ELEMENT)) { 418a0795c6fSMarcus Overhagen LiveNodeIO* nodeIO = dynamic_cast<LiveNodeIO*>(child); 419a0795c6fSMarcus Overhagen ASSERT(nodeIO); 420a0795c6fSMarcus Overhagen 421a0795c6fSMarcus Overhagen // store the LiveNodeIO for now; it will be used in 422a0795c6fSMarcus Overhagen // instantiate() 423a0795c6fSMarcus Overhagen 424a0795c6fSMarcus Overhagen switch(m_importState) { 425a0795c6fSMarcus Overhagen case IMPORT_OUTPUT: 426a0795c6fSMarcus Overhagen m_outputNodeIO = nodeIO; 427a0795c6fSMarcus Overhagen child = 0; // don't delete child object 428a0795c6fSMarcus Overhagen break; 429a0795c6fSMarcus Overhagen 430a0795c6fSMarcus Overhagen case IMPORT_INPUT: 431a0795c6fSMarcus Overhagen m_inputNodeIO = nodeIO; 432a0795c6fSMarcus Overhagen child = 0; // don't delete child object 433a0795c6fSMarcus Overhagen break; 434a0795c6fSMarcus Overhagen 435a0795c6fSMarcus Overhagen case IMPORT_NONE: 436a0795c6fSMarcus Overhagen context.reportError("Unexpected node description.\n"); 437a0795c6fSMarcus Overhagen delete child; 438a0795c6fSMarcus Overhagen return; 439a0795c6fSMarcus Overhagen } 440a0795c6fSMarcus Overhagen } 441a0795c6fSMarcus Overhagen else if(!strcmp(context.element(), _NAME_ELEMENT)) { 442a0795c6fSMarcus Overhagen StringContent* c = dynamic_cast<StringContent*>(child); 443a0795c6fSMarcus Overhagen ASSERT(c); 444a0795c6fSMarcus Overhagen 445a0795c6fSMarcus Overhagen switch(m_importState) { 446a0795c6fSMarcus Overhagen case IMPORT_OUTPUT: 447a0795c6fSMarcus Overhagen m_outputName = c->content; 448a0795c6fSMarcus Overhagen break; 449a0795c6fSMarcus Overhagen 450a0795c6fSMarcus Overhagen case IMPORT_INPUT: 451a0795c6fSMarcus Overhagen m_inputName = c->content; 452a0795c6fSMarcus Overhagen break; 453a0795c6fSMarcus Overhagen 454a0795c6fSMarcus Overhagen case IMPORT_NONE: 455a0795c6fSMarcus Overhagen context.reportError("Unexpected node name.\n"); 456a0795c6fSMarcus Overhagen delete child; 457a0795c6fSMarcus Overhagen return; 458a0795c6fSMarcus Overhagen } 459a0795c6fSMarcus Overhagen } 460a0795c6fSMarcus Overhagen else { 461a0795c6fSMarcus Overhagen MediaFormatIO* io = dynamic_cast<MediaFormatIO*>(child); 462a0795c6fSMarcus Overhagen if(!io) { 463a0795c6fSMarcus Overhagen context.reportError("Unexpected element.\n"); 464a0795c6fSMarcus Overhagen delete child; 465a0795c6fSMarcus Overhagen return; 466a0795c6fSMarcus Overhagen } 467a0795c6fSMarcus Overhagen 468a0795c6fSMarcus Overhagen media_format f; 469a0795c6fSMarcus Overhagen err = io->getFormat(f); 470a0795c6fSMarcus Overhagen if(err < B_OK) { 471a0795c6fSMarcus Overhagen context.reportError("Malformed format.\n"); 472a0795c6fSMarcus Overhagen delete child; 473a0795c6fSMarcus Overhagen return; 474a0795c6fSMarcus Overhagen } 475a0795c6fSMarcus Overhagen 476a0795c6fSMarcus Overhagen switch(m_importState) { 477a0795c6fSMarcus Overhagen case IMPORT_OUTPUT: 478a0795c6fSMarcus Overhagen m_outputFormat = f; 479a0795c6fSMarcus Overhagen break; 480a0795c6fSMarcus Overhagen 481a0795c6fSMarcus Overhagen case IMPORT_INPUT: 482a0795c6fSMarcus Overhagen m_inputFormat = f; 483a0795c6fSMarcus Overhagen break; 484a0795c6fSMarcus Overhagen 485a0795c6fSMarcus Overhagen case IMPORT_NONE: 486a0795c6fSMarcus Overhagen m_requestedFormat = f; 487a0795c6fSMarcus Overhagen break; 488a0795c6fSMarcus Overhagen } 489a0795c6fSMarcus Overhagen } 490a0795c6fSMarcus Overhagen 491a0795c6fSMarcus Overhagen if(child) 492a0795c6fSMarcus Overhagen delete child; 493a0795c6fSMarcus Overhagen } 494a0795c6fSMarcus Overhagen 495a0795c6fSMarcus Overhagen void ConnectionIO::xmlImportComplete( 496a0795c6fSMarcus Overhagen ImportContext& context) { 497a0795c6fSMarcus Overhagen 498a0795c6fSMarcus Overhagen // +++++ 499a0795c6fSMarcus Overhagen } 500a0795c6fSMarcus Overhagen 501a0795c6fSMarcus Overhagen void ConnectionIO::xmlImportChildBegin( 502a0795c6fSMarcus Overhagen const char* name, 503a0795c6fSMarcus Overhagen ImportContext& context) { 504a0795c6fSMarcus Overhagen 505a0795c6fSMarcus Overhagen if(!strcmp(name, "input")) { 506a0795c6fSMarcus Overhagen if(m_importState != IMPORT_NONE) { 507a0795c6fSMarcus Overhagen context.reportError("ConnectionIO: unexpected nested child element\n"); 508a0795c6fSMarcus Overhagen return; 509a0795c6fSMarcus Overhagen } 510a0795c6fSMarcus Overhagen m_importState = IMPORT_INPUT; 511a0795c6fSMarcus Overhagen } 512a0795c6fSMarcus Overhagen else if(!strcmp(name, "output")) { 513a0795c6fSMarcus Overhagen if(m_importState != IMPORT_NONE) { 514a0795c6fSMarcus Overhagen context.reportError("ConnectionIO: unexpected nested child element\n"); 515a0795c6fSMarcus Overhagen return; 516a0795c6fSMarcus Overhagen } 517a0795c6fSMarcus Overhagen m_importState = IMPORT_OUTPUT; 518a0795c6fSMarcus Overhagen } 519a0795c6fSMarcus Overhagen else 520a0795c6fSMarcus Overhagen context.reportError("ConnectionIO: unexpected child element\n"); 521a0795c6fSMarcus Overhagen } 522a0795c6fSMarcus Overhagen 523a0795c6fSMarcus Overhagen void ConnectionIO::xmlImportChildComplete( 524a0795c6fSMarcus Overhagen const char* name, 525a0795c6fSMarcus Overhagen ImportContext& context) { 526a0795c6fSMarcus Overhagen TOUCH(name); TOUCH(context); 527a0795c6fSMarcus Overhagen 528a0795c6fSMarcus Overhagen m_importState = IMPORT_NONE; 529a0795c6fSMarcus Overhagen } 530a0795c6fSMarcus Overhagen 531a0795c6fSMarcus Overhagen // END -- ConnectionIO.cpp -- 532