1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17
18package android.filterfw.core;
19
20/**
21 * @hide
22 */
23public class OutputPort extends FilterPort {
24
25    protected InputPort mTargetPort;
26    protected InputPort mBasePort;
27
28    public OutputPort(Filter filter, String name) {
29        super(filter, name);
30    }
31
32    public void connectTo(InputPort target) {
33        if (mTargetPort != null) {
34            throw new RuntimeException(this + " already connected to " + mTargetPort + "!");
35        }
36        mTargetPort = target;
37        mTargetPort.setSourcePort(this);
38    }
39
40    public boolean isConnected() {
41        return mTargetPort != null;
42    }
43
44    public void open() {
45        super.open();
46        if (mTargetPort != null && !mTargetPort.isOpen()) {
47            mTargetPort.open();
48        }
49    }
50
51    public void close() {
52        super.close();
53        if (mTargetPort != null && mTargetPort.isOpen()) {
54            mTargetPort.close();
55        }
56    }
57
58    public InputPort getTargetPort() {
59        return mTargetPort;
60    }
61
62    public Filter getTargetFilter() {
63        return mTargetPort == null ? null : mTargetPort.getFilter();
64    }
65
66    public void setBasePort(InputPort basePort) {
67        mBasePort = basePort;
68    }
69
70    public InputPort getBasePort() {
71        return mBasePort;
72    }
73
74    public boolean filterMustClose() {
75        return !isOpen() && isBlocking();
76    }
77
78    public boolean isReady() {
79        return (isOpen() && mTargetPort.acceptsFrame()) || !isBlocking();
80    }
81
82    @Override
83    public void clear() {
84        if (mTargetPort != null) {
85            mTargetPort.clear();
86        }
87    }
88
89    @Override
90    public void pushFrame(Frame frame) {
91        if (mTargetPort == null) {
92            throw new RuntimeException(
93                "Attempting to push frame on unconnected port: " + this + "!");
94        }
95        mTargetPort.pushFrame(frame);
96    }
97
98    @Override
99    public void setFrame(Frame frame) {
100        assertPortIsOpen();
101        if (mTargetPort == null) {
102            throw new RuntimeException(
103                "Attempting to set frame on unconnected port: " + this + "!");
104        }
105        mTargetPort.setFrame(frame);
106    }
107
108    @Override
109    public Frame pullFrame() {
110        throw new RuntimeException("Cannot pull frame on " + this + "!");
111    }
112
113    @Override
114    public boolean hasFrame() {
115        return mTargetPort == null ? false : mTargetPort.hasFrame();
116    }
117
118    @Override
119    public String toString() {
120        return "output " + super.toString();
121    }
122}
123