165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/*
265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Copyright (C) 2011 The Android Open Source Project
365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Licensed under the Apache License, Version 2.0 (the "License");
565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * you may not use this file except in compliance with the License.
665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * You may obtain a copy of the License at
765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *      http://www.apache.org/licenses/LICENSE-2.0
965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
1065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Unless required by applicable law or agreed to in writing, software
1165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * distributed under the License is distributed on an "AS IS" BASIS,
1265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * See the License for the specific language governing permissions and
1465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * limitations under the License.
1565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */
1665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
1765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
1865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennpackage android.filterfw.core;
1965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/**
2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * @hide
2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */
2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennpublic class OutputPort extends FilterPort {
2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    protected InputPort mTargetPort;
2665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    protected InputPort mBasePort;
2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public OutputPort(Filter filter, String name) {
2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        super(filter, name);
3065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public void connectTo(InputPort target) {
3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (mTargetPort != null) {
3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            throw new RuntimeException(this + " already connected to " + mTargetPort + "!");
3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        mTargetPort = target;
3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        mTargetPort.setSourcePort(this);
3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public boolean isConnected() {
4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mTargetPort != null;
4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public void open() {
4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        super.open();
4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (mTargetPort != null && !mTargetPort.isOpen()) {
4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            mTargetPort.open();
4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public void close() {
5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        super.close();
5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (mTargetPort != null && mTargetPort.isOpen()) {
5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            mTargetPort.close();
5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public InputPort getTargetPort() {
5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mTargetPort;
6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Filter getTargetFilter() {
6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mTargetPort == null ? null : mTargetPort.getFilter();
6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public void setBasePort(InputPort basePort) {
6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        mBasePort = basePort;
6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public InputPort getBasePort() {
7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mBasePort;
7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public boolean filterMustClose() {
7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return !isOpen() && isBlocking();
7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public boolean isReady() {
7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return (isOpen() && mTargetPort.acceptsFrame()) || !isBlocking();
8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
8165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
8265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    @Override
8365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public void clear() {
8465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (mTargetPort != null) {
8565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            mTargetPort.clear();
8665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
8765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
8865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
8965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    @Override
9065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public void pushFrame(Frame frame) {
9165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (mTargetPort == null) {
9265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            throw new RuntimeException(
9365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                "Attempting to push frame on unconnected port: " + this + "!");
9465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
9565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        mTargetPort.pushFrame(frame);
9665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
9765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    @Override
9965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public void setFrame(Frame frame) {
10065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        assertPortIsOpen();
10165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        if (mTargetPort == null) {
10265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            throw new RuntimeException(
10365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                "Attempting to set frame on unconnected port: " + this + "!");
10465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
10565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        mTargetPort.setFrame(frame);
10665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
10765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
10865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    @Override
10965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Frame pullFrame() {
11065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        throw new RuntimeException("Cannot pull frame on " + this + "!");
11165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
11265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
11365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    @Override
11465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public boolean hasFrame() {
11565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return mTargetPort == null ? false : mTargetPort.hasFrame();
11665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
11765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
11865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    @Override
11965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public String toString() {
12065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return "output " + super.toString();
12165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
12265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
123