CUnknownTypeDlg dlgUnknown(GetFrame(pContext)->GetFrameWnd(), pUrl->content_type, pHelper);
CFrameWnd *pFrame = NULL; CFrameGlue *pGlue = GetFrame(pContext); if(pGlue)   { pFrame = pGlue->GetFrameWnd(); } else    { pFrame = FEU_GetLastActiveFrame(MWContextAny, TRUE); } CUnknownTypeDlg dlgUnknown(pFrame, pUrl->content_type, pHelper);
NET_StreamClass *external_viewer_disk_stream(int iFormatOut, void *pDataObj, URL_Struct *pUrl, MWContext *pContext)	{    ASSERT(pUrl);    ASSERT(pUrl->address);	//	Lookup the helper app, if one exists.	//	If not found, create one on the fly.	CNetscapeApp *pNetscape = (CNetscapeApp *)AfxGetApp();	CHelperApp *pHelper;	XP_Bool isNewHelper = FALSE;	if(0 == pNetscape->m_HelperListByType.Lookup(pUrl->content_type, (CObject *&)pHelper))	{		//	couldn't find one.		//	create the new mime type.		CString csText = pUrl->content_type;		//	If there's no slash, just send the type as the file type		//		(this usually only happens on server error, but we		//		should still behave ourselves).		int iSlash = csText.Find('/');		if(iSlash != -1)	{			// this mess splits the string into the stuff before the slash and			//   the stuff after the slash			pHelper = fe_AddNewFileFormatType(csText.Left(iSlash),				csText.Right(csText.GetLength() - iSlash - 1));			isNewHelper = TRUE;		}		else	{			pHelper = fe_AddNewFileFormatType(csText, "");			isNewHelper = TRUE;		}	}	//	The helper app is now defined for the mime type in any case.	//	See how it is to be handled.	BOOL bExternal = FALSE;	BOOL bSave = FALSE;	BOOL bMoreInfo = FALSE;	switch(pHelper->how_handle)	{	case HANDLE_UNKNOWN:	{		//	See what this is supposed to do via user input.		CUnknownTypeDlg dlgUnknown(GetFrame(pContext)->GetFrameWnd(), pUrl->content_type, pHelper);		int iDlg = dlgUnknown.DoModal();		if(iDlg == IDCANCEL)	{			//	User hit cancel.  Abort the load.			if (pHelper && pHelper->cd_item && isNewHelper) {				if (XP_ListRemoveObject(cinfo_MasterListPointer(), pHelper->cd_item)) {					if (pHelper->cd_item) {						if (pHelper->cd_item->ci.type) {							theApp.m_HelperListByType.RemoveKey(pHelper->cd_item->ci.type);							XP_FREE( pHelper->cd_item->ci.type );						}						XP_FREE (pHelper->cd_item);					}					delete pHelper;				}			}			return(NULL);		}		else if(iDlg == HANDLE_EXTERNAL)	{            char buf[256];			bExternal = TRUE;			// We need to indicate that this is a user-defined MIME type. If we			// don't, then we won't remember it the next time the Navigator is run            sprintf(buf,"TYPE%d",theApp.m_iNumTypesInINIFile);            theApp.m_iNumTypesInINIFile++;            theApp.WriteProfileString("Viewers", buf, pUrl->content_type);            pHelper->bNewType = FALSE;		}		else if(iDlg == HANDLE_SAVE)	{			bSave = TRUE;		}		else if(iDlg == HANDLE_MOREINFO)	{			bMoreInfo = TRUE;		}		break;	}	case HANDLE_EXTERNAL:		case HANDLE_BY_OLE: {		bExternal = TRUE;		break;	}	case HANDLE_SHELLEXECUTE:	{		bExternal = TRUE;		break;	}	case HANDLE_SAVE:	{		bSave = TRUE;		break;	}	default:	{		//	Shouldn't ever be other than the above types at this		//		point!		ASSERT(0);		return(NULL);	}	}	//	We know that we are either saving or spawning an external	//		viewer at this point.	NET_StreamClass *pRetval = NULL;	if (bSave == TRUE)	{		return ExternalFileSave(iFormatOut, pUrl, pContext);	} else if (bExternal == TRUE)	{		//	Prompt the user for a file name.		//  Security rist to let path information in externally provided		//      filename (content disposition, filename =)		// XXX This code could be cleaned up -- eliminate aFileName 		// and just use what was allocated by WH_TempFileName.		char aFileName[_MAX_PATH];		char *pSuggestedName = NULL;		BOOL bUseContentName = FALSE;        if (pUrl->content_name != NULL &&            strstr(pUrl->content_name, "../") == NULL &&            strstr(pUrl->content_name, "..\\") == NULL) {			bUseContentName = TRUE;		}		else {			pSuggestedName = fe_URLtoLocalName(pUrl->address, pUrl->content_type);		}		char *pDestination;		ASSERT(pNetscape->m_pTempDir);		if(pNetscape->m_pTempDir != NULL && pSuggestedName != NULL)	{			sprintf(aFileName, "%s\\%s", pNetscape->m_pTempDir, pSuggestedName);			XP_FREE(pSuggestedName);			pSuggestedName = NULL;			pDestination = aFileName;		}		else	{            char aExt[_MAX_EXT];            size_t stExt = 0;            DWORD dwFlags = 0;            const char *pName = pUrl->address;                        if(bUseContentName) {                pName = pUrl->content_name;            }#ifdef XP_WIN16            dwFlags |= EXT_DOT_THREE;#endif            aExt[0] = '\0';            stExt = EXT_Invent(aExt, sizeof(aExt), dwFlags, pName, pUrl->content_type);            char *pTemp = WH_TempFileName(xpTemporary, "M", aExt);            if(pTemp) {                strcpy(aFileName, pTemp);                XP_FREE(pTemp);                pTemp = NULL;            }            else {                aFileName[0] = '\0';            }		}		pDestination = aFileName;		//	Figure out the application that we'll be spawning.		//	Strip off odd things at the right hand side.		CString csCommand;        if(pHelper->how_handle == HANDLE_EXTERNAL)  {            csCommand = pHelper->csCmd;		    int iStrip = csCommand.ReverseFind('%');		    if(iStrip > 0)	{			    csCommand = csCommand.Left(iStrip - 1);		    }        }		//	See if it's actually OK to spawn this application.        CString csSpawn = csCommand;        BOOL bShellExecute = FALSE;        if(pHelper->how_handle == HANDLE_SHELLEXECUTE ||			pHelper->how_handle == HANDLE_BY_OLE) {            //  Shell execute type, figure out the exe.            char aExe[_MAX_PATH];            memset(aExe, 0, sizeof(aExe));            if(FEU_FindExecutable(pDestination, aExe, FALSE)) {                csSpawn = aExe;                if(pHelper->how_handle == HANDLE_SHELLEXECUTE) {                    bShellExecute = TRUE;                }            }            else     {                csSpawn.Empty();            }        }		// See whether the user wants to be prompted before we open the file		if (pContext->type != MWContextPrint && theApp.m_pSpawn->PromptBeforeOpening((LPCSTR)csSpawn)) {			BOOL	bFree = FALSE;			LPCSTR	lpszFilename = NULL;			if (pUrl->content_name != NULL &&				strstr(pUrl->content_name, "../") == NULL &&				strstr(pUrl->content_name, "..\\") == NULL) {				lpszFilename = pUrl->content_name;			}			if (!lpszFilename) {				lpszFilename = fe_URLtoLocalName(pUrl->address, pUrl->content_type);				bFree = TRUE;			}			char* docExt[1];			const char * ptr1 = lpszFilename;			int type = NET_URL_Type(pUrl->address);			BOOL canHandleOLE = FALSE;			if ((type != MAILBOX_TYPE_URL) && (type !=NEWS_TYPE_URL) && (type != IMAP_TYPE_URL) ) {				docExt[0] = FE_FindFileExt((char*)ptr1);				if (docExt[0])					canHandleOLE = fe_CanHandleByOLE(docExt, 1);			}			CLaunchHelper	dlg(lpszFilename, (LPCSTR)csSpawn, canHandleOLE, GetFrame(pContext)->GetFrameWnd());				if (bFree)				XP_FREE((LPVOID)lpszFilename);			// Initialize the dialog to some defaults.			dlg.m_bAlwaysAsk = TRUE;			//dlg.m_nAction = HELPER_SAVE_TO_DISK; //Old statement CRN_MIME			dlg.m_nAction = (pHelper->how_handle == HANDLE_SHELLEXECUTE) ? HELPER_OPEN_IT : HELPER_SAVE_TO_DISK; //New Statement. Set m_nAction based on pHelper->how_handle... CRN_MIME			dlg.m_bHandleByOLE = fe_IsHandleByOLE(pUrl->content_type);				// Ask the user			if (dlg.DoModal() == IDCANCEL)				return NULL;				// See if they no longer want to be asked			if (!dlg.m_bAlwaysAsk) {				if (dlg.m_nAction == HELPER_SAVE_TO_DISK) {					// User wants to just save to disk					pHelper->how_handle = HANDLE_SAVE;					pHelper->csCmd = MIME_SAVE;					pHelper->bChanged = TRUE;								} else {					ASSERT(dlg.m_nAction == HELPER_OPEN_IT);					theApp.m_pSpawn->SetPromptBeforeOpening((LPCSTR)csSpawn, FALSE);				}			}			// Check whether the user wants to launch the application or save it			// do disk			if (dlg.m_nAction == HELPER_SAVE_TO_DISK)				return ExternalFileSave(iFormatOut, pUrl, pContext);			else { // open it case.				// user want to handle this by OLE.				if (dlg.m_bHandleByOLE) {					fe_SetHandleByOLE(pUrl->content_type, pHelper, TRUE);				}				// Since mail and new will not be able launch using OLE inplace server, so we should not try to change helper app				// how_handle here.				else if (pHelper->how_handle == HANDLE_BY_OLE) {					fe_SetHandleByOLE(pUrl->content_type, pHelper, FALSE);				}			}		}		// MWH -- see could we handle this via OLE.		if ((iFormatOut == FO_PRESENT || iFormatOut == FO_PRINT)  &&			(pHelper->how_handle == HANDLE_BY_OLE) &&				FE_FileType(pUrl->address, pUrl->content_type, pUrl->content_encoding)) {			// can be handle by OLE.				return OLE_ViewStream(iFormatOut, pDataObj, pUrl,pContext);		}		//	It's OK to spawn this application.		//	Attempt to split it off into a seperate context.		if(bShellExecute) {		    pRetval = CSaveCX::ViewUrlObject(pUrl, NULL);		}		else {		    pRetval = CSaveCX::ViewUrlObject(pUrl, csSpawn);		}		if(pRetval != NULL)	{			return(pRetval);		}		//	Couldn't split off into a new context.		//	Handle as was handled before.		//	We have a destination file name.		FILE *pSink = XP_FileOpen(pDestination, xpTemporary, "wb");		if(pSink == NULL)	{			FE_Alert(pContext, szLoadString(IDS_FAILED_CREATE_TEMP_FILE));			XP_FREE(pDestination);			return(NULL);		}		//	Create the data object that will be passed along down		//		the stream.		DataObject *pMe = new DataObject;        if(!pMe)            return(NULL);		memset(pMe, 0, sizeof(DataObject));		pMe->how_handle = pHelper->how_handle;		pMe->fp = pSink;		pMe->context = pContext;		pMe->format_out = iFormatOut;		pMe->filename = pDestination;		pMe->content_length = pUrl->content_length < 0 ? 0 : pUrl->content_length;		pMe->cur_loc = 0;		StrAllocCopy(pMe->address, pUrl->address);		StrAllocCopy(pMe->format_in, pUrl->content_type);		//	The spawn command.        if(pMe->how_handle == HANDLE_EXTERNAL)  {            pMe->params = XP_STRDUP(pDestination);        }        else if(pMe->how_handle == HANDLE_SHELLEXECUTE)    {		    csCommand += pDestination;        }        else if(pMe->how_handle == HANDLE_BY_OLE)    {		    csCommand += pDestination;        }		pMe->command = XP_STRDUP(csCommand);		//	Progress.		FE_SetProgressBarPercent(pContext, 0);		//	Delete the file on exit.		FE_DeleteFileOnExit(pDestination, pUrl->address);		//	Set the waiting mode???		FE_EnableClicking(pContext);		//	Create the stream.		pRetval = NET_NewStream("ServeAndView",                    			disk_stream_write,                    			disk_stream_complete,                    			disk_stream_abort,                    			write_ready,                    			pMe,                    			pContext);	}	if(bMoreInfo == TRUE)	{		char * url = NULL;		PREF_CopyConfigString("internal_url.more_info_plugin.url",&url);		if (url) {			CString csUrlAddress = url;			csUrlAddress += "?";			csUrlAddress += pUrl->content_type;			(ABSTRACTCX(pContext))->NormalGetUrl(csUrlAddress, pUrl->address, csUrlAddress);			XP_FREE(url);		}    }	//	Return the stream that was created.	return(pRetval);}