package cronet

// #include <stdlib.h>
// #include <stdbool.h>
// #include <cronet_c.h>
import "C"

// URLRequestStatusListener listener class used with URLRequest.GetStatus() to receive the status of a
// URLRequest.
type URLRequestStatusListener struct {
	ptr C.Cronet_UrlRequestStatusListenerPtr
}

// URLRequestStatusListenerOnStatusFunc invoked on UrlRequest's Executor when request status is obtained.
// |status| is representing the status of the request.
type URLRequestStatusListenerOnStatusFunc func(self URLRequestStatusListener, status URLRequestStatusListenerStatus)

type URLRequestStatusListenerStatus int

const (

	// URLRequestStatusListenerStatusInvalid
	// This state indicates that the request is completed, canceled, or is not
	// started.
	URLRequestStatusListenerStatusInvalid URLRequestStatusListenerStatus = -1

	// URLRequestStatusListenerStatusIdle
	// This state corresponds to a resource load that has either not yet begun
	// or is idle waiting for the consumer to do something to move things along
	// (e.g. when the consumer of a URLRequest has not called
	// URLRequest.read() yet).
	URLRequestStatusListenerStatusIdle URLRequestStatusListenerStatus = 0

	// URLRequestStatusListenerStatusWaitingForStalledSocketPool
	// When a socket pool group is below the maximum number of sockets allowed
	// per group, but a new socket cannot be created due to the per-pool socket
	// limit, this state is returned by all requests for the group waiting on an
	// idle connection, except those that may be serviced by a pending new
	// connection.
	URLRequestStatusListenerStatusWaitingForStalledSocketPool URLRequestStatusListenerStatus = 1

	// URLRequestStatusListenerStatusWaitingForAvailableSocket
	// When a socket pool group has reached the maximum number of sockets
	// allowed per group, this state is returned for all requests that don't
	// have a socket, except those that correspond to a pending new connection.
	URLRequestStatusListenerStatusWaitingForAvailableSocket URLRequestStatusListenerStatus = 2

	// URLRequestStatusListenerStatusWaitingForDelegate
	// This state indicates that the URLRequest delegate has chosen to block
	// this request before it was sent over the network.
	URLRequestStatusListenerStatusWaitingForDelegate URLRequestStatusListenerStatus = 3

	// URLRequestStatusListenerStatusWaitingForCache
	// This state corresponds to a resource load that is blocked waiting for
	// access to a resource in the cache. If multiple requests are made for the
	// same resource, the first request will be responsible for writing (or
	// updating) the cache entry and the second request will be deferred until
	// the first completes. This may be done to optimize for cache reuse.
	URLRequestStatusListenerStatusWaitingForCache URLRequestStatusListenerStatus = 4

	// URLRequestStatusListenerStatusDownloadingPacFile
	// This state corresponds to a resource being blocked waiting for the
	// PAC script to be downloaded.
	URLRequestStatusListenerStatusDownloadingPacFile URLRequestStatusListenerStatus = 5

	// URLRequestStatusListenerStatusResolvingProxyForUrl
	// This state corresponds to a resource load that is blocked waiting for a
	// proxy autoconfig script to return a proxy server to use.
	URLRequestStatusListenerStatusResolvingProxyForUrl URLRequestStatusListenerStatus = 6

	// URLRequestStatusListenerStatusResolvingHostInPacFile
	// This state corresponds to a resource load that is blocked waiting for a
	// proxy autoconfig script to return a proxy server to use, but that proxy
	// script is busy resolving the IP address of a host.
	URLRequestStatusListenerStatusResolvingHostInPacFile URLRequestStatusListenerStatus = 7

	// URLRequestStatusListenerStatusEstablishingProxyTunnel
	// This state indicates that we're in the process of establishing a tunnel
	// through the proxy server.
	URLRequestStatusListenerStatusEstablishingProxyTunnel URLRequestStatusListenerStatus = 8

	// URLRequestStatusListenerStatusResolvingHost
	// This state corresponds to a resource load that is blocked waiting for a
	// host name to be resolved. This could either indicate resolution of the
	// origin server corresponding to the resource or to the host name of a
	// proxy server used to fetch the resource.
	URLRequestStatusListenerStatusResolvingHost URLRequestStatusListenerStatus = 9

	// URLRequestStatusListenerStatusConnecting
	// This state corresponds to a resource load that is blocked waiting for a
	// TCP connection (or other network connection) to be established. HTTP
	// requests that reuse a keep-alive connection skip this state.
	URLRequestStatusListenerStatusConnecting URLRequestStatusListenerStatus = 10

	// URLRequestStatusListenerStatusSslHandshake
	// This state corresponds to a resource load that is blocked waiting for the
	// SSL handshake to complete.
	URLRequestStatusListenerStatusSslHandshake URLRequestStatusListenerStatus = 11

	// URLRequestStatusListenerStatusSendingRequest
	// This state corresponds to a resource load that is blocked waiting to
	// completely upload a request to a server. In the case of a HTTP POST
	// request, this state includes the period of time during which the message
	// body is being uploaded.
	URLRequestStatusListenerStatusSendingRequest URLRequestStatusListenerStatus = 12

	// URLRequestStatusListenerStatusWaitingForResponse
	// This state corresponds to a resource load that is blocked waiting for the
	// response to a network request. In the case of a HTTP transaction, this
	// corresponds to the period after the request is sent and before all of the
	// response headers have been received.
	URLRequestStatusListenerStatusWaitingForResponse URLRequestStatusListenerStatus = 13

	// URLRequestStatusListenerStatusReadingResponse
	// This state corresponds to a resource load that is blocked waiting for a
	// read to complete. In the case of a HTTP transaction, this corresponds to
	// the period after the response headers have been received and before all
	// of the response body has been downloaded. (NOTE: This state only applies
	// for an URLRequest while there is an outstanding
	// URLRequest.Read() operation.)
	URLRequestStatusListenerStatusReadingResponse URLRequestStatusListenerStatus = 14
)
