uIP 1.0
webclient.h
/**
 * \addtogroup webclient
 * @{
 */

/**
 * \file
 * Header file for the HTTP client.
 * \author Adam Dunkels <adam@dunkels.com>
 */

/*
 * Copyright (c) 2002, Adam Dunkels.
 * Все права зарезервированы.
 *
 * Повторное распространение, использование в исходном и двоичном виде,
 * с модификацией или без - разрешается, если выполняются следующие
 * условия:
 * 1. Распространение исходного кода должно сохранить вышеуказанную пометку
 *    копирайта, этот список условий и следующую правовую оговорку.
 * 2. Распространение исходного кода должно сохранить вышеуказанную пометку
 *    копирайта, этот список условий и следующую правовую оговорку в
 *    документации и/или других материалах, которые будут предоставлены
 *    вместе с распространяемыми материалами.
 * 3. Имя автора не может использоваться, чтобы подтвердить или продвинуть
 *    продукты, написанные с использованием этого программного обеспечения
 *    без специального на то разрешения.
 *
 * ЭТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ АВТОРОМ ``КАК ЕСТЬ'', БЕЗ
 * КАКОЙ-ЛИБО ЛЮБОЙ РАСШИРЕННОЙ ИЛИ ПОДРАЗУМЕВАЕМОЙ ГАРАНТИИ, ВКЛЮЧАЯ,
 * НО НЕ ОГРАНИЧИВАЯСЬ ЭТИМ, ГАРАНТИИ ВЫСОКОГО СПРОСА И ПРИГОДНОСТИ
 * ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. АВТОР НИ ПРИ КАКИХ УСЛОВИЯХ НЕ ОТВЕТСТВЕНЕН
 * ЗА ЛЮБЫЕ УБЫТКИ - ПРЯМЫЕ, КОСВЕННЫЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ, ОБРАЗЦОВЫЕ
 * ИЛИ ПОСЛЕДОВАТЕЛЬНЫЕ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ЭТИМ, ТРЕБОВАНИЯ
 * ЗАМЕНЫ ТОВАРА ИЛИ СЕРВИСА; ПОТЕРИ ИСПОЛЬЗОВАНИЯ, ДАННЫХ ИЛИ ВЫГОДЫ;
 * ИЛИ ПРЕКРАЩЕНИЕ БИЗНЕСА), ОДНАКО ВЫЗВАННЫЕ ПО ЛЮБОЙ ТЕОРИИ ОТВЕТСТВЕННОСТИ,
 * ЛИБО В КОНТРАКТЕ, ПРЯМОЙ ОТВЕТСТВЕННОСТИ, ЛИБО В НАРУШЕНИИ ЗАКОННЫХ ПРАВ
 * (ВКЛЮЧАЯ ТАК ИЛИ ИНАЧЕ НЕБРЕЖНОСТЬ), ВОЗНИКАЮЩИЕ ВСЕГДА ИЗ ИСПОЛЬЗОВАНИЯ
 * ЭТОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, ДАЖЕ ЕСЛИ БЫЛО ПРЕДУПРЕЖДЕНИЕ О ВОЗМОЖНОСТИ
 * ТАКОГО ПОВРЕЖДЕНИЯ.
 *
 * Этот файл является частью стека uIP TCP/IP..
 *
 * $Id: webclient.h,v 1.2 2006/06/11 21:46:37 adam Exp $
 *
 */
#ifndef __WEBCLIENT_H__
#define __WEBCLIENT_H__


#include "webclient-strings.h"
#include "uipopt.h"

#define WEBCLIENT_CONF_MAX_URLLEN 100

struct webclient_state {
  u8_t timer;
  u8_t state;
  u8_t httpflag;

  u16_t port;
  char host[40];
  char file[WEBCLIENT_CONF_MAX_URLLEN];
  u16_t getrequestptr;
  u16_t getrequestleft;
  
  char httpheaderline[200];
  u16_t httpheaderlineptr;

  char mimetype[32];
};

typedef struct webclient_state uip_tcp_appstate_t;
#define UIP_APPCALL webclient_appcall

/**
 * Функция обратного вызова (callback), которая будет вызвана
 * из кода web-клиента, когда приняты данные HTTP.
 *
 * Эта функция должна быть реализована в модуле, который использует
 * код web-клиента. Функция вызывается из модуля web-клиента, когда
 * приняты данные HTTP. Функция не вызывается, когда приняты
 * заголовки HTTP, её вызов делается только для актуальных данных.
 *
 * \note Эта функция будет вызвана много раз с повторениями, когда
 * приняты данные, и не один раз, когда были получены все данные.
 *
 * \param data Указатель на данные, которые были приняты.
 * \param len Длина принятых данных.
 */
void webclient_datahandler(char *data, u16_t len);

/**
 * Функция обратного вызова (callback), которая вызывается из кода
 * web-клиента, когда с web-сервером установлено HTTP-соединение.
 *
 * Эта функция должна быть реализована в модуле, который использует
 * код web-клиента.
 */
void webclient_connected(void);

/**
 * Функция обратного вызова (callback), которая вызывается из кода
 * web-клиента, если истек таймаут HTTP-соединения с web-сервером.
 *
 * Эта функция должна быть реализована в модуле, который использует
 * код web-клиента.
 */
void webclient_timedout(void);

/**
 * Функция обратного вызова (callback), которая вызывается из кода
 * web-клиента, если HTTP-соединение с web-сервером было оборвано
 * (aborted) на стороне web-сервера.
 *
 * Эта функция должна быть реализована в модуле, который использует
 * код web-клиента.
 */
void webclient_aborted(void);

/**
 * Функция обратного вызова (callback), которая вызывается из кода
 * web-клиента, если HTTP-соединение с web-сервером было закрыто.
 *
 * Эта функция должна быть реализована в модуле, который использует
 * код web-клиента.
 */
void webclient_closed(void);



/**
 * Инициализирует модуль web-клиента.
 */
void webclient_init(void);

/**
 * Открывает соединение HTTP с web-сервером и запрашивает файл с
 * использованием метода GET.
 *
 * Эта функция открывает соединение HTTP к указанному web-серверу
 * и запрашивает указанный файл с использованием метода GET. Когда
 * соединение HTTP установлено, будет вызвана функция обратного
 * вызова webclient_connected(), и когда данные поступят, будет
 * вызвана функция обратного вызова webclient_datahandler().
 *
 * Функция обратного вызова webclient_timedout() будет вызвана, если
 * web-сервер не отвечает, и функция обратного вызова webclient_aborted(),
 * если соединение HTTP было оборвано (aborted) со стороны web-сервера.
 *
 * Когда запрос HTTP был завершен и соединение HTTP закрыто, будет
 * вызвана функция обратного вызова webclient_closed().
 *
 * \note Если функции передано имя хоста, оно уже должно быть в кеше
 * резолвера имен для того, чтобы функция могла подключиться к
 * web-серверу. Поэтому на вызывающий модуль ложится ответственность
 * на реализацию вызовов резолвера и сигнального обработчика, используемого
 * для сообщения об ответе на запрос резолвера.
 *
 * \param host Указатель на строку, содержащую либо имя хоста, либо
 * цифровой адрес IP в форме строки с точками (напримера 192.168.23.1).
 *
 * \param port Номер порта, к которому будет произведено соединение,
 * с порядком следования байт хоста.
 *
 * \param file Указатель на имя файла, получаемого по протоколу HTTP.
 *
 * \retval 0 если имя хоста не было найдено в кэше, или если не может
 * быть установлено соединение TCP.
 *
 * \retval 1 если было инициировано соединение.
 */
unsigned char webclient_get(char *host, u16_t port, char *file);

/**
 * Закрывает открытое в настоящий момент соединение HTTP.
 */
void webclient_close(void);
void webclient_appcall(void);

/**
 * Получает тип MIME текущего потока данных HTTP.
 *
 * \return Указатель на строку, содержащую тип MIME. Строка может
 * быть пустой, если web-сервером не было сообщено от типе MIME.
 */
char *webclient_mimetype(void);

/**
 * Получает имя файла текущего потока данных HTTP.
 *
 * Имя файла запроса HTTP может быть изменено web-сервером, и таким
 * образом оно может быть не то же самое, что и имя, которое было 
 * указано в оригинальном запросе GET при вызове webclient_get().
 * Эта функция используется для получения текущего имени файла.
 *
 * \return Указатель на текущее имя файла.
 */
char *webclient_filename(void);

/**
 * Получение имени хоста текущего потока данных HTTP.
 *
 * Имя хоста запроса HTTP может быть изменено web-сервером, и таким
 * образом оно может быть не то же самое, что и имя, которое было 
 * указано в оригинальном запросе GET при вызове webclient_get().
 * Эта функция используется для получения текущего имени хоста.
 *
 * \return Указатель на текущее имя хоста.
 */
char *webclient_hostname(void);

/**
 * Получение номера порта текущего потока данных HTTP.
 *
 * Номер порта запроса HTTP может быть изменен web-сервером, и таким
 * образом он может быть не тот же самый, что и порт, который был 
 * указан в оригинальном запросе GET при вызове webclient_get().
 * Эта функция используется для получения текущего номера порта.
 *
 * \return Номер порта текущего потока данных HTTP, с порядком
 * следования байт хоста.
 */
unsigned short webclient_port(void);



#endif /* __WEBCLIENT_H__ */

/** @} */