/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * The contents of this file are subject to the Netscape Public License * Version 1.0 (the "NPL"); you may not use this file except in * compliance with the NPL. You may obtain a copy of the NPL at * http://www.mozilla.org/NPL/ * * Software distributed under the NPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL * for the specific language governing rights and limitations under the * NPL. * * The Initial Developer of this code under the NPL is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All Rights * Reserved. */ #include "xp.h" #include "pa_parse.h" #include "layout.h" #include "laylayer.h" #include "layers.h" #include "prmem.h" /* for XP_GetString() */ #include "xpgetstr.h" extern int LAY_PAGEINFO_NOINFO; extern int LAY_PAGEINFO_FRAME; extern int LAY_PAGEINFO_IMAGE; extern int LAY_PAGEINFO_EMBED; extern int LAY_PAGEINFO_APPLET; extern int LAY_PAGEINFO_BACKGROUND_IMAGE; extern int LAY_PAGEINFO_ACTIONURL; extern int LAY_PAGEINFO_ENCODING; extern int LAY_PAGEINFO_METHOD; extern int LAY_PAGEINFO_LAYER; #define STREAM_WRITE(Str) \ (*stream->put_block)(stream, Str, XP_STRLEN(Str)) PRIVATE void lo_element_info(LO_Element *ele_list, NET_StreamClass *stream) { LO_Element *eptr; char buf[1024]; char *tmp_ptr; eptr = ele_list; while (eptr != NULL) { switch(eptr->type) { case LO_IMAGE: { LO_ImageStruct *image; char *str; char *image_src; image = (LO_ImageStruct *)eptr; /* * Extract the SRC of this image. */ PA_LOCK(str, char *, image->image_url); if (str != NULL) { image_src = XP_STRDUP(str); } else { image_src = NULL; } if(image_src && XP_STRNCMP(image_src, "internal-external-reconnect", 27)) { XP_STRCPY(buf,"
  • "); XP_STRCAT(buf, XP_GetString(LAY_PAGEINFO_IMAGE)); XP_STRCAT(buf," "); STREAM_WRITE(buf); tmp_ptr = NET_EscapeHTML(image_src); STREAM_WRITE(tmp_ptr); XP_FREE(tmp_ptr); XP_STRCPY(buf,""); STREAM_WRITE(buf); XP_FREE(image_src); } PA_UNLOCK(image->image_url); } break; case LO_EMBED: { LO_EmbedStruct *embed; char *str; char *embed_src; embed = (LO_EmbedStruct *)eptr; /* * Extract the SRC of this embed. */ PA_LOCK(str, char *, embed->embed_src); if (str != NULL) { embed_src = XP_STRDUP(str); } else { embed_src = NULL; } PA_UNLOCK(embed->embed_src); if(embed_src) { XP_STRCPY(buf,"
  • "); XP_STRCAT(buf, XP_GetString(LAY_PAGEINFO_EMBED)); XP_STRCAT(buf," "); STREAM_WRITE(buf); tmp_ptr = NET_EscapeHTML(embed_src); STREAM_WRITE(tmp_ptr); XP_FREE(tmp_ptr); XP_STRCPY(buf,""); STREAM_WRITE(buf); XP_FREE(embed_src); } } break; case LO_BUILTIN: { LO_BuiltinStruct *builtin; char *str; char *builtin_src; builtin = (LO_BuiltinStruct *)eptr; /* * Extract the SRC of this builtin. */ PA_LOCK(str, char *, builtin->builtin_src); if (str != NULL) { builtin_src = XP_STRDUP(str); } else { builtin_src = NULL; } PA_UNLOCK(builtin->builtin_src); if(builtin_src) { XP_STRCPY(buf,"
  • "); XP_STRCAT(buf, XP_GetString(LAY_PAGEINFO_EMBED)); XP_STRCAT(buf," "); STREAM_WRITE(buf); tmp_ptr = NET_EscapeHTML(builtin_src); STREAM_WRITE(tmp_ptr); XP_FREE(tmp_ptr); XP_STRCPY(buf,""); STREAM_WRITE(buf); XP_FREE(builtin_src); } } break; #ifdef JAVA case LO_JAVA: { LO_JavaAppStruct *java_app; char *str; char *java_code = NULL; char *java_codebase = NULL; char *java_archive = NULL; char *java_name = NULL; java_app = (LO_JavaAppStruct *)eptr; /* * Extract the java class of this * java applet. */ PA_LOCK(str, char *, java_app->attr_code); if (str != NULL) { java_code = XP_STRDUP(str); } PA_UNLOCK(java_app->attr_code); /* * Extract the codebase of this * java applet. */ PA_LOCK(str, char *, java_app->attr_codebase); if (str != NULL) { java_codebase = XP_STRDUP(str); } PA_UNLOCK(java_app->attr_codebase); /* * Extract the archive of this * java applet. */ PA_LOCK(str, char *, java_app->attr_archive); if (str != NULL) { java_archive = XP_STRDUP(str); } PA_UNLOCK(java_app->attr_archive); /* * Extract the app name of this * java applet. */ PA_LOCK(str, char *, java_app->attr_name); if (str != NULL) { java_name = XP_STRDUP(str); } PA_UNLOCK(java_app->attr_name); if(java_code) { XP_STRCPY(buf,"
  • "); XP_STRCAT(buf, XP_GetString(LAY_PAGEINFO_APPLET)); XP_STRCAT(buf," "); STREAM_WRITE(buf); STREAM_WRITE(java_code); XP_STRCPY(buf,""); STREAM_WRITE(buf); XP_FREE(java_code); } if(java_codebase) { XP_STRCPY(buf,"
  • "); XP_STRCAT(buf, XP_GetString(LAY_PAGEINFO_APPLET)); XP_STRCAT(buf," "); STREAM_WRITE(buf); STREAM_WRITE(java_codebase); XP_STRCPY(buf,""); STREAM_WRITE(buf); XP_FREE(java_codebase); } if(java_archive) { XP_STRCPY(buf,"
  • "); XP_STRCAT(buf, XP_GetString(LAY_PAGEINFO_APPLET)); XP_STRCAT(buf," "); STREAM_WRITE(buf); STREAM_WRITE(java_archive); XP_STRCPY(buf,""); STREAM_WRITE(buf); XP_FREE(java_archive); } if(java_name) { XP_STRCPY(buf,"
  • "); XP_STRCAT(buf, XP_GetString(LAY_PAGEINFO_APPLET)); XP_STRCAT(buf," "); STREAM_WRITE(buf); STREAM_WRITE(java_name); XP_STRCPY(buf,""); STREAM_WRITE(buf); XP_FREE(java_name); } } break; #endif /* * We must recursively traverse into cells. */ case LO_CELL: lo_element_info(eptr->lo_cell.cell_list, stream); lo_element_info(eptr->lo_cell.cell_float_list, stream); break; default: break; } eptr = eptr->lo_any.next; } } PRIVATE void lo_backdrop_info(char *backdrop_image_url, NET_StreamClass *stream) { if (backdrop_image_url) { char buf[1024]; char *str_ptr; char *copy_of_str; PA_LOCK(str_ptr, char *, backdrop_image_url); /* layout mucks with strings so you must make * a copy of them before sending them up */ copy_of_str = XP_STRDUP(str_ptr); if(copy_of_str) { XP_STRCPY(buf, XP_GetString(LAY_PAGEINFO_BACKGROUND_IMAGE) ); STREAM_WRITE(buf); XP_STRCPY(buf, ""); STREAM_WRITE(buf); XP_FREE(copy_of_str); copy_of_str = XP_STRDUP(str_ptr); if(copy_of_str) { STREAM_WRITE(copy_of_str); XP_FREE(copy_of_str); } XP_STRCPY(buf,""); STREAM_WRITE(buf); } PA_UNLOCK(backdrop_image_url); } } PRIVATE void lo_form_info(lo_FormData *form_list, NET_StreamClass *stream) { int form_num=1; while (form_list != NULL) { char *str; char *submit_url; char *encoding; char buf[1024]; XP_SPRINTF(buf, "Form %d:"); STREAM_WRITE(buf); /* move to the next one */ form_list = form_list->next; } } /* * Prepare a bunch of information about the content of this * document and prints the information as HTML down * the passed in stream. * * Returns: * -1 If the context passed does not correspond to any currently * laid out document. * 0 If the context passed corresponds to a document that is * in the process of being laid out. * 1 If the context passed corresponds to a document that is * completly laid out and info can be found. */ PUBLIC intn LO_DocumentInfo(MWContext *context, NET_StreamClass *stream) { int32 doc_id, i; lo_TopState *top_state; lo_DocState *state; LO_Element **line_array; LO_Element *eptr; /* stuff we want to return info on */ char *backdrop_image_url; char *url; char *base_url; char *escaped; lo_FormData *form_list; if (context == NULL) { return(-1); } /* * Get the unique document ID, and retreive this * documents layout state. */ doc_id = XP_DOCID(context); top_state = lo_FetchTopState(doc_id); if ((top_state == NULL)||(top_state->doc_state == NULL)) { return(-1); } state = top_state->doc_state; if (top_state->layout_status != PA_COMPLETE) { char buf[1024]; XP_STRCPY(buf, XP_GetString(LAY_PAGEINFO_NOINFO)); STREAM_WRITE(buf); return(0); } /* * Extract the URL this document was accessed by. */ if (top_state->url != NULL) { char buf[1024]; url = XP_STRDUP(top_state->url); XP_STRCPY(buf, ""); STREAM_WRITE(buf); escaped = NET_EscapeHTML(url); STREAM_WRITE(escaped); PR_Free(escaped); XP_STRCPY(buf,""); STREAM_WRITE(buf); return(1); } /* * The number of cells may be less than * the rows * cols because of blank cells. */ cell_count = the_grid->cell_count; cell_list = the_grid->cell_list; while (cell_list != NULL) { char *cell_url; MWContext *cell_context; /* * Extract the cell's URL. */ if (cell_list->url != NULL) { cell_url = XP_STRDUP(cell_list->url); } else { cell_url = NULL; } /* * Extract the cell's window context. */ cell_context = cell_list->context; XP_STRCPY(buf, XP_GetString(LAY_PAGEINFO_FRAME)); STREAM_WRITE(buf); /* recurse and print if valid context */ if (cell_context != NULL) { LO_DocumentInfo(cell_context, stream); } cell_list = cell_list->next; } XP_STRCPY(buf,""); STREAM_WRITE(buf); return(1); } /* * Extract the list of all forms in this doc. */ form_list = top_state->doc_lists.form_list; lo_form_info(form_list, stream); /* * Now traverse the element list describing important elements. * Right now interesting elements are Images and Embeds. */ /* * Make eptr point to the start of the element chain * for this document. */ #ifdef XP_WIN16 { XP_Block *larray_array; XP_LOCK_BLOCK(larray_array, XP_Block *, state->larray_array); state->line_array = larray_array[0]; XP_UNLOCK_BLOCK(state->larray_array); } #endif /* XP_WIN16 */ XP_LOCK_BLOCK(line_array, LO_Element **, state->line_array); eptr = line_array[0]; XP_UNLOCK_BLOCK(state->line_array); lo_element_info(eptr, stream); lo_element_info(state->float_list, stream); for (i = 0; i <= state->top_state->max_layer_num; i++) { lo_LayerDocState *layer_state = state->top_state->layers[i]; char buf[1024]; char *name; if (!layer_state) continue; if (layer_state->id == LO_DOCUMENT_LAYER_ID) continue; XP_STRCPY(buf, XP_GetString(LAY_PAGEINFO_LAYER)); STREAM_WRITE(buf); if (layer_state->layer) { name = CL_GetLayerName(layer_state->layer); if (name) STREAM_WRITE(name); } XP_STRCPY(buf, ""); STREAM_WRITE(buf); } if(1) { char buf[16]; XP_STRCPY(buf,""); STREAM_WRITE(buf); } return(1); }