namespace dshow.Core
{
	using System;
	using System.Runtime.InteropServices;

	// IGraphBuilder interface
	//
	// The IGraphBuilder interface allows applications to call upon
	// the filter graph manager to attempt to build a complete filter
	// graph, or parts of a filter graph given only partial information,
	// such as the name of a file or the interfaces of two separate pins
	//
	[ComImport,
	Guid("56A868A9-0AD4-11CE-B03A-0020AF0BA770"),
	InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
	public interface IGraphBuilder
	{
		// --- IFilterGraph Methods

		// Adds a filter to the graph and names it
		// by using the pName parameter
		[PreserveSig]
		int AddFilter(
			[In] IBaseFilter pFilter,
			[In, MarshalAs(UnmanagedType.LPWStr)] string pName);

		// Removes a filter from the graph
		[PreserveSig]
		int RemoveFilter(
			[In] IBaseFilter pFilter);

		// Provides an enumerator for all filters in the graph
		[PreserveSig]
//		int EnumFilters(
//			[Out] out IEnumFilters ppEnum);
		int EnumFilters(
			[Out] out IntPtr ppEnum);

		// Finds a filter that was added
		// to the filter graph with a specific name
		[PreserveSig]
		int FindFilterByName(
			[In, MarshalAs(UnmanagedType.LPWStr)] string pName,
			[Out] out IBaseFilter ppFilter);

		// Connects the two pins directly
		[PreserveSig]
		int ConnectDirect(
			[In] IPin ppinOut,
			[In] IPin ppinIn,
			[In, MarshalAs(UnmanagedType.LPStruct)] AMMediaType	pmt);

		// Disconnects this and the pin to which it connects and
		// then reconnects it to the same pin
		[PreserveSig]
		int Reconnect(
			[In] IPin ppin);

		// Disconnects this pin
		[PreserveSig]
		int Disconnect(
			[In] IPin ppin);

		// Sets the default source of synchronization
		[PreserveSig]
		int SetDefaultSyncSource();

		// --- IGraphBuilder methods

		// Connects the two pins, using intermediates if necessary
		[PreserveSig]
		int Connect(
			[In] IPin ppinOut,
			[In] IPin ppinIn);

		// Builds a filter graph that renders the data from this output pin
		[PreserveSig]
		int Render(
			[In] IPin ppinOut);

		// Builds a filter graph that renders the specified file
		[PreserveSig]
		int RenderFile(
			[In, MarshalAs(UnmanagedType.LPWStr)] string lpcwstrFile,
			[In, MarshalAs(UnmanagedType.LPWStr)] string lpcwstrPlayList);

		// Adds a source filter to the filter graph for a specific file
		[PreserveSig]
		int AddSourceFilter(
			[In, MarshalAs(UnmanagedType.LPWStr)] string lpcwstrFileName,
			[In, MarshalAs(UnmanagedType.LPWStr)] string lpcwstrFilterName,
			[Out] out IBaseFilter ppFilter);

		// Sets the file into which actions taken in attempting
		// to perform an operation are logged
		[PreserveSig]
		int SetLogFile(IntPtr hFile);

		//
		[PreserveSig]
		int Abort();

		//
		[PreserveSig]
		int ShouldOperationContinue();
	}
}
