| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| /* |
| * AddPipeViewer action can be used to add a new viewer to the pipes view |
| * this action can be run at anytime and user can be on any view and this action |
| * will still work. |
| * Depending on user preferences, user might be presented with a confirmation |
| * dialog to accept seeing the incoming pipe. |
| * @fileoverview |
| */ |
| |
| import { Logger } from 'libs/logs/logger' |
| import { register, trigger } from 'libs/mvc/actions' |
| |
| import { get as getPipeViewer } from 'pipe-viewers/manager' |
| |
| import { displayError } from 'actions/display-error' |
| import { navigatePipesPage } from 'actions/navigate-pipes-page' |
| import { redirectPipe } from 'actions/redirect-pipe' |
| |
| import { LoadingView } from 'views/loading/view' |
| |
| import { pipesViewInstance } from 'runtime/context' |
| |
| var log = new Logger('actions/add-pipe-viewer'); |
| var ACTION_NAME = 'addPipeViewer'; |
| var pipesPerNameCounter = {}; |
| |
| /* |
| * Registers the add pipe viewer action |
| */ |
| export function registerAddPipeViewerAction() { |
| register(ACTION_NAME, actionHandler); |
| } |
| |
| /* |
| * Triggers the add pipe viewer action |
| */ |
| export function addPipeViewer(name, stream) { |
| return trigger(ACTION_NAME, name, stream); |
| } |
| |
| /* |
| * Handles the addPipeViewer action. |
| * @param {string} name Name of the Pipe Viewer that is requested to play the stream. |
| * @param {Veyron.Stream} stream Stream of bytes from the p2b client. |
| * |
| * @private |
| */ |
| function actionHandler(name, stream) { |
| log.debug('addPipeViewer action triggered'); |
| |
| // Book keeping of number of pipe-viewers per name, we use this to generate |
| // display names and keys like image #3 |
| var count = (pipesPerNameCounter[name] || 0) + 1; |
| pipesPerNameCounter[name] = count; |
| var tabKey = name + count; |
| var tabName = 'Loading...'; |
| |
| // Get the plugin that can render the stream, ask it to play it and display |
| // the element returned by the pipeViewer. |
| getPipeViewer(name).then((pipeViewer) => { |
| tabName = pipeViewer.name + ' #' + count |
| return pipeViewer.play(stream); |
| }).then((pipeViewerView) => { |
| // replace the loading view with the actual viewerView |
| pipesViewInstance.replaceTabView(tabKey, tabName, pipeViewerView); |
| }).catch((e) => { displayError(e); }); |
| |
| // Add a new tab and show a loading indicator for now, |
| // then replace the loading view with the actual viewer when ready |
| // close the stream when tab closes |
| var loadingView = new LoadingView(); |
| pipesViewInstance.addTab(tabKey, tabName, loadingView, () => { |
| stream.end(); |
| }); |
| |
| // Add the redirect stream action |
| var icon = 'hardware:cast'; |
| pipesViewInstance.addToolbarAction(tabKey, icon, () => { |
| redirectPipe(stream, name); |
| }); |
| |
| // Take the user to the pipes view. |
| navigatePipesPage(); |
| } |