1998-03-28 05:44:41 +03:00
|
|
|
/* -*- 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.
|
|
|
|
*/
|
|
|
|
// cxsave.h : header file
|
|
|
|
//
|
|
|
|
|
|
|
|
#include "cxstubs.h"
|
|
|
|
#include "widgetry.h"
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// CSaveCX dialog
|
|
|
|
|
|
|
|
class CSaveCX : public CDialog, public CStubsCX
|
|
|
|
{
|
|
|
|
// Construction
|
|
|
|
private:
|
|
|
|
char* GetMailNewsTempFileName(char* pTempPath, char *pFileName = NULL);
|
|
|
|
BOOL CanCreate(URL_Struct * pUrl = NULL); // Can we proceed with creation? Used by SaveObject.
|
|
|
|
BOOL Creator();
|
|
|
|
public:
|
|
|
|
CSaveCX(const char *pAnchor, const char *pViewer = NULL, CWnd *pParent = NULL); // For external viewing or saving
|
|
|
|
~CSaveCX();
|
|
|
|
|
|
|
|
// Indirect Construction
|
|
|
|
private:
|
|
|
|
void DoCreate() {
|
|
|
|
// Set dimensions of progress
|
|
|
|
m_crBounds = CRect(5, 50, 5 + 175, 50 + 15);
|
|
|
|
MapDialogRect(m_crBounds);
|
|
|
|
m_crBounds.InflateRect(-1, -1); // Shrink for border.
|
|
|
|
}
|
1998-06-23 01:19:46 +04:00
|
|
|
// Helper function to figure out correct file extension
|
|
|
|
#ifdef MOZ_MAIL_NEWS
|
|
|
|
void AddFileExtension(char *& pFileName);
|
|
|
|
#endif
|
1998-03-28 05:44:41 +03:00
|
|
|
public:
|
|
|
|
static BOOL SaveAnchorObject(const char *pAnchor, History_entry *pHist, int16 iCSID = 0, CWnd *pParent = NULL, char * pFileName = NULL);
|
|
|
|
static BOOL SaveAnchorAsText(const char *pAnchor, History_entry *pHist, CWnd *pParent, char *pFileName);
|
|
|
|
static NET_StreamClass *SaveUrlObject(URL_Struct *pUrl, CWnd *pParent = NULL, char * pFileName = NULL);
|
|
|
|
static NET_StreamClass *ViewUrlObject(URL_Struct *pUrl, const char *pViewer, CWnd *pParent = NULL);
|
|
|
|
static NET_StreamClass *OleStreamObject(NET_StreamClass *pOleStream, URL_Struct *pUrl, const char *pViewer, CWnd *pParent = NULL);
|
|
|
|
static BOOL SaveToGlobal(HGLOBAL *phGlobal, LPCSTR lpszUrl, LPCSTR lpszTitle); // Returns context id
|
1998-06-23 01:19:46 +04:00
|
|
|
#ifdef MOZ_MAIL_NEWS
|
|
|
|
static BOOL SaveToFile(CFile *pFile, LPCSTR lpszUrl, LPCSTR lpszTitle);
|
|
|
|
#endif
|
1998-03-28 05:44:41 +03:00
|
|
|
|
|
|
|
// What we're saving
|
|
|
|
private:
|
|
|
|
CProgressMeter m_ProgressMeter;
|
|
|
|
History_entry * m_pHist;
|
|
|
|
|
|
|
|
CString m_csAnchor; // The anchor to load
|
|
|
|
CString m_csViewer; // The viewer to spawn, if specified, file will be removed on exit and
|
|
|
|
// the user is not prompted for a file name in which to save.
|
|
|
|
|
|
|
|
int m_iFileType; // The format of the file (needed for text front end when saving basically....)
|
|
|
|
CString m_csFileName; // The file to save it in
|
|
|
|
|
|
|
|
CWnd *m_pParent; // Our parent (need for possible file dialogs).
|
|
|
|
NET_StreamClass *m_pSecondaryStream; // A secondary stream, sometimes we chain together streams.
|
|
|
|
long tFirstTime;
|
|
|
|
long tLastTime;
|
|
|
|
long tLastBarTime;
|
|
|
|
int iLastPercent;
|
|
|
|
|
|
|
|
// Wether or not we were interrupted (cleanup even more).
|
|
|
|
public:
|
|
|
|
URL_Struct *m_pUrl; // The URL_Struct as known by the netlib
|
|
|
|
BOOL m_bInterrupted;
|
|
|
|
BOOL m_bAborted;
|
|
|
|
BOOL m_bSavingToGlobal;
|
|
|
|
int16 m_iCSID; //WinCX pass default character set information here
|
|
|
|
|
|
|
|
// A way to manually set the URL we're handling without having
|
|
|
|
// the dialog create one.
|
|
|
|
// Also a way to manually set the secondary stream for the URL that
|
|
|
|
// we're handling.
|
|
|
|
public:
|
|
|
|
void SetUrl(URL_Struct *pUrl) {
|
|
|
|
ASSERT(m_pUrl == NULL);
|
|
|
|
m_pUrl = pUrl;
|
|
|
|
}
|
|
|
|
void SetSecondaryStream(NET_StreamClass *pSecondaryStream) {
|
|
|
|
ASSERT(m_pSecondaryStream == NULL);
|
|
|
|
ASSERT(m_pSink == NULL); // Secondary streams require no sink.
|
|
|
|
ASSERT(!m_csViewer.IsEmpty() || m_bSavingToGlobal);
|
|
|
|
pSecondaryStream->window_id = GetContext();
|
|
|
|
m_pSecondaryStream = pSecondaryStream;
|
|
|
|
}
|
|
|
|
NET_StreamClass *GetSecondaryStream() const {
|
|
|
|
return(m_pSecondaryStream);
|
|
|
|
}
|
|
|
|
void ClearSecondary() {
|
|
|
|
m_pSecondaryStream = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Informational
|
|
|
|
public:
|
|
|
|
BOOL IsSaving() const {
|
|
|
|
return(m_csViewer.IsEmpty());
|
|
|
|
}
|
|
|
|
BOOL IsViewing() const {
|
|
|
|
return(IsSaving() == FALSE ? TRUE : FALSE);
|
|
|
|
}
|
|
|
|
BOOL IsShellExecute() const {
|
|
|
|
return(m_csViewer == "ShellExecute");
|
|
|
|
}
|
|
|
|
BOOL IsSavingToGlobal() const {
|
|
|
|
return m_bSavingToGlobal;
|
|
|
|
}
|
|
|
|
CString GetFileName() const {
|
|
|
|
return(m_csFileName);
|
|
|
|
}
|
|
|
|
CString GetAnchor() const {
|
|
|
|
return(m_csAnchor);
|
|
|
|
}
|
|
|
|
CString GetViewer() const;
|
|
|
|
|
|
|
|
// For dialogs
|
|
|
|
public:
|
|
|
|
virtual CWnd *GetDialogOwner() const;
|
|
|
|
|
|
|
|
// Serialization information
|
|
|
|
private:
|
|
|
|
CStdioFile *m_pSink;
|
|
|
|
public:
|
|
|
|
void SetSink(CStdioFile *pSink) {
|
|
|
|
ASSERT(m_pSecondaryStream == NULL); // Sinks require no secondary stream.
|
|
|
|
m_pSink = pSink;
|
|
|
|
}
|
|
|
|
CStdioFile *GetSink() const {
|
|
|
|
return(m_pSink);
|
|
|
|
}
|
|
|
|
void ClearSink() {
|
|
|
|
m_pSink = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Progress Information, manipulated by GraphProgress
|
|
|
|
private:
|
|
|
|
void Progress(int32 lPercent); // Draw progress bar
|
|
|
|
int32 m_lOldPercent; // Old percentage to optimize drawing in OnPaint.
|
|
|
|
CRect m_crBounds; // Bounds of dialog progress bar.
|
|
|
|
|
|
|
|
// Context Overrides
|
|
|
|
public:
|
|
|
|
// The URL exit routine.
|
|
|
|
virtual void GetUrlExitRoutine(URL_Struct *pUrl, int iStatus, MWContext *pContext);
|
|
|
|
// The text translation exit routine.
|
|
|
|
virtual void TextTranslationExitRoutine(PrintSetup *pTextFE);
|
|
|
|
// All Connections are done.
|
|
|
|
virtual void AllConnectionsComplete(MWContext *pContext);
|
|
|
|
// Textual progress information.
|
|
|
|
virtual void Progress(MWContext *pContext, const char *pMessage);
|
|
|
|
// Progress bar function.
|
|
|
|
virtual void SetProgressBarPercent(MWContext *pContext, int32 lPercent);
|
|
|
|
// Graph progression.
|
|
|
|
virtual void GraphProgress(MWContext *pContext, URL_Struct *pURL, int32 lBytesReceived, int32 lBytesSinceLastTime, int32 lContentLength);
|
|
|
|
|
|
|
|
// Dialog Data
|
|
|
|
//{{AFX_DATA(CSaveCX)
|
|
|
|
enum { IDD = IDD_CONTEXT_SAVE };
|
|
|
|
CString m_csAction;
|
|
|
|
CString m_csDestination;
|
|
|
|
CString m_csLocation;
|
|
|
|
CString m_csProgress;
|
|
|
|
CString m_csTimeLeft;
|
|
|
|
CString m_csPercentComplete;
|
|
|
|
//}}AFX_DATA
|
|
|
|
|
|
|
|
|
|
|
|
// Overrides
|
|
|
|
// ClassWizard generated virtual function overrides
|
|
|
|
//{{AFX_VIRTUAL(CSaveCX)
|
|
|
|
protected:
|
|
|
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
|
|
|
|
//}}AFX_VIRTUAL
|
|
|
|
|
|
|
|
// Implementation
|
|
|
|
protected:
|
|
|
|
|
|
|
|
// Generated message map functions
|
|
|
|
//{{AFX_MSG(CSaveCX)
|
|
|
|
virtual void OnCancel();
|
|
|
|
afx_msg void OnPaint();
|
|
|
|
afx_msg HCURSOR OnQueryDragIcon();
|
|
|
|
afx_msg void OnSize(UINT nType, int cx, int cy);
|
|
|
|
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
|
|
|
|
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
|
|
|
|
virtual BOOL OnInitDialog();
|
|
|
|
//}}AFX_MSG
|
|
|
|
DECLARE_MESSAGE_MAP()
|
|
|
|
};
|
|
|
|
|
|
|
|
extern "C" {
|
|
|
|
// Netlib API to the stream that will save the file to disk.
|
|
|
|
NET_StreamClass *ContextSaveStream(int iFormatOut, void *pDataObj, URL_Struct *pUrl, MWContext *pContext);
|
|
|
|
|
|
|
|
unsigned int ContextSaveReady(NET_StreamClass *stream);
|
|
|
|
int ContextSaveWrite(NET_StreamClass *stream, const char *pWriteData, int32 iDataLength);
|
|
|
|
void ContextSaveComplete(NET_StreamClass *stream);
|
|
|
|
void ContextSaveAbort(NET_StreamClass *stream, int iStatus);
|
|
|
|
};
|