summaryrefslogtreecommitdiff
path: root/content/content.h
blob: ff0dbc6ddabd64d7c127befab61f12444b48fbdc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/**
 * $Id: content.h,v 1.5 2003/04/06 18:09:34 bursa Exp $
 */

#ifndef _NETSURF_DESKTOP_CONTENT_H_
#define _NETSURF_DESKTOP_CONTENT_H_

#include "libxml/HTMLparser.h"
#include "netsurf/content/cache.h"
#include "netsurf/css/css.h"
#include "netsurf/render/box.h"
#include "netsurf/riscos/font.h"


/**
 * A struct content corresponds to a single url.
 *
 * It is in one of the following states:
 *   CONTENT_FETCHING - the data is being fetched and/or converted
 *                      for use by the browser
 *   CONTENT_READY - the content has been processed and is ready
 *                      to display
 *
 * The converted data is stored in the cache, not the source data.
 * Users of the structure are counted in use_count; when use_count = 0
 * the content may be removed from the memory cache.
 */

typedef enum {CONTENT_HTML, CONTENT_TEXTPLAIN, CONTENT_JPEG, CONTENT_CSS,
	CONTENT_PNG, CONTENT_OTHER} content_type;

struct box_position
{
  struct box* box;
  int actual_box_x;
  int actual_box_y;
  int plot_index;
  int pixel_offset;
  int char_offset;
};

struct content
{
  char *url;
  content_type type;
  enum {CONTENT_LOADING, CONTENT_READY} status;
  unsigned long width, height;

  union
  {
    struct
    {
      htmlParserCtxt* parser;
      xmlDoc* document;
      xmlNode* markup;
      struct box* layout;
      unsigned int stylesheet_count;
      char **stylesheet_url;
      struct content **stylesheet_content;
      struct css_style* style;
      struct {
        struct box_position start;
        struct box_position end;
        enum {alter_UNKNOWN, alter_START, alter_END} altering;
        int selected; /* 0 = unselected, 1 = selected */
      } text_selection;
      struct font_set* fonts;
      struct page_elements elements;
    } html;

    struct
    {
      struct css_stylesheet *css;
      unsigned int import_count;
      struct content **import_content;
    } css;

    struct
    {
      char * data;
      unsigned long length;
    } jpeg;

  } data;

  struct cache_entry *cache;
  unsigned long size;
  char *title;
  unsigned int active;
  int error;
  void (*status_callback)(void *p, const char *status);
  void *status_p;
};


content_type content_lookup(const char *mime_type);
struct content * content_create(content_type type, char *url);
void content_process_data(struct content *c, char *data, unsigned long size);
int content_convert(struct content *c, unsigned long width, unsigned long height);
void content_revive(struct content *c, unsigned long width, unsigned long height);
void content_reformat(struct content *c, unsigned long width, unsigned long height);
void content_destroy(struct content *c);

#endif