Exemplo n.º 1
0
PUBLIC NET_StreamClass *
#endif

XML_XMLConverter(FO_Present_Types  format_out, void *data_object, URL_Struct *URL_s, MWContext  *window_id)
{
    NET_StreamClass* stream;
    XMLFile  xmlf;
    TRACEMSG(("Setting up display stream. Have URL: %s\n", URL_s->address));

    xmlf = (XMLFile) getMem(sizeof(XMLFileStruct));
    xmlf->holdOver = getMem(XML_BUF_SIZE);
    xmlf->lineSize = XML_LINE_SIZE;
    xmlf->line     = (char*)getMem(XML_LINE_SIZE);
    xmlf->urls = URL_s;
    xmlf->address = copyString(URL_s->address);
    xmlf->mwcontext = window_id;
    xmlf->numOpenStreams = 1;
	/*	URL_s->fedata = xmlf; */
    stream = NET_NewStream("XML", (MKStreamWriteFunc)parseNextXMLBlob, 
			   (MKStreamCompleteFunc)xml_complete,
			   (MKStreamAbortFunc)xml_abort, 
			   (MKStreamWriteReadyFunc)xml_write_ready, xmlf, window_id);
    if (stream == NULL) freeMem(xmlf);
	
    return(stream);
}
Exemplo n.º 2
0
PUBLIC NET_StreamClass *
#endif

XML_HTMLConverter(FO_Present_Types  format_out, void *data_object, URL_Struct *URL_s, MWContext  *window_id)
{
    XMLHTMLInclusion  ss = (XMLHTMLInclusion) URL_s->fe_data;

    return NET_NewStream("XML-HTML", (MKStreamWriteFunc)xmlhtml_write, 
			   (MKStreamCompleteFunc)xmlhtml_complete,
			   (MKStreamAbortFunc)xmlhtml_abort, 
			   (MKStreamWriteReadyFunc)xmlhtml_write_ready, ss, window_id);
}
Exemplo n.º 3
0
PUBLIC NET_StreamClass *
#endif

XML_CSSConverter(FO_Present_Types  format_out, void *data_object, URL_Struct *URL_s, MWContext  *window_id)
{
    StyleSheet  ss = (StyleSheet) URL_s->fe_data;
    TRACEMSG(("Setting up style sheet stream. Have URL: %s\n", URL_s->address));

    return NET_NewStream("XML-CSS", (MKStreamWriteFunc)parseNextXMLCSSBlob, 
			   (MKStreamCompleteFunc)xmlcss_complete,
			   (MKStreamAbortFunc)xmlcss_abort, 
			   (MKStreamWriteReadyFunc)xmlcss_write_ready, ss, window_id);
}
Exemplo n.º 4
0
PUBLIC NET_StreamClass *
#endif

rdf_Converter(FO_Present_Types format_out, void *client_data,
		URL_Struct *urls, MWContext *cx)
{
	RDFFile			rdfFile;
	MKStreamWriteFunc	writeFunc = NULL;

	if ((urls == NULL) || (urls->fe_data == NULL))
	{
		return(NULL);
	}

	/* determine appropriate write function to use */
	rdfFile = urls->fe_data;
	switch(rdfFile->fileType)
	{
		case	ES_RT:
		case	FTP_RT:
		writeFunc = (MKStreamWriteFunc)parseNextESFTPBlob;
		break;

		case	RDF_MCF:
		writeFunc = (MKStreamWriteFunc)parseNextMCFBlob;
		break;

		default:
		writeFunc = (MKStreamWriteFunc)parseNextRDFXMLBlob;
		break;
	}

	/* allocate stream data block */
	return NET_NewStream("RDF", writeFunc, 
			(MKStreamCompleteFunc)rdf_complete,
			(MKStreamAbortFunc)rdf_abort, 
			(MKStreamWriteReadyFunc)rdf_write_ready,
			urls->fe_data, cx);
}
Exemplo n.º 5
0
NET_StreamClass *EmbedStream(int iFormatOut, void *pDataObj, URL_Struct *pUrlData, MWContext *pContext)
{
    NPEmbeddedApp* pEmbeddedApp = NULL;
    CNetscapeCntrItem* pItem = NULL;
    NET_StreamClass * pStream = NULL;

    if(wfe_IsRegisteredForPlugin(iFormatOut, pUrlData, pContext)) {
        if(!ABSTRACTCX(pContext)->IsPrintContext()) {
			if (iFormatOut == FO_EMBED) {
				// NPL_NewEmbedStream() sets pUrlData->fe_data to NPEmbeddedApp*, so
				// it is not valid until NPL_NewEmbedStream() returns
				pStream = NPL_NewEmbedStream((FO_Present_Types)iFormatOut,
					pDataObj, pUrlData, pContext);
				
			} else if (iFormatOut == FO_PRESENT) {
				// NPL_NewPresentStream() sets pUrlData->fe_data to NPEmbeddedApp*, so
				// it is not valid until NPL_NewPresentStream() returns
				pStream = NPL_NewPresentStream((FO_Present_Types)iFormatOut,
					pDataObj, pUrlData, pContext);
				
			} else {
				ASSERT(FALSE);
				return NULL;
			}

            // If we fail to load for some reason, show a broken icon.
            if(!pStream) {
                if(pItem)
                    pItem->m_bBroken = TRUE;
                return NULL;
            }
            pEmbeddedApp = (NPEmbeddedApp*)pUrlData->fe_data;
            if(pEmbeddedApp)
                pItem = (CNetscapeCntrItem *)pEmbeddedApp->fe_data;
        }

        // pDataObj gets its fe_data member written by libplugin in
        // the full screen case
		//
		// It's possible that the context is different. This happens for full-page
		// plug-ins when we decide to display the plugin in it's own window
		if (pItem && pItem->GetDocument()) {
			CDCCX*	pDC = pItem->GetDocument()->GetContext();

			if (pDC && pDC->GetContext() != pContext) {
				TRACE0("Context changed in EmbedStream()!\n");
				pContext = pDC->GetContext();
			}
		}

        wfe_PluginStream(pUrlData, pContext);
        return pStream;
    }

	// if the MIME type isn't registered to a plugin,
	// assume it must be handled by OLE
    pEmbeddedApp = (NPEmbeddedApp*)pUrlData->fe_data;
    if(pEmbeddedApp == NULL) // our OLE support doesn't do full page
        return NULL;

	// Explicitly type it as an embedded OLE object
	pEmbeddedApp->type = NP_OLE;
    pItem = (CNetscapeCntrItem *)pEmbeddedApp->fe_data;
	pItem->m_bIsOleItem = TRUE;

    //  Formulate a file name that will suckle data from the net.
    char *pFormulateName = fe_URLtoLocalName(pItem->m_csAddress, pUrlData ? pUrlData->content_type : NULL);
    char *pLocalName = NULL;
    if(((CNetscapeApp *)AfxGetApp())->m_pTempDir != NULL && pFormulateName != NULL) {
        StrAllocCopy(pLocalName, ((CNetscapeApp *)AfxGetApp())->m_pTempDir);
        StrAllocCat(pLocalName, "\\");
        StrAllocCat(pLocalName, pFormulateName);

        //  If this file exists, then we must attempt another temp file.
        if(-1 != _access(pLocalName, 0))    {
            //  Retain the extension.
            char aExt[_MAX_EXT];
            size_t stExt = 0;
            DWORD dwFlags = 0;
            
#ifdef XP_WIN16
            dwFlags |= EXT_DOT_THREE;
#endif
            aExt[0] = '\0';
            stExt = EXT_Invent(aExt, sizeof(aExt), dwFlags, pUrlData->address, pUrlData->content_type);

            if(pLocalName) {
                XP_FREE(pLocalName);
                pLocalName = NULL;
            }
            pLocalName = WH_TempFileName(xpTemporary, "E", aExt);
        }
    }
    else    {
        //  Retain the extension.
        char aExt[_MAX_EXT];
        size_t stExt = 0;
        DWORD dwFlags = 0;
        
#ifdef XP_WIN16
        dwFlags |= EXT_DOT_THREE;
#endif
        aExt[0] = '\0';
        stExt = EXT_Invent(aExt, sizeof(aExt), dwFlags, pUrlData->address, pUrlData->content_type);

        if(pLocalName) {
            XP_FREE(pLocalName);
            pLocalName = NULL;
        }
        pLocalName = WH_TempFileName(xpTemporary, "E", aExt);
    }

    if(pFormulateName != NULL)  {
        XP_FREE(pFormulateName);
        pFormulateName = NULL;
    }

    //  Correctly extract the extension from the created file name.
    char aExt[_MAX_EXT];
    size_t stExt = 0;
    DWORD dwFlags = EXT_NO_PERIOD;
    
#ifdef XP_WIN16
    dwFlags |= EXT_DOT_THREE;
#endif
    aExt[0] = '\0';
    stExt = EXT_Invent(aExt, sizeof(aExt), dwFlags, pLocalName, pUrlData->content_type);
    CString csFinalExtension = aExt;

    //  Check to see if the embedded file matches any known extensions.
    //  If not, then consider the file of no use to the user.
	//	Use new way if we are in a different style of context.
    if(pEmbeddedApp->type == NP_OLE && pItem->m_isFullPage) {
		//; do nothing for full page OLE.  Because the security dialog already shown on external_viewer_disk_stream.
	}
	else {
		if(wfe_IsExtensionRegistrationValid(csFinalExtension, ABSTRACTCX(pContext)->GetDialogOwner(), TRUE) == FALSE) {
			//  Broken....
			XP_FREE(pLocalName);
			pItem->m_bBroken = TRUE;
			return(NULL);
		}
	}
    //  Open up the file for writing.
    pItem->m_csFileName = pLocalName;
    XP_FREE(pLocalName);

    CFileException cfe;
    if(FALSE == pItem->m_cfOutput.Open(pItem->m_csFileName, CFile::modeCreate | CFile::modeWrite, &cfe))    {
        //  Couldn't open.
        pItem->m_bBroken = TRUE;
        return(NULL);
    }

    //  Create the stream class that will handle the download.
    //  Send the embed along for the download.
    pItem->m_bLoading = TRUE;
    return(NET_NewStream("EmbeddedItemCheeseSpankDior",
        EmbedWrite,
        EmbedComplete,
        EmbedAbort,
        EmbedReady,
        (void *)pUrlData,
        pContext));
}
Exemplo n.º 6
0
/* this is the main converter for saving files
 * it returns the stream object as well
 * as a data object that it can reference 
 * internally to save the state of the document
 */
PUBLIC NET_StreamClass*
view_source_disk_stream(int         format_out,
           void       *lous_new_stuff,
           URL_Struct *URL_s,
           MWContext  * context)
{
    DataObject* me;
    NET_StreamClass* stream;
    FILE * fp = NULL;
    BOOL bPromptUserForName =FALSE;
    BOOL bDeleteFile = TRUE;

    ASSERT(context);

    me = new DataObject;
    if (me == NULL) 
        return NULL;
    memset(me, 0, sizeof(DataObject));
                                                                            
    stream = NET_NewStream("FileWriter", 
                            disk_stream_write,        
                            disk_stream_complete,
                            disk_stream_abort,
                            write_ready,
                            me,
                            context);

    if(stream == NULL) {
        delete me;
        return NULL;
    }
    
    // user selected save to disk
    me->how_handle = HANDLE_EXTERNAL; 

    //
    // Get a filename with an extension cuz stupid old notepad assumes one
    //
    char* fname = WH_TempFileName(xpTemporary, NULL, ".txt");
    if(!fname)
        return(NULL);
    
    //
    // Open the file in text mode so that will get return translation
    // Why in the world are we doing this AnsiToOemBuff stuff???
    //  
#ifdef XP_WIN32
    fp = fopen(fname, "wt");
#else
	char oemBuff[254];
	AnsiToOemBuff(fname, oemBuff, strlen(fname)+1);
    fp = fopen(oemBuff, "wt");
#endif
    if(!fp) {
        XP_FREE(fname);
        return NULL;
    }

    // delete the file when we are done
    FE_DeleteFileOnExit(fname, URL_s->address);

    int len = theApp.m_pHTML.GetLength() + XP_STRLEN(fname) + 10;
    me->command = (char *) XP_ALLOC(len);
    if(!me->command) {
        fclose(fp);
        XP_FREE(fname);
        return NULL;
    }
    
    sprintf(me->command, "%s %s", theApp.m_pHTML, fname);

    me->fp = fp;
    me->address = me->filename = me->format_in = NULL;
    me->context = context;
    me->format_out = format_out;
    me->filename = fname;
    StrAllocCopy(me->address, URL_s->address);
    StrAllocCopy(me->format_in, URL_s->content_type);

    FE_EnableClicking(context);

    if (URL_s->content_length > 0)
        me->content_length = URL_s->content_length;
    else 
        me->content_length = 0;
    
    FE_SetProgressBarPercent(context, 0);
  
    return stream;

}
Exemplo n.º 7
0
NET_StreamClass* 
memory_stream (int     format_out,
           void       *data_object,
           URL_Struct *URL_s,
           MWContext  *context)
{
    DataObject* me;
    NET_StreamClass* stream;

    //
    // If we are a view source stream and the user wants an external view source
    //   application send it there instead
    //
    const char * html = theApp.m_pHTML;
    if((format_out == FO_VIEW_SOURCE) && html && * html)	{
        return (view_source_disk_stream(format_out, data_object, URL_s, context));
	}
	else if(format_out & FO_VIEW_SOURCE)	{
		//	Otherwise, use our colored syntax HTML viewer for view source.
		return(INTL_ConvCharCode(format_out, URL_s->content_type, URL_s, context));
	}

    me = new DataObject;
    if(!me)
        return NULL;
    memset(me, 0, sizeof(DataObject));

    stream = NET_NewStream("MemoryWriter",
                            memory_stream_write,
                            memory_stream_complete,
                            memory_stream_abort,
                            write_ready,
                            me,
                            context);

    if(stream == NULL) {
		delete me;
		return NULL;
	}

    me->context = context;
    me->address = me->filename = me->format_in = NULL;
    me->format_out = format_out;
    StrAllocCopy(me->address, URL_s->address);
    StrAllocCopy(me->format_in, URL_s->content_type);

    /* set up the buffer fields */
    me->sz = DEFAULT_BUFFER_SZ;
    me->start = me->loc = (char *)XP_ALLOC(sizeof(char) * me->sz);

    if(!me->start) {
        delete me;
        XP_FREE(stream);
        return NULL;
    }

    if (URL_s->content_length > 0)
        me->content_length = URL_s->content_length;
    else 
        me->content_length = 0;

    me->cur_loc =0;    
    FE_SetProgressBarPercent(context, 0);

    return stream;
}
Exemplo n.º 8
0
/* this is the main converter for external viewers.
 * it returns the stream object as well
 * as a data object that it can reference 
 * internally to save the state of the document
 */
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);
}
Exemplo n.º 9
0
static NET_StreamClass *
ExternalFileSave(int iFormatOut, URL_Struct *pUrl, MWContext *pContext)
{
	//
	// While we have a pointer to the original frame window query
	//   for a filename
	//
	char 			*pDestination;
	char 			*pSuggested = NULL;
	NET_StreamClass *pRetval = NULL;

	//	Prompt the user for a file name.
	//  Security rist to let path information in externally provided
	//      filename (content disposition, filename =)
	if (pUrl->content_name != NULL &&
		strstr(pUrl->content_name, "../") == NULL &&
		strstr(pUrl->content_name, "..\\") == NULL) {
		// Make a copy of the name, because that's what fe_URLtoLocalName() does
		// and the code below is going to XP_FREE pSuggested
		pSuggested = XP_STRDUP(pUrl->content_name);
	}
	if (!pSuggested)
		pSuggested = fe_URLtoLocalName(pUrl->address, pUrl->content_type);
#ifdef XP_WIN16
	char dosName[13];
	FE_LongNameToDosName(dosName, pSuggested);
	pDestination = wfe_GetSaveFileName(GetFrame(pContext)->GetFrameWnd()->m_hWnd, szLoadString(IDS_SAVE_AS), dosName, NULL);
#else
	pDestination = wfe_GetSaveFileName(GetFrame(pContext)->GetFrameWnd()->m_hWnd, szLoadString(IDS_SAVE_AS), pSuggested, NULL);
#endif
	if(pSuggested != NULL)	{
		XP_FREE(pSuggested);
	}
	if(pDestination == NULL)	{
		return(NULL);
	}

	//	We're going to be saving this stream.
	//	Check to see if we should attempt to save the file in the
	//		old fashion, or in the new external contexts.
	if(NET_IsSafeForNewContext(pUrl) != FALSE)	{
		//	Attempt to split it off into a new context.
		pRetval = CSaveCX::SaveUrlObject(pUrl, NULL, pDestination);

	} else {
		//	We need to continue to use the old method of saving.

		//	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 = HANDLE_SAVE;
		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);

		//	Progress.
		FE_SetProgressBarPercent(pContext, 0);

		//	Set the waiting mode???
		FE_EnableClicking(pContext);

		//	Create the stream.
		pRetval = NET_NewStream("ServeAndSave",
								disk_stream_write,
								disk_stream_complete,
								disk_stream_abort,
								write_ready,
								pMe,
								pContext);

		if(!pRetval)
			return(NULL);
	}

	return pRetval;
}