121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn/* 221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * Copyright (C) 2011 The Android Open Source Project 321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * 421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * Licensed under the Apache License, Version 2.0 (the "License"); 521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * you may not use this file except in compliance with the License. 621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * You may obtain a copy of the License at 721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * 821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * http://www.apache.org/licenses/LICENSE-2.0 921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * 1021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * Unless required by applicable law or agreed to in writing, software 1121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * distributed under the License is distributed on an "AS IS" BASIS, 1221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * See the License for the specific language governing permissions and 1421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * limitations under the License. 1521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn */ 1621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn 1721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn 1821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Rennpackage android.filterfw.core; 1921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn 20a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala/** 21a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala * @hide 22a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala */ 23f24dc0f733da39b32f15177871a79810d52e6212Marius Rennpublic class OutputPort extends FilterPort { 24f24dc0f733da39b32f15177871a79810d52e6212Marius Renn 25f24dc0f733da39b32f15177871a79810d52e6212Marius Renn protected InputPort mTargetPort; 26f24dc0f733da39b32f15177871a79810d52e6212Marius Renn protected InputPort mBasePort; 2721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn 2821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn public OutputPort(Filter filter, String name) { 2921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn super(filter, name); 3021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 3121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn 32f24dc0f733da39b32f15177871a79810d52e6212Marius Renn public void connectTo(InputPort target) { 33f24dc0f733da39b32f15177871a79810d52e6212Marius Renn if (mTargetPort != null) { 34f24dc0f733da39b32f15177871a79810d52e6212Marius Renn throw new RuntimeException(this + " already connected to " + mTargetPort + "!"); 35f24dc0f733da39b32f15177871a79810d52e6212Marius Renn } 36f24dc0f733da39b32f15177871a79810d52e6212Marius Renn mTargetPort = target; 37f24dc0f733da39b32f15177871a79810d52e6212Marius Renn mTargetPort.setSourcePort(this); 38f24dc0f733da39b32f15177871a79810d52e6212Marius Renn } 39f24dc0f733da39b32f15177871a79810d52e6212Marius Renn 40f24dc0f733da39b32f15177871a79810d52e6212Marius Renn public boolean isConnected() { 41f24dc0f733da39b32f15177871a79810d52e6212Marius Renn return mTargetPort != null; 42f24dc0f733da39b32f15177871a79810d52e6212Marius Renn } 43f24dc0f733da39b32f15177871a79810d52e6212Marius Renn 44f24dc0f733da39b32f15177871a79810d52e6212Marius Renn public void open() { 45f24dc0f733da39b32f15177871a79810d52e6212Marius Renn super.open(); 46f24dc0f733da39b32f15177871a79810d52e6212Marius Renn if (mTargetPort != null && !mTargetPort.isOpen()) { 47f24dc0f733da39b32f15177871a79810d52e6212Marius Renn mTargetPort.open(); 48f24dc0f733da39b32f15177871a79810d52e6212Marius Renn } 49f24dc0f733da39b32f15177871a79810d52e6212Marius Renn } 50f24dc0f733da39b32f15177871a79810d52e6212Marius Renn 51f24dc0f733da39b32f15177871a79810d52e6212Marius Renn public void close() { 52f24dc0f733da39b32f15177871a79810d52e6212Marius Renn super.close(); 53f24dc0f733da39b32f15177871a79810d52e6212Marius Renn if (mTargetPort != null && mTargetPort.isOpen()) { 54f24dc0f733da39b32f15177871a79810d52e6212Marius Renn mTargetPort.close(); 55f24dc0f733da39b32f15177871a79810d52e6212Marius Renn } 56f24dc0f733da39b32f15177871a79810d52e6212Marius Renn } 57f24dc0f733da39b32f15177871a79810d52e6212Marius Renn 58f24dc0f733da39b32f15177871a79810d52e6212Marius Renn public InputPort getTargetPort() { 59f24dc0f733da39b32f15177871a79810d52e6212Marius Renn return mTargetPort; 60f24dc0f733da39b32f15177871a79810d52e6212Marius Renn } 61f24dc0f733da39b32f15177871a79810d52e6212Marius Renn 62f24dc0f733da39b32f15177871a79810d52e6212Marius Renn public Filter getTargetFilter() { 63f24dc0f733da39b32f15177871a79810d52e6212Marius Renn return mTargetPort == null ? null : mTargetPort.getFilter(); 64f24dc0f733da39b32f15177871a79810d52e6212Marius Renn } 65f24dc0f733da39b32f15177871a79810d52e6212Marius Renn 66f24dc0f733da39b32f15177871a79810d52e6212Marius Renn public void setBasePort(InputPort basePort) { 67f24dc0f733da39b32f15177871a79810d52e6212Marius Renn mBasePort = basePort; 68f24dc0f733da39b32f15177871a79810d52e6212Marius Renn } 69f24dc0f733da39b32f15177871a79810d52e6212Marius Renn 70f24dc0f733da39b32f15177871a79810d52e6212Marius Renn public InputPort getBasePort() { 71f24dc0f733da39b32f15177871a79810d52e6212Marius Renn return mBasePort; 72f24dc0f733da39b32f15177871a79810d52e6212Marius Renn } 73f24dc0f733da39b32f15177871a79810d52e6212Marius Renn 74f24dc0f733da39b32f15177871a79810d52e6212Marius Renn public boolean filterMustClose() { 75f24dc0f733da39b32f15177871a79810d52e6212Marius Renn return !isOpen() && isBlocking(); 76f24dc0f733da39b32f15177871a79810d52e6212Marius Renn } 77f24dc0f733da39b32f15177871a79810d52e6212Marius Renn 78f24dc0f733da39b32f15177871a79810d52e6212Marius Renn public boolean isReady() { 79489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn return (isOpen() && mTargetPort.acceptsFrame()) || !isBlocking(); 80f24dc0f733da39b32f15177871a79810d52e6212Marius Renn } 81f24dc0f733da39b32f15177871a79810d52e6212Marius Renn 8221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn @Override 8321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn public void clear() { 8421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn if (mTargetPort != null) { 8521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn mTargetPort.clear(); 8621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 8721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 8821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn 8921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn @Override 9021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn public void pushFrame(Frame frame) { 9121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn if (mTargetPort == null) { 9221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn throw new RuntimeException( 9321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn "Attempting to push frame on unconnected port: " + this + "!"); 9421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 9521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn mTargetPort.pushFrame(frame); 9621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 9721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn 9821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn @Override 9921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn public void setFrame(Frame frame) { 10021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn assertPortIsOpen(); 10121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn if (mTargetPort == null) { 10221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn throw new RuntimeException( 10321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn "Attempting to set frame on unconnected port: " + this + "!"); 10421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 10521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn mTargetPort.setFrame(frame); 10621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 10721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn 10821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn @Override 10921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn public Frame pullFrame() { 11021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn throw new RuntimeException("Cannot pull frame on " + this + "!"); 11121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 11221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn 11321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn @Override 11421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn public boolean hasFrame() { 11521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn return mTargetPort == null ? false : mTargetPort.hasFrame(); 11621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 11721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn 11821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn @Override 11921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn public String toString() { 12021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn return "output " + super.toString(); 12121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 12221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn} 123