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