// Copyright (c) 2010 The WebM project authors. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license and patent
// grant that can be found in the LICENSE file in the root of the source
// tree. All contributing project authors may be found in the AUTHORS
// file in the root of the source tree.

#pragma once
#include "cmediatypes.hpp"
#include "graphutil.hpp"
#include <string>

namespace WebmSplit
{

class Filter;

class Pin : public IPin
{
    Pin& operator=(const Pin&);
    
protected:
    Pin(Filter*, PIN_DIRECTION, const wchar_t*);
    virtual ~Pin();
    
public:    
    Filter* const m_pFilter;
    const PIN_DIRECTION m_dir;
    const std::wstring m_id;    
    CMediaTypes m_preferred_mtv;
    CMediaTypes m_connection_mtv;  //only one of these
    GraphUtil::IPinPtr m_pPinConnection;
    
    //IUnknown interface:
    
    //IPin interface:

    //HRESULT STDMETHODCALLTYPE Connect( 
    //    IPin *pReceivePin,
    //    const AM_MEDIA_TYPE *pmt);

    //HRESULT STDMETHODCALLTYPE ReceiveConnection( 
    //    IPin*,
    //    const AM_MEDIA_TYPE*);
    
    HRESULT STDMETHODCALLTYPE Disconnect();
    
    HRESULT STDMETHODCALLTYPE ConnectedTo( 
        IPin **pPin);
    
    HRESULT STDMETHODCALLTYPE ConnectionMediaType( 
        AM_MEDIA_TYPE*);
    
    HRESULT STDMETHODCALLTYPE QueryPinInfo( 
        PIN_INFO*);
    
    HRESULT STDMETHODCALLTYPE QueryDirection( 
        PIN_DIRECTION*);
    
    HRESULT STDMETHODCALLTYPE QueryId( 
        LPWSTR*);
    
    //HRESULT STDMETHODCALLTYPE QueryAccept( 
    //    const AM_MEDIA_TYPE*);
    
    HRESULT STDMETHODCALLTYPE EnumMediaTypes( 
        IEnumMediaTypes**);
    
    //HRESULT STDMETHODCALLTYPE QueryInternalConnections( 
    //    IPin**,
    //    ULONG*);
    
    //HRESULT STDMETHODCALLTYPE EndOfStream();
    //    
    //HRESULT STDMETHODCALLTYPE BeginFlush();
    //
    //HRESULT STDMETHODCALLTYPE EndFlush();
    //
    //HRESULT STDMETHODCALLTYPE NewSegment( 
    //    REFERENCE_TIME tStart,
    //    REFERENCE_TIME tStop,
    //    double dRate);
    
protected:
    virtual HRESULT GetName(PIN_INFO&) const = 0;
    virtual HRESULT OnDisconnect();
    
};

}  //end namespace WebmSplit
