diff --git a/network/client/cnetinit.c b/network/client/cnetinit.c index d615cc7c54c..53b1c7cc4c3 100644 --- a/network/client/cnetinit.c +++ b/network/client/cnetinit.c @@ -1,10 +1,29 @@ - +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * 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 "mkutils.h" #include "netutils.h" #include "mkselect.h" #include "mktcp.h" #include "mkgeturl.h" +#include "plstr.h" +#include "prmem.h" #include "fileurl.h" #include "httpurl.h" @@ -21,6 +40,11 @@ #include "marimurl.h" #endif +/* For about handlers */ +#include "il_strm.h" +#include "glhist.h" + +PRIVATE void net_InitAboutURLs(); PUBLIC void NET_ClientProtocolInitialize(void) @@ -41,6 +65,64 @@ NET_ClientProtocolInitialize(void) NET_InitDataURLProtocol(); #ifdef JAVA - NET_InitMarimbaProtocol(); + NET_InitMarimbaProtocol(); +#endif + + net_InitAboutURLs(); +} + +#ifdef XP_UNIX +extern void FE_ShowMinibuffer(MWContext *); + +PRBool net_AboutMinibuffer(const char *token, + FO_Present_Types format_out, + URL_Struct *URL_s, + MWContext *window_id) +{ + FE_ShowMinibuffer(window_id); + + return PR_TRUE; +} +#endif + +#ifdef WEBFONTS +PRBool net_AboutFonts(const char *token, + FO_Present_Types format_out, + URL_Struct *URL_s, + MWContext *window_id) +{ + NF_AboutFonts(window_id, which); + return PR_TRUE; +} +#endif /* WEBFONTS */ + +PRBool net_AboutImageCache(const char *token, + FO_Present_Types format_out, + URL_Struct *URL_s, + MWContext *window_id) +{ + IL_DisplayMemCacheInfoAsHTML(format_out, URL_s, window_id); + return PR_TRUE; +} + +PRBool net_AboutGlobalHistory(const char *token, + FO_Present_Types format_out, + URL_Struct *URL_s, + MWContext *window_id) +{ + NET_DisplayGlobalHistoryInfoAsHTML(window_id, URL_s, format_out); + + return PR_TRUE; +} + +PRIVATE void net_InitAboutURLs() +{ + NET_RegisterAboutProtocol("image-cache", net_AboutImageCache); + NET_RegisterAboutProtocol("global", net_AboutGlobalHistory); +#ifdef XP_UNIX + NET_RegisterAboutProtocol("minibuffer", net_AboutMinibuffer); +#endif +#ifdef WEBFONTS + NET_RegisterAboutProtocol("fonts", net_AboutFonts); #endif } diff --git a/network/main/mkgeturl.c b/network/main/mkgeturl.c index 4f72d7b6621..438d4afb1a3 100644 --- a/network/main/mkgeturl.c +++ b/network/main/mkgeturl.c @@ -302,8 +302,6 @@ HG52422 PRIVATE void net_FreeURLAllHeaders(URL_Struct * URL_s); PRIVATE void NET_InitAboutProtocol(void); -extern MODULE_PRIVATE int PR_CALLBACK NET_AboutColonAccessPrefChanged(const char *pref, void *data); - PRIVATE NET_TimeBombActive = FALSE; typedef struct _WaitingURLStruct { @@ -765,10 +763,6 @@ NET_FinishInitNetLib() NET_RegisterPadPrefCallbacks(); PREF_RegisterCallback("mail.allow_at_sign_in_user_name", NET_PrefChangedFunc, NULL); - PREF_RegisterCallback("network.dnsAttempt", NET_AboutColonAccessPrefChanged, NULL); - - NET_AboutColonAccessPrefChanged(NULL, NULL); - #ifdef XP_UNIX { char *ac_url = getenv("AUTOCONF_URL"); diff --git a/network/protocol/about/abouturl.h b/network/protocol/about/abouturl.h index 370bdc52931..7ff0af3cb7c 100644 --- a/network/protocol/about/abouturl.h +++ b/network/protocol/about/abouturl.h @@ -1,8 +1,47 @@ - +/* -*- 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. + */ #ifndef ABOUTURL_H #define ABOUTURL_H PUBLIC void NET_InitAboutProtocol(void); +/* + * About protocol registration stuff + */ + +/* Callback for registered about protocols. + * Should return PR_TRUE if the token was handled */ +typedef PRBool (*NET_AboutCB)(const char *token, + FO_Present_Types format_out, + URL_Struct *URL_s, + MWContext *window_id); + +/* Wildcard token for FE about protocol handling + * Otherwise unhandled tokens will match on this */ +#define FE_ABOUT_TOKEN ("FEABOUT") + +/* About protocol registration function. + * Returns PR_TRUE if registration succeeds. + * Registration will fail if token or callback is null, + * or token has already been registered */ +PUBLIC PRBool NET_RegisterAboutProtocol(const char *token, + NET_AboutCB callback); + + #endif /* ABOUTURL_H */ diff --git a/network/protocol/about/mkabout.c b/network/protocol/about/mkabout.c index 9225f5dc3a2..be099ebcb17 100644 --- a/network/protocol/about/mkabout.c +++ b/network/protocol/about/mkabout.c @@ -1,3 +1,21 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * 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 "rosetta.h" #include "xp.h" #include "net.h" @@ -10,7 +28,7 @@ #include "xplocale.h" #include "prefapi.h" #include "secnav.h" -#ifndef MODULAR_NETLIB +#ifndef STANDALONE_IMAGE_LIB #include "libimg.h" #endif #include "il_strm.h" @@ -21,6 +39,7 @@ #include "shist.h" #include "prmem.h" #include "plstr.h" +#include "plhash.h" #include "abouturl.h" @@ -55,31 +74,59 @@ extern int XP_DOCUMENT_INFO ; extern int XP_THE_WINDOW_IS_NOW_INACTIVE ; extern int MK_MALFORMED_URL_ERROR; -/* The bit flags for the about colon access int */ -#define ABOUT_CURRENT 1 -#define ABOUT_PICS 2 -#define ABOUT_CACHE 4 -#define ABOUT_CACHE_MEM 8 -#define ABOUT_CACHE_IMAGE 16 -#define ABOUT_STREAMS 32 -#define ABOUT_DOCUMENT 64 -#define ABOUT_GLOBAL 128 -#define ABOUT_FECONTEXT 256 -#define ABOUT_AUTHORS 512 -#define ABOUT_CONFIG 1024 -#define ABOUT_MINIBUFFER 2048 -#define ABOUT_FONTS 4096 -#define ABOUT_COOKIES 8192 -#define ABOUT_SIGNONS 16384 -#define ABOUT_LOGOUT 32768 -PRIVATE int32 aboutAccess = 0; +static PRHashTable *net_AboutTable = NULL; -/* This is a hidden/obscured pref with a misleading name. */ -MODULE_PRIVATE int PR_CALLBACK NET_AboutColonAccessPrefChanged(const char *pref, void *data) { - aboutAccess = 0; - if (PREF_OK != PREF_GetIntPref("network.dnsAttempt", &aboutAccess) ) - aboutAccess = 0; - return TRUE; +PRIVATE PRIntn net_AboutComparator(const void *v1, const void *v2) +{ + char *idx = NULL; + if (idx = PL_strchr((char *) v1, '?')) { + int len = (int)(idx - (char *) v1); + return PL_strncasecmp((char *) v1, (char *) v2, len) == 0; + } else { + return PL_strcasecmp((char *) v1, (char *) v2) == 0; + } +} + +PRIVATE PLHashNumber net_HashAbout(const void *key) +{ + PLHashNumber h; + const PRUint8 *s; + + h = 0; + for (s = (const PRUint8*)key; *s && *s != (PRUint8) '?'; s++) + h = (h >> 28) ^ (h << 4) ^ *s; + return h; +} + +PRIVATE PRBool net_DoRegisteredAbout(const char *which, ActiveEntry *entry) +{ + NET_AboutCB cb; + if (cb = (NET_AboutCB) PL_HashTableLookup(net_AboutTable, which)) { + return cb(which, entry->format_out, entry->URL_s, entry->window_id); + } + return PR_FALSE; +} + +PRIVATE PRBool net_about_enabled(const char *which) +{ + char *which2; + char buf[256]; + XP_Bool res = FALSE; + if (!which) + return PR_FALSE; + + which2 = PL_strdup(which); + if (which2) { + char *args = PL_strchr(which2, '?'); + if (args) + *args = '\0'; + + PR_snprintf(buf, 246, "network.about-enabled.%s", which2); + res = TRUE; + PREF_GetBoolPref(buf, &res); + PR_Free(which2); + } + return (PRBool) res; } PRIVATE void @@ -354,16 +401,24 @@ PRIVATE int net_output_about_url(ActiveEntry * cur_entry) void * fe_data = NULL; Bool uses_fe_data=FALSE; - if (colon) which = colon + 1; + + if (NET_URL_Type(which)) { + if (!net_about_enabled("current")) + return MK_MALFORMED_URL_ERROR; + } else { + if (!net_about_enabled(which)) + return MK_MALFORMED_URL_ERROR; + } + if(0) { /* placeholder to make ifdef's easier */ } #ifdef MOZILLA_CLIENT - else if(NET_URL_Type(which) && !(aboutAccess & ABOUT_CURRENT)) + else if(NET_URL_Type(which)) { /* this url is asking for document info about this * URL. @@ -371,8 +426,8 @@ PRIVATE int net_output_about_url(ActiveEntry * cur_entry) */ net_OutputURLDocInfo(cur_entry->window_id, which, &data, &length); StrAllocCopy(content_type, TEXT_HTML); - } - else if(!PL_strncasecmp(which, "pics", 4) && !(aboutAccess & ABOUT_PICS)) + } + else if(!PL_strncasecmp(which, "pics", 4)) { data = net_gen_pics_document(cur_entry); if (data) { @@ -382,50 +437,42 @@ PRIVATE int net_output_about_url(ActiveEntry * cur_entry) } } #if defined(CookieManagement) - else if(!PL_strcasecmp(which, "cookies") && !(aboutAccess & ABOUT_COOKIES)) + else if(!PL_strcasecmp(which, "cookies")) { NET_DisplayCookieInfoAsHTML(cur_entry->window_id); return(-1); } #endif #if defined(SingleSignon) - else if(!PL_strcasecmp(which, "signons") && !(aboutAccess & ABOUT_SIGNONS)) + else if(!PL_strcasecmp(which, "signons")) { SI_DisplaySignonInfoAsHTML(cur_entry->window_id); return(-1); } #endif - else if(!PL_strncasecmp(which, "cache", 5) && !(aboutAccess & ABOUT_CACHE)) + else if(!PL_strncasecmp(which, "cache", 5)) { NET_DisplayCacheInfoAsHTML(cur_entry); return(-1); } - else if(!PL_strcasecmp(which, "memory-cache") && !(aboutAccess & ABOUT_CACHE_MEM)) + else if(!PL_strcasecmp(which, "memory-cache")) { NET_DisplayMemCacheInfoAsHTML(cur_entry); return(-1); } - else if(!PL_strcasecmp(which, "logout") && !(aboutAccess & ABOUT_LOGOUT) ) + else if(!PL_strcasecmp(which, "logout")) { NET_RemoveAllAuthorizations(); return(-1); } -#ifndef MODULAR_NETLIB - else if(!PL_strcasecmp(which, "image-cache") && !(aboutAccess & ABOUT_CACHE_IMAGE)) - { - IL_DisplayMemCacheInfoAsHTML(cur_entry->format_out, cur_entry->URL_s, - cur_entry->window_id); - return(-1); - } -#endif #ifdef DEBUG - else if(!PL_strcasecmp(which, "streams") && !(aboutAccess & ABOUT_STREAMS)) + else if(!PL_strcasecmp(which, "streams")) { - NET_DisplayStreamInfoAsHTML(cur_entry); - return(-1); + NET_DisplayStreamInfoAsHTML(cur_entry); + return(-1); } #endif /* DEBUG */ - else if(!PL_strcasecmp(which, "document") && !(aboutAccess & ABOUT_DOCUMENT)) + else if(!PL_strcasecmp(which, "document")) { char buf[64]; History_entry *his; @@ -480,18 +527,7 @@ PRIVATE int net_output_about_url(ActiveEntry * cur_entry) if(cur_entry->URL_s->window_chrome) { memset(cur_entry->URL_s->window_chrome, 0, sizeof(Chrome)); - /* it should be MWContextDialog - * but X isn't ready for it yet... - */ -/* X is ready for MWContextDialog now... - *#ifdef XP_UNIX - * cur_entry->URL_s->window_chrome->type = MWContextBrowser; - *#else - */ cur_entry->URL_s->window_chrome->type = MWContextDialog; -/* - *#endif - */ cur_entry->URL_s->window_chrome->show_scrollbar = TRUE; cur_entry->URL_s->window_chrome->allow_resize = TRUE; cur_entry->URL_s->window_chrome->allow_close = TRUE; @@ -535,7 +571,7 @@ PRIVATE int net_output_about_url(ActiveEntry * cur_entry) length = PL_strlen(data); StrAllocCopy(content_type, TEXT_HTML); } - else if(!PL_strncasecmp(which, "Global", 6) && !(aboutAccess & ABOUT_GLOBAL)) + else if(!PL_strncasecmp(which, "Global", 6)) { cur_entry->status = NET_DisplayGlobalHistoryInfoAsHTML( cur_entry->window_id, @@ -545,7 +581,7 @@ PRIVATE int net_output_about_url(ActiveEntry * cur_entry) return(-1); } - else if(!PL_strncmp(which, "FeCoNtExT=", 10) && !(aboutAccess & ABOUT_FECONTEXT)) + else if(!PL_strncmp(which, "FeCoNtExT=", 10)) { MWContext *old_ctxt; @@ -572,7 +608,7 @@ PRIVATE int net_output_about_url(ActiveEntry * cur_entry) } #endif /* MOZILLA_CLIENT */ - else if(!PL_strncasecmp(which, "authors", 7) && !(aboutAccess & ABOUT_AUTHORS)) + else if(!PL_strncasecmp(which, "authors", 7)) { static const char *d = ("window_id); - } -#endif -#ifdef WEBFONTS - else if (!PL_strncasecmp(which, "fonts", 5) && !(aboutAccess & ABOUT_FONTS)) - { - NF_AboutFonts(cur_entry->window_id, which); - return (-1); - } -#endif /* WEBFONTS */ else { + if (net_DoRegisteredAbout(which, cur_entry)) { + return -1; + } fe_data = FE_AboutData(which, &data, &length, &content_type); uses_fe_data=TRUE; } @@ -670,7 +694,6 @@ PRIVATE int net_output_about_url(ActiveEntry * cur_entry) PR_Free(content_type); } - return(-1); } @@ -847,6 +870,18 @@ PRIVATE Bool net_about_kludge(URL_Struct *URL_s) } } +PRBool NET_RegisterAboutProtocol(const char *token, + NET_AboutCB callback) +{ + if (!token || !callback) { + return PR_FALSE; + } + if (PL_HashTableLookup(net_AboutTable, token) != NULL) { + return PR_FALSE; + } + PL_HashTableAdd(net_AboutTable, token, callback); +} + PRIVATE int32 net_AboutLoad(ActiveEntry *ce) { @@ -871,17 +906,24 @@ net_AboutStub(ActiveEntry *ce) PRIVATE void net_CleanupAbout(void) { + PL_HashTableDestroy(net_AboutTable); } PUBLIC void NET_InitAboutProtocol(void) { - static NET_ProtoImpl about_proto_impl; + static NET_ProtoImpl about_proto_impl; - about_proto_impl.init = net_AboutLoad; - about_proto_impl.process = net_AboutStub; - about_proto_impl.interrupt = net_AboutStub; - about_proto_impl.cleanup = net_CleanupAbout; + about_proto_impl.init = net_AboutLoad; + about_proto_impl.process = net_AboutStub; + about_proto_impl.interrupt = net_AboutStub; + about_proto_impl.cleanup = net_CleanupAbout; - NET_RegisterProtocolImplementation(&about_proto_impl, ABOUT_TYPE_URL); + NET_RegisterProtocolImplementation(&about_proto_impl, ABOUT_TYPE_URL); + + net_AboutTable = PL_NewHashTable(32, + net_HashAbout, + net_AboutComparator, + PL_CompareValues, + NULL, NULL); }