PROJECT(main)

ADD_SUBDIRECTORY(confio)
ADD_SUBDIRECTORY(htmllexer)
ADD_SUBDIRECTORY(headerparser)
ADD_SUBDIRECTORY(htmldetector)
IF(APPLE)
	ADD_SUBDIRECTORY(osx)
ENDIF(APPLE)

FILE(GLOB error_htmls "${main_SOURCE_DIR}/errors/*.html")

GET_TARGET_PROPERTY(mkskel_exe mkskel LOCATION)

FOREACH(source_path ${error_htmls})
	GET_FILENAME_COMPONENT(source_fname_noext "${source_path}" NAME_WE)
	SET(target_path "${main_BINARY_DIR}/${source_fname_noext}.inc")
	LIST(APPEND error_incs "${target_path}")
	
	ADD_CUSTOM_COMMAND(
		OUTPUT "${target_path}"
		COMMAND "${mkskel_exe}" "${source_path}" "${target_path}"
		DEPENDS mkskel
		MAIN_DEPENDENCY "${source_path}"
	)
ENDFOREACH(source_path)

SET_SOURCE_FILES_PROPERTIES(
	${error_htmls} PROPERTIES
	HEADER_FILE_ONLY TRUE
)

SET_SOURCE_FILES_PROPERTIES(
	${error_incs} PROPERTIES
	GENERATED TRUE
	HEADER_FILE_ONLY TRUE
)

INCLUDE_DIRECTORIES(
	"${main_BINARY_DIR}"
	"${htmllexer_SOURCE_DIR}"
	"${htmllexer_BINARY_DIR}"
	"${htmldetector_SOURCE_DIR}"
	"${htmldetector_BINARY_DIR}"
	"${headerparser_SOURCE_DIR}"
	"${headerparser_BINARY_DIR}"
)

SET(
	cache_sources
	cache/AbstractFileIO.h cache/AbstractFileStorage.h cache/AbstractItem.h
	cache/AbstractResponseHandler.h cache/AbstractResponseReader.h
	cache/AbstractResponseWriter.h cache/RequestResolution.h
	cache/ResponseResolution.h
	cache/FileId.cpp cache/FileId.h
	cache/FileIO.cpp cache/FileIO.h
	cache/FileInstance.cpp cache/FileInstance.h
	cache/FileStorage.cpp cache/FileStorage.h
	cache/LimitedSpaceManager.cpp cache/LimitedSpaceManager.h
	cache/Item.cpp cache/Item.h cache/ObjectStorage.cpp cache/ObjectStorage.h
	cache/MemoryReader.cpp cache/MemoryReader.h
)

SET(
	generic_sources
	AvailableContentFilters.cpp AvailableContentFilters.h
	AvailableFiltersOrdered.cpp AvailableFiltersOrdered.h
	State.cpp State.h GlobalState.h URI.cpp URI.h
	InetAddr.cpp InetAddr.h SymbolicInetAddr.cpp SymbolicInetAddr.h
	Color.cpp Color.h Date.cpp Date.h HttpVersion.cpp HttpVersion.h
	DnsCache.cpp DnsCache.h DnsResolver.cpp DnsResolver.h
	ServerReachability.h ServerReachabilityDB.cpp ServerReachabilityDB.h
	AsyncReaderWriter.cpp AsyncReaderWriter.h
	SocksAsyncConnector.cpp SocksAsyncConnector.h
	SocksError.cpp SocksError.h
	Socks4Requester.cpp Socks4Requester.h
	Socks4AsyncConnector.cpp Socks4AsyncConnector.h
	Socks5Authenticator.cpp Socks5Authenticator.h
	Socks5Requester.cpp Socks5Requester.h
	Socks5AsyncConnector.cpp Socks5AsyncConnector.h
	SocksConnectorListener.h
	HttpRequestLine.cpp HttpRequestLine.h
	HttpStatusLine.cpp HttpStatusLine.h
	HttpMethodRegistry.cpp HttpMethodRegistry.h
	HttpHeader.cpp HttpHeader.h HttpHeaderElement.cpp HttpHeaderElement.h
	HttpHeaderStructure.cpp HttpHeaderStructure.h
	HttpHeadersCollection.cpp HttpHeadersCollection.h
	AcceptEncoding.cpp AcceptEncoding.h ETag.cpp ETag.h TE.cpp TE.h
	RequestCacheControl.cpp RequestCacheControl.h
	ResponseCacheControl.cpp ResponseCacheControl.h
	HttpMessageMetadata.h HttpRequestMetadata.h HttpResponseMetadata.h
	ImmediateResponse.h CraftedResponse.cpp CraftedResponse.h
	ErrorDescriptor.cpp ErrorDescriptor.h
	ErrorCodes.h ErrorFactory.cpp ErrorFactory.h
	ErrorWrapper.cpp ErrorWrapper.h
	ProxyDescriptor.cpp ProxyDescriptor.h
	ConnectionRoute.cpp ConnectionRoute.h
	HttpState.cpp HttpState.h HttpStateError.cpp HttpStateError.h
	HttpStateInactive.cpp HttpStateInactive.h
	HttpStateRequestStart.cpp HttpStateRequestStart.h
	HttpStateResponseStart.cpp HttpStateResponseStart.h
	HttpStateRequestLine.cpp HttpStateRequestLine.h
	HttpStateStatusLine.cpp HttpStateStatusLine.h
	HttpStateHeaders.cpp HttpStateHeaders.h
	HttpStateRequestHeaders.cpp HttpStateRequestHeaders.h
	HttpStateResponseHeaders.cpp HttpStateResponseHeaders.h
	HttpStateSizedFlatBody.cpp HttpStateSizedFlatBody.h
	HttpStateUnsizedFlatBody.cpp HttpStateUnsizedFlatBody.h
	HttpStateChunkHeader.cpp HttpStateChunkHeader.h
	HttpStateChunkBody.cpp HttpStateChunkBody.h
	HttpStateFooters.cpp HttpStateFooters.h
	HttpParserBase.cpp HttpParserBase.h
	HttpRequestParser.cpp HttpRequestParser.h
	HttpResponseParser.cpp HttpResponseParser.h
	HttpMessageShaper.cpp HttpMessageShaper.h
	HttpStreamWriter.cpp HttpStreamWriter.h
	AdSuspect.h AdSuspect.cpp AdSuspectList.cpp AdSuspectList.h
	ImageAdSuspect.cpp ImageAdSuspect.h IframeAdSuspect.cpp IframeAdSuspect.h
	FlashAdSuspect.cpp FlashAdSuspect.h WebbugAdSuspect.cpp WebbugAdSuspect.h
	HeuristicScore.cpp HeuristicScore.h
	ImageHeuristicScore.cpp ImageHeuristicScore.h
	IframeHeuristicScore.cpp IframeHeuristicScore.h
	FlashHeuristicScore.cpp FlashHeuristicScore.h
	WebbugHeuristicScore.cpp WebbugHeuristicScore.h
	ReplacementImage.cpp ReplacementImage.h
	ReplacementFlash.cpp ReplacementFlash.h
	ReplacementHtml.cpp ReplacementHtml.h
	ReplacementJs.cpp ReplacementJs.h
	AbstractContentIdentifier.cpp AbstractContentIdentifier.h
	GifContentIdentifier.cpp GifContentIdentifier.h
	JpegContentIdentifier.cpp JpegContentIdentifier.h
	PngContentIdentifier.cpp PngContentIdentifier.h
	FlashContentIdentifier.cpp FlashContentIdentifier.h
	AbstractImageInspector.h FlashInspector.cpp FlashInspector.h
	GifImageInspector.cpp GifImageInspector.h
	JpegImageInspector.cpp JpegImageInspector.h
	PngImageInspector.cpp PngImageInspector.h
	AbstractCompressor.h AbstractDecompressor.h
	GzipCompressor.cpp GzipCompressor.h
	GzipDecompressor.cpp GzipDecompressor.h
	DeflateCompressor.cpp DeflateCompressor.h
	DeflateDecompressor.cpp DeflateDecompressor.h
	HtmlEscaper.cpp HtmlEscaper.h HtmlNode.cpp HtmlNode.h
	HtmlNodeWithAttributes.cpp HtmlNodeWithAttributes.h
	HtmlNodeWithoutAttributes.cpp HtmlNodeWithoutAttributes.h
	HtmlNodeWithContent.cpp HtmlNodeWithContent.h
	HtmlNodeWithoutContent.cpp HtmlNodeWithoutContent.h
	HtmlNodeWithChildren.cpp HtmlNodeWithChildren.h
	HtmlNodeWithoutChildren.cpp HtmlNodeWithoutChildren.h
	HtmlElementNode.cpp HtmlElementNode.h
	HtmlFragmentNode.cpp HtmlFragmentNode.h
	HtmlTextNode.cpp HtmlTextNode.h HtmlProcessor.cpp HtmlProcessor.h
	JsEnvProxy.cpp JsEnvProxy.h JsInliner.cpp JsInliner.h
	AbstractResponseFilter.h AbstractResponseHandler.h
	LoggingResponseHandler.cpp LoggingResponseHandler.h
	ResponseFilterBase.cpp ResponseFilterBase.h
	FilterGlobalFlags.cpp FilterGlobalFlags.h
	FilterGroupFlags.cpp FilterGroupFlags.h
	ResponseFilterChain.cpp ResponseFilterChain.h
	AnalyzeResponseFilter.cpp AnalyzeResponseFilter.h
	CompressorResponseFilter.cpp CompressorResponseFilter.h
	DecompressorResponseFilter.cpp DecompressorResponseFilter.h
	ImageResponseFilter.cpp ImageResponseFilter.h
	FlashResponseFilter.cpp FlashResponseFilter.h
	HtmlResponseFilter.cpp HtmlResponseFilter.h
	RegexResponseFilter.cpp RegexResponseFilter.h
	DownloadSizeLimiter.cpp DownloadSizeLimiter.h
	TextContentValidator.cpp TextContentValidator.h
	HtmlContentValidator.cpp HtmlContentValidator.h
	FilterTryList.cpp FilterTryList.h
	Timer.cpp Timer.h AbstractDataConsumer.h
	AsyncConnectorError.cpp AsyncConnectorError.h
	AsyncConnector.cpp AsyncConnector.h AsyncConnectorListener.h
	ChainAsyncConnector.cpp ChainAsyncConnector.h ChainConnectorListener.h
	ServerConnection.cpp ServerConnection.h
	RequestLog.cpp RequestLog.h
	RequestTag.h RequestPtr.h ServerTimeouts.h AbstractRequestLogHandler.h
	DownloadProgress.h RequestStatus.h AbstractRequestHandler.h
	Client.cpp Client.h Server.cpp Server.h AbstractServer.h
	FilteringServer.cpp FilteringServer.h
	CachingServer.cpp CachingServer.h
	HttpFetcher.cpp HttpFetcher.h
	SubstitutionRequestParser.cpp SubstitutionRequestParser.h
	ServiceContext.cpp ServiceContext.h
	ServerConnectionPool.cpp ServerConnectionPool.h
	ConnAcceptor.cpp ConnAcceptor.h
	WorkerThreadPool.cpp WorkerThreadPool.h
	WorkerThreadPoolEx.cpp WorkerThreadPoolEx.h
	WorkerThreadPoolExSingleton.cpp WorkerThreadPoolExSingleton.h
	AbstractCommand.h AbstractNetworkActivityHandler.h
	InterthreadCommandQueue.cpp InterthreadCommandQueue.h
	NetworkActivityReporter.cpp NetworkActivityReporter.h
	FilterJsLogger.cpp FilterJsLogger.h AbstractFilterJsLogHandler.h
	FileVersion.h Debug.cpp Debug.h
)

SOURCE_GROUP("Generic Sources" FILES ${generic_sources})
SOURCE_GROUP("Cache Sources" FILES ${cache_sources})
SOURCE_GROUP("Error Templates" FILES ${error_htmls}) 
SOURCE_GROUP("Generated Sources" FILES ${error_incs})

ADD_LIBRARY(
	main STATIC
	${generic_sources} ${cache_sources} ${error_incs}
)

ADD_DEPENDENCIES(main confio htmllexer htmldetector headerparser)
IF(APPLE)
	ADD_DEPENDENCIES(main osx)
ENDIF(APPLE)

IF(UNIX)
	ADD_SUBDIRECTORY(daemon)
ENDIF(UNIX)
ADD_SUBDIRECTORY(gui)
