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// RouteAppNodeManager.h 33// * PURPOSE 34// Extends NodeManager to provide services to a graphical 35// routing interface: 36// - automatic group management (groups are formed/merged 37// as nodes are connected, and split when nodes are 38// disconnected) 39// - error logging via BMessage +++++ nyi 40// - icon management: generation and caching of MediaIcons 41// 42// - persistence support: drives export and import of user-created 43// nodes, groups, and connections to & from XML streams. 44// 45// EXPORT PROCESS 46// 47// 1) Assign each node to be saved an ID string. Reject nodes 48// that the user didn't create. 49// 2) Export each node. 50// 3) Export each connection. 51// 4) Export each group. 52// 5) Export UI state data via export-context hook 53// 54// IMPORT PROCESS 55// 56// 1) Import each node's description and [try to] instantiate the 57// node. Build a map of ID -> media_node_id. 58// (?) how much failure tolerance is too much? 59// 2) Import and attempt to recreate each connection. Note: once 60// notification of the connection comes, the default behavior 61// will be to automatically group the node; this needs to be 62// bypassed! 63// 3) Import each group. 64// 4) Import UI state data via import-context hook 65// 66// * HISTORY 67// c.lenz 28may00 Begun notification/error logging support 68// e.moon 7dec99 Persistence support 69// e.moon 7nov99 Begun 70 71#ifndef __RouteAppNodeManager_H__ 72#define __RouteAppNodeManager_H__ 73 74#include <Mime.h> // defines icon_size -- weird. 75 76#include <map> 77#include <set> 78 79#include "NodeManager.h" 80#include "XML.h" 81#include "ImportContext.h" 82#include "ExportContext.h" 83 84#include "NodeKey.h" 85 86#include "cortex_defs.h" 87__BEGIN_CORTEX_NAMESPACE 88 89class MediaIcon; 90 91class RouteAppNodeManager : 92 public NodeManager, 93 public IPersistent { 94 95public: // *** constants 96 enum message_t { 97 // outbound: sent to the designated log-message target 98 // 'text' (string) +++++ not yet implemented 99 M_LOG = RouteAppNodeManager_message_base, 100 101 // outbound: sent to observers when a time source is added/removed 102 // 'nodeID' (int32) 103 M_TIME_SOURCE_CREATED, 104 M_TIME_SOURCE_DELETED 105 }; 106 107// static const char* const s_rootElement; 108// static const char* const s_uiStateElement; 109 110public: // *** ctor/dtor 111 virtual ~RouteAppNodeManager(); 112 RouteAppNodeManager( 113 bool useAddOnHost=false); 114 115public: // *** group management 116 117public: // *** icon management 118 119 // fetch cached icon for the given live node; the MediaIcon 120 // instance is guaranteed to last as long as this object. 121 // Returns 0 if the node doesn't exist. 122 123 const MediaIcon* mediaIconFor( 124 media_node_id nodeID, 125 icon_size iconSize); 126 127 const MediaIcon* mediaIconFor( 128 live_node_info nodeInfo, 129 icon_size iconSize); 130 131public: // *** notification & error handling 132 133 status_t setNotifyTarget( 134 const BMessenger& target); 135 136 status_t setLogTarget( 137 const BMessenger& target); 138 139public: // NodeManager hook implementations 140 141 virtual void nodeCreated( 142 NodeRef* ref); 143 144 virtual void nodeDeleted( 145 const NodeRef* ref); 146 147 virtual void connectionMade( 148 Connection* connection); 149 150 virtual void connectionBroken( 151 const Connection* connection); 152 153 virtual void connectionFailed( 154 const media_output & output, 155 const media_input & input, 156 const media_format & format, 157 status_t error); 158 159public: // *** IPersistent 160 161 // EXPORT 162 163 virtual void xmlExportBegin( 164 ExportContext& context) const; 165 166 virtual void xmlExportAttributes( 167 ExportContext& context) const; 168 169 virtual void xmlExportContent( 170 ExportContext& context) const; //nyi 171 172 virtual void xmlExportEnd( 173 ExportContext& context) const; 174 175 // IMPORT 176 177 virtual void xmlImportBegin( 178 ImportContext& context); //nyi 179 180 virtual void xmlImportAttribute( 181 const char* key, 182 const char* value, 183 ImportContext& context); //nyi 184 185 virtual void xmlImportContent( 186 const char* data, 187 uint32 length, 188 ImportContext& context); //nyi 189 190 virtual void xmlImportChild( 191 IPersistent* child, 192 ImportContext& context); //nyi 193 194 virtual void xmlImportComplete( 195 ImportContext& context); //nyi 196 197public: // *** static setup method 198 199 // call this method to install element hooks in the 200 // given document type 201 static void AddTo( 202 XML::DocumentType* docType); 203 204private: // implementation 205 206 // current new-group-name index 207 uint32 m_nextGroupNumber; 208 209 // app message handler: group selection, etc 210 BMessenger m_notifyTarget; 211 212 // log-message handler 213 BMessenger m_logTarget; 214 215 // cached MediaIcon instances 216 // KEY: 217 // high 32 bits: media_node_id 218 // low 32 bits: icon_size 219 typedef std::map<uint64, MediaIcon*> icon_map; 220 icon_map m_iconMap; 221 222// class import_state* m_importState; 223 224private: 225 226 uint64 _makeIconKey(media_node_id, icon_size); 227 void _readIconKey(uint64, media_node_id&, icon_size&); 228 void _freeIcons(); 229 230 bool _canGroup(NodeRef* ref) const; 231 232// void _exportNode(NodeRef* ref, const char* key, ExportContext& context) const; 233// void _exportConnection(Connection* connection, ExportContext& context) const; //nyi 234// void _exportGroup(NodeGroup* group, ExportContext& context) const; //nyi 235// 236// void _importDormantNode( 237// class _dormant_node_import_state* state, 238// ImportContext& context); //nyi 239}; 240 241__END_CORTEX_NAMESPACE 242#endif /*__RouteAppNodeManager_H__*/ 243