Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

680 lines
22 KiB

/*
Enhanced NCSA Mosaic from Spyglass
"Guitar"
Copyright 1994 Spyglass, Inc.
All Rights Reserved
Author(s):
Jim Seidman [email protected]
*/
#ifndef _TW_H_
#define _TW_H_
#include "pool.h"
#define ELE_NOT 0
#define ELE_TEXT 1
#define ELE_IMAGE 2
#define ELE_VERTICALTAB 3
#define ELE_HR 4
#define ELE_NEWLINE 5
#define ELE_BEGINLIST 6
#define ELE_ENDLIST 7
#define ELE_LISTITEM 8
#define ELE_EDIT 9
#define ELE_PASSWORD 10
#define ELE_CHECKBOX 11
#define ELE_RADIO 12
#define ELE_SUBMIT 13
#define ELE_RESET 14
#define ELE_COMBO 15
#define ELE_LIST 16
#define ELE_TEXTAREA 17
#define ELE_INDENT 18
#define ELE_OUTDENT 19
#define ELE_BEGINFORM 20
#define ELE_ENDFORM 21
#define ELE_MULTILIST 22
#define ELE_HIDDEN 23
#define ELE_TAB 24
#define ELE_OPENLISTITEM 25
#define ELE_CLOSELISTITEM 26
#define ELE_FORMIMAGE 27
#define ELE_BULLET 28
#define ELE_BEGINCENTER 29
#define ELE_ENDCENTER 30
#define ELE_BRCLEARLEFT 31
#define ELE_BRCLEARRIGHT 32
#define ELE_BRCLEARALL 33
#ifdef FEATURE_TABLES
#define ELE_BEGINTABLE 34
#define ELE_ENDTABLE 35
#define ELE_BEGINCELL 36
#define ELE_ENDCELL 37
#define ELE_VOID 38
#endif /* FEATURE_TABLES */
#define ELE_BEGINRIGHT 39
#define ELE_ENDRIGHT 40
#define ELE_ENDDOC -1 /* Flags end-of-document */
#define ALIGN_UNSPECIFIED ((unsigned char)0xff)
#define ALIGN_BASELINE 0
#define ALIGN_TOP 1
#define ALIGN_MIDDLE 2
#define ALIGN_BOTTOM 3
#define ALIGN_LEFT 4
#define ALIGN_RIGHT 5
#define DOCK_LEFT 6
#define DOCK_TOP 7
#define DOCK_RIGHT 8
#define DOCK_BOTTOM 9
#define ALIGN_JUSTIFY 10
#define ALIGN_CENTER 11
#define CLEAR_LEFT 0x01
#define CLEAR_RIGHT 0x02
#ifndef MAC
#define FIRST_CONTROL_ID 0x2000
#endif
#ifdef FEATURE_TABLES
struct _table_element_data
{
int tabledata_index; /* index into text->w3doc->tabledatavector[] */
int endtable_element; /* element index of ELE_ENDTABLE */
int begincaption_element; /* element index of ELE_BEGINCELL for optional caption */
};
struct _end_table_element_data
{
int begintable_element; /* element index for ELE_BEGINTABLE */
};
struct _cell_element_data
{
int endcell_element; /* element index of ELE_ENDCELL */
int begintable_element; /* element index of ELE_BEGINTABLE */
int y_bound;
short kx0, kx1; /* indexes into [XY]CellCoords */
short ky0, ky1; /* for bounding box of cell. */
unsigned char align; /* ALIGN_ value for current row */
unsigned char valign; /* ALIGN_ value for current row */
unsigned char prev_fontBits;
};
struct _cellvector
{
int size; /* number of cells allocated */
int next; /* next free cell */
int * aVector; /* the vector of cells */
};
enum TableFormatState
{
TFS_UNKNOWN=0,
TFS_COMPUTE_WIDTHS_1=1,
TFS_COMPUTE_HEIGHTS=2,
TFS_SHIFT_XY=3,
TFS_DONE=4,
TFS_PARTIAL=5,
TFS_COMPUTE_WIDTHS_2=6
};
struct _tabledata
{
struct _cellvector XCellCoords; /* x-coords of columns -- used during reformat */
struct _cellvector YCellCoords; /* y-coords of rows -- used during reformat */
struct _cellvector x_smallest_max; /* minimum x requirements -- used during reformat */
struct _cellvector x_widest_max; /* maximum x requirements -- used during reformat */
struct _cellvector y_smallest_max; /* minimum y requirements -- used during reformat */
int total_x; /* nr columns + 1 -- used during reformat */
int total_y; /* nr rows + 1 -- used during reformat */
int constraint_x; /* current horiz constraint -- used during reformat */
int new_origin_x; /* working x origin -- used during reformat */
int new_origin_y; /* working y origin -- used during reformat */
enum TableFormatState tfs; /* used during reformat */
#ifdef FEATURE_TABLE_WIDTH
int given_table_width; /* width requested in html document on whole table */
struct _cellvector x_given_widths; /* widths requested in html document on individual columns */
struct _cellvector x_constraints; /* width constraints -- used during reformat */
#endif /* FEATURE_TABLE_WIDTH */
struct _cellvector row_spans; /* used during parse to record spans from previous rows */
int current_x; /* used during parse */
int current_y; /* used during parse */
int end_of_row_status; /* used during parse */
unsigned char align; /* ALIGN_ value for current row */
unsigned char valign; /* VALIGN_ value for current row */
unsigned char borderstyle; /* BORDERSTYLE */
unsigned char w1_tick_mark;
unsigned char w2_tick_mark;
};
#define EOR_STATUS_NONE_SEEN 0
#define EOR_STATUS_IMPLICIT 1
#define EOR_STATUS_DEFAULT 2
#define BORDERSTYLE_NONEMPTY 0
#define BORDERSTYLE_ALL 1
#define BORDERSTYLE_NONE 2
#define BORDERSTYLE_FRAME 3
struct _tabledatavector
{
int size;
int next;
struct _tabledata * aVector;
};
#endif /* FEATURE_TABLES */
/*
* These will be used with the form flags in the hash table
* one defines if this is selected by default and the other
* defines if this is currently selected
* Scott Piette (11/6/95)
*/
#define ELE_FORM_DEFAULT_SELECT 0x0001
#define ELE_FORM_CURRENT_SELECT 0x0002
struct _form_element
{
signed long iNextFormEl;
signed long iBeginForm;
struct hash_table* pHashValues;
BOOL bChecked;
#ifdef WIN32
HWND hWndControl;
BOOL bWantReturn;
#endif
#ifdef MAC
union
{
/* for ELE_CHECKBOX, ELE_RADIO, ELE_SUBMIT, ELE_RESET */
ControlHandle hControl;
/* for ELE_EDIT, ELE_PASSWORD, ELE_TEXTAREA */
struct
{
TEHandle hEdit;
int nMaxChars;
BOOL bSingleLine;
short nFirstVisLine;
}
edit;
/* for ELE_LIST, ELE_MULTILIST */
ListHandle hList;
/* for ELE_COMBO */
struct
{
MenuHandle hMenu;
int nIndex;
}
menu;
}
u;
#endif
#ifdef UNIX
RECT fWnd; /* Location and size of control */
Widget fWidget; /* Top level widget id */
Widget menu; /* Option menu widget id ELE_COMBO */
Widget textArea; /* Text widget id ELE_TEXTAREA */
Widget menuHistory; /* widget id of selected option ELE_COMBO */
BOOL bState; /* Widget state for use with radio/toggle btns */
BOOL bWantReturn;
BOOL bPositioned; /* Is widget sized and positioned */
BOOL bVisible; /* Is widget currently visible */
char *menuText; /* Selected menu text for COMBO */
char *password; /* contains constructed masked password */
char *radioGroup; /* name of group for radio */
char *name; /* Name of widget */
char *value; /* Value of widget */
int len; /* Max Length of list */
int nRows, nCols; /* Row and Col specifics */
signed long iFormEl; /* Current element index */
signed long iPrevFormEl; /* Previous element index */
#endif
};
#define FONTBIT_REGULAR 0x00
#define FONTBIT_BOLD 0x01
#define FONTBIT_ITALIC 0x02
#define FONTBIT_UNDERLINE 0x04
#define FONTBIT_MONOSPACE 0x08
#define FONTBIT_STRIKEOUT 0x10
#define FONTBIT_HEADER 0x20
struct GTR_Font_Request
{
unsigned char logical_font_size;
unsigned char flags;
};
/*
This struct is used within a union in the _element struct
below. See comment there.
*/
struct _img_element_data
{
/*
The following three provide formatting control over IMG elements,
as specified by the BORDER, HSPACE, and VSPACE attributes.
*/
unsigned short hspace;
unsigned short vspace;
struct ImageInfo *myImage; /* Only used for imgs */
struct MapInfo *myMap; /* Only used for imgs */
/*
The following height and width dimensions are the ones
used for drawing. The height and width in the image itself
are the actual dimensions of the image.
*/
unsigned short height;
unsigned short width;
};
/*
This struct is used within a union in the _element struct
below. See comment there.
*/
struct _hr_element_data
{
/*
* NOTE: These arguments are used to support width and height
* settings for Horizontal rules, and possibly also text alignments
* VSIZE is the vertical size for the rule
* HSIZE is the width of the rule.
* If ELEFLAG_WIDTH_PIXELS is set then this is the pixel width
* If ELEFLAG_WIDTH_PERCENT is set then this is a percentage amount
* that should be used with the document width for the actual width
*/
unsigned short hsize;
unsigned short vsize;
};
/*
This struct is used within a union in the _element struct
below. See comment there.
*/
struct _text_element_data
{
/* the following specified by by FONT tag */
COLORREF myColor; /* valid only if lFlags & ELEFLAG_FONT_COLOR */
struct GTR_Font_Request font_request;
signed short cached_font_index;
};
struct _element
{
/*
This struct has been arranged intentionally in the
hope that the compiler will pack the struct to make
efficient use of memory.
*/
RECT r; /* The formatter sets this, and it's in document space, not screen space */
int baseline; /* Only valid if alignment == ALIGN_BASELINE */
/*
There are three things here which are references into the pool, each of which
consists of an offset and a len.
textLen
textOffset
These contain the text for the element. When the element is ELE_TEXT,
this is simply the text of that element. It is also used for the
values and default text for form controls.
nameLen
nameOffset
For form controls, this contains the name to be used for submission of
the name value pair. For other elements, when the element is within an
anchor, this contains the name of the anchor.
hrefLen
hrefOffset
This is the HREF for anchors (including image maps),
and the address for FORM tags.
*/
unsigned char type; /* Must be one of the ELE_* at the top of this file */
unsigned char iStyle;
unsigned char iBlankLines; /* ONLY USED FOR ELE_VERTICALTAB -- could be moved to the union */
unsigned char iBorder; /* Specifies the border width around images. This is also currently used
as a BOOL to specify whether a table cell has a border. */
unsigned long textOffset;
unsigned long hrefOffset; /* Only used when the element is within an anchor */
unsigned short textLen;
unsigned short hrefLen; /* Only used when the element is within an anchor */
unsigned long nameOffset;
unsigned long lFlags;
unsigned short nameLen;
unsigned char iFormMethod; /* Only used for ELE_BEGINFORM */
unsigned char alignment;
struct _form_element *form;
signed long next; /* Every element uses this -- it keeps track of the linked list */
signed long prev; /* currently used by tables and font-aware ELE_TEXT logic */
short IndentLevel;
/*
The 'portion' union is set up to include members of an element
which are only valid for certain types of elements. Things should
be added or moved to this union only with great care. Any code
which makes use of the members of the structs within this union
must ensure that the element type is valid for that member. For
example, code which makes use of pel->portion.text.myColor better
be certain that pel->type is ELE_TEXT.
This is done to conserve memory. This struct is allocated MANY
times during the program execution, and anything we can do to keep
it small will be very worthwhile.
More things may be added here later. In fact, most of the things in
the element struct belong here, if added carefully.
*/
union
{
struct _img_element_data img; /* valid when ELE_IMAGE or ELE_FORMIMAGE */
struct _hr_element_data hr; /* valid when ELE_HR */
struct _text_element_data text; /* valid when ELE_TEXT */
#ifdef FEATURE_TABLES
struct _table_element_data t; /* valid when ELE_BEGINTABLE */
struct _end_table_element_data et; /* valid when ELE_ENDTABLE */
struct _cell_element_data c; /* valid when ELE_BEGINCELL */
#endif /* FEATURE_TABLES */
} portion;
};
/* Bits for lFlags in _element structure */
#define ELEFLAG_VISITED 0x00000001
#define ELEFLAG_ANCHOR 0x00000002
#define ELEFLAG_NAME 0x00000004
#define ELEFLAG_IMAGEMAP 0x00000008
#define ELEFLAG_USEMAP 0x00000010
#define ELEFLAG_HIGHLIGHT 0x00000020
#define ELEFLAG_FONT_COLOR 0x00000040
#define ELEFLAG_FONT_SIZE 0x00000080
#define ELEFLAG_WIDTH_PERCENT 0x00000100
#define ELEFLAG_WIDTH_PIXELS 0x00000200
#define ELEFLAG_HR_NOSHADE 0x00000400
#define ELEFLAG_SPLIT 0x00000800
#define INIT_ELE_SPACE 1024
/* The following defines are valid values for isFirstLastValid. isFirstLastValid is used to note if
iFirstVisibleElement and iLastVisibleElement are correct. kFirstLastInvalidLookForward,
kFirstLastInvalidLookBackward, kFirstValidLastInvalid, and kFirstLastInvalidLookAt give hints
to quickly find the new values for iFirstVisibleElement and iLastVisibleElement. */
#define kFirstLastValid -1
#define kFirstLastInvalidLookForward -2
#define kFirstLastInvalidLookBackward -3
#define kFirstValidLastInvalid -4
#define kFirstLastInvalidLookAt(x) (x)
struct ImageElementNode
{
int elementIndex;
struct ImageElementNode *next;
};
struct _www
{
char *szActualURL; /* The actual URL for this document */
char *title;
Pool pool;
int cx;
int cy;
int yscale; /* = ceil(cy/32767) */
int xbound;
int ybound;
int elementCount;
int elementSpace;
int elementTail;
struct _element *aElements;
#ifdef _GIBRALTAR
//
// The following two are pulled out of the HTTP response headers.
//
time_t last_modified;
time_t expires;
#endif // _GIBRALTAR
#ifdef FEATURE_TABLES
struct _cellvector cellStack; /* stack to open BEGIN{TABLE,CELL} element indexes (during parse) */
struct _tabledatavector tabledatavector; /* permanent vector of BEGINTABLE data */
BOOL bProgressiveStoppedAtTable; /* true if we interrupted progressive reformat due to incomplete table */
#endif /* FEATURE_TABLES */
#ifdef UNIX
BOOL bUpdatingScrollbars;
int vmax, vsize, vpage;
int hmax, hsize, hpage;
int next_control_id;
#endif
signed long iFirstFormEl;
struct _LineInfo {
int nFirstElement; /* First element on this line */
int nLastElement;
int nYStart; /* Top of line */
int nYEnd; /* Bottom of line */
} *pLineInfo;
int iFirstVisibleElement; /* first visible item in the page */
int iLastVisibleElement; /* last visible item in the page */
int isFirstLastValid; /* kFirstLastValid -> first and last are valid
kFirstLastInvalidLookForward -> look for the new first/last down the page
kFirstLastInvalidLookBackward -> look for the new first/last up the page
kFirstValidLastInvalid -> first is valid, start looking for last at first
kFirstLastInvalidLookAt -> start looking for the new first/last at element x */
int nLineCount; /* Number of lines in document */
int nLineSpace; /* Number of _LineInfo structs allocated */
#ifdef FEATURE_INLINED_IMAGES
BOOL bIsImage; /* true if this document is really an image */
#endif
int nLastFormattedLine; /* The last line whose formatting is completely valid,
or -1 if the whole document needs reformatting */
struct _line *pFormatState; /* The formatting state as of when nLastFormattedLine
/* Selection start and end. */
struct _position selStart, selEnd;
BOOL bStartIsAnchor; /* TRUE if selStart is the selection anchor. */
int refCount;
struct CharStream *source;
BOOL bHasMissingImages;
RECT rWindow; /* Rectangle to which the document is formatted */
#ifdef WIN32
int iLastElementMouse;
int next_control_id;
#endif
int offl;
int offt;
struct style_sheet *pStyles;
BOOL bIsComplete; /* Tells us whether it's good for caching */
/*
color_vlink, color_link, and color_text are pre-seeded with defaults
from gPrefs. If the attributes are specified for a given document,
then they are overridden.
*/
COLORREF color_vlink;
COLORREF color_alink;
COLORREF color_link;
COLORREF color_text;
/*
color_bgcolor should be assumed valid only if lFlags has
W3DOC_FLAG_COLOR_BGCOLOR
*/
unsigned long lFlags;
COLORREF color_bgcolor;
#ifdef UNIX
/* this are what used to be in the TW, but are
** needed on the w3doc for new bgcolor support
*/
Pixel wbg_color;
Pixel wfg_color;
Pixel wts_color;
Pixel wbs_color;
Pixel sel_fg_color;
#endif
/*
if this is non-NULL, then the BACKGROUND attribute was specified,
but the image itself may not be loaded yet.
*/
struct ImageInfo *piiBackground;
HTAtom atomCharSet;
unsigned char base_point_size; /* this might need to move into Win32, UNIX didn't need it */
#ifdef WIN32
unsigned int nLogPixelsY;
#endif /* WIN32 */
struct ImageElementNode *image_list;
#ifdef FEATURE_STATUS_ICONS
char security; /* type of security used on document */
#endif
};
#define W3DOC_FLAG_COLOR_BGCOLOR 0x00000001
#define W3DOC_FLAG_COLOR_ALINK 0x00000002
#define W3DOC_FLAG_COLOR_LINK 0x00000004
#define W3DOC_FLAG_COLOR_VLINK 0x00000008
#define W3DOC_FLAG_COLOR_TEXT 0x00000010
#define W3DOC_FLAG_USEDCACHE 0x00000020
#define W3DOC_FLAG_VIEWSOURCE 0x00000040
/* Function prototypes */
int GDOC_NewWindow(struct Mwin *tw);
void CloseMwin(struct Mwin *tw);
void FORM_ShowAllChildWindows(struct _www *w3doc, int sw);
int GDOC_LoadImages_Async(struct Mwin *tw, int nState, void **ppInfo); /* Doesn't use ppInfo */
int TW_LoadDocument(struct Mwin *tw, char *url, BOOL bRecord, BOOL bPost,
BOOL bNoDocCache, BOOL bNoImageCache, char *szPostData,
CONST char *szReferer );
BOOL TW_ScrollToElement(struct Mwin *tw, int ndx);
void TW_ForceReformat(struct Mwin *tw);
void TW_Reformat(struct Mwin *tw);
void TW_SetScrollBars(struct Mwin *tw);
void TW_GetWindowWrapRect(struct Mwin *tw, RECT * r);
void TW_adjust_all_child_windows(struct Mwin *tw);
void TW_UpdateRect(struct Mwin *tw, RECT *r);
void GTR_DownLoad(struct Mwin *tw, char *my_url, CONST char *szReferer);
void GTR__DownLoad(struct Mwin *tw, char *url, CONST char *szReferer, CONST char *savefile, BOOL nosavedlg);
#ifdef FEATURE_TABLES
void TW_GetTableBorderCoords(struct _www * pdoc, int iBeginTable, RECT * r);
void TW_GetCellBorderCoords(struct _www * pdoc, int iBeginCell, RECT * r);
BOOL TW_CloneW3docTableInfo(struct _www * pdest, struct _www * psrc);
void TW_W3DocTableCleanup(struct _www * pdoc);
#endif /* FEATURE_TABLES */
void TW_GetHRuleDrawingCoords(RECT * pR, struct _element * pel);
#ifdef FEATURE_IAPI
void GTR_DoSDI(struct Mwin *tw, char *url, CONST char *szReferer,
CONST char *savefile, BOOL nosavedlg);
void GTR_DoHTTPHead(struct Mwin *tw, char *url);
#endif
BOOL TW_WasVisited(struct _www *pdoc, struct _element *pel);
BOOL TW_dofindagain(struct Mwin *tw);
void W3Doc_CheckAnchorVisitations(struct _www *pdoc);
void TW_InvalidateDocument( struct Mwin *tw );
BOOL TW_AmILastWindow(struct Mwin *tw);
void TW_SetWindowName(struct Mwin *tw);
BOOL TW_SetWindowTitle(struct Mwin *tw, const char *s); /* GUI code */
void TW_ForceHitTest(struct Mwin * tw);
int TW_FindLocalAnchor(struct _www *pdoc, char *name);
void TW_FormatToRect(struct _www *pdoc, RECT *r);
void TW_UpdateTBar(struct Mwin *tw);
COLORREF GTR_MakeCOLORREF(int r, int g, int b);
void W3Doc_DisconnectFromWindow(struct _www *w3doc, struct Mwin *tw);
void W3Doc_DeleteAll(struct Mwin *tw);
struct _www *W3Doc_CreateAndInit(struct Mwin *tw, HTRequest *req,
struct CharStream *src);
void W3Doc_ConnectToWindow(struct _www *w3doc, struct Mwin *tw);
void W3Doc_FreeContents(struct Mwin *tw, struct _www *w3doc);
BOOL W3Doc_HasMissingImages(struct _www *w3doc);
BOOL W3Doc_CheckForImageLoad(struct _www *w3doc);
struct CharStream *W3Doc_GetPlainText(struct Mwin *tw);
struct CharStream *W3Doc_GetSelectedText(struct Mwin *tw);
struct _www *W3Doc_CloneDocument(struct _www *src);
void W3Doc_KillClone(struct _www *w3doc);
void HTTP_DisposeHTTPConnection(struct _CachedConn *pCon);
void FTP_DisposeFTPConnection(struct _CachedConn *pCon);
void News_DisposeNewsConnection(struct _CachedConn *pCon);
void TW_DisposeConnection(struct _CachedConn *pCon);
struct Mwin *NewMwin(int type);
void TW_GoBack(struct Mwin *tw);
void TW_GoForward(struct Mwin *tw);
void TW_Reload(struct Mwin *tw);
void TW_SetCurrentDocAsHomePage(struct Mwin *tw);
BOOL TW_CanGoBack(struct Mwin *tw);
BOOL TW_CanGoForward(struct Mwin *tw);
void TW_DestroyWindowHistory(struct Mwin *tw);
int TW_CountWindowHistory(struct Mwin *tw);
void MRQ_MakeString(char *s, char *url, BOOL bPost, char *szPostData);
#endif