NOT PART OF BUILD. Implemented NPN_Status. Added some more diagnostic debug info including hex dumping stream data to validate it's correct. Added code to support plugins that want their streams in NP_ASFILEONLY or NP_ASFILE mode (e.g. IBM's arcane Advanced Function Presentation viewer plugin). a=blizzard@mozilla.org

git-svn-id: svn://10.0.0.236/trunk@104584 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
locka%iol.ie 2001-10-04 13:09:49 +00:00
parent eae2d3eab8
commit b16bcfe88a
4 changed files with 164 additions and 8 deletions

View File

@ -179,7 +179,18 @@ NPN_Status(NPP npp, const char *message)
{
return;
}
// TODO status message
nsPluginHostCtrl *pCtrl = (nsPluginHostCtrl *) npp->ndata;
ATLASSERT(pCtrl);
// Update the status bar in the browser
CComPtr<IWebBrowserApp> cpBrowser;
pCtrl->GetWebBrowserApp(&cpBrowser);
if (cpBrowser)
{
USES_CONVERSION;
cpBrowser->put_StatusText(A2OLE(message));
}
}

View File

@ -51,7 +51,11 @@ nsURLDataCallback::nsURLDataCallback() :
m_szURL(NULL),
m_nDataPos(0),
m_nDataMax(0),
m_hPostData(NULL)
m_hPostData(NULL),
m_bSaveToTempFile(FALSE),
m_bNotifyOnWrite(TRUE),
m_szTempFileName(NULL),
m_pTempFile(NULL)
{
memset(&m_NPStream, 0, sizeof(m_NPStream));
m_NPStream.ndata = this;
@ -62,6 +66,15 @@ nsURLDataCallback::~nsURLDataCallback()
SetPostData(NULL, 0);
SetURL(NULL);
SetContentType(NULL);
if (m_pTempFile)
{
fclose(m_pTempFile);
remove(m_szTempFileName);
}
if (m_szTempFileName)
{
free(m_szTempFileName);
}
}
void nsURLDataCallback::SetPostData(const void *pData, unsigned long nSize)
@ -168,6 +181,27 @@ LRESULT nsURLDataCallback::OnNPPNewStream(UINT uMsg, WPARAM wParam, LPARAM lPara
pNewStreamData->stream,
pNewStreamData->seekable,
pNewStreamData->stype);
// How does the plugin want its data?
switch (*(pNewStreamData->stype))
{
case NP_NORMAL:
m_bSaveToTempFile = FALSE;
m_bNotifyOnWrite = TRUE;
break;
case NP_ASFILEONLY:
m_bNotifyOnWrite = FALSE;
m_bSaveToTempFile = TRUE;
break;
case NP_ASFILE:
m_bNotifyOnWrite = TRUE;
m_bSaveToTempFile = TRUE;
break;
case NP_SEEK:
// TODO!!!
ATLASSERT(0);
break;
}
}
return 0;
}
@ -176,6 +210,49 @@ LRESULT nsURLDataCallback::OnNPPDestroyStream(UINT uMsg, WPARAM wParam, LPARAM l
{
_DestroyStreamData *pDestroyStreamData = (_DestroyStreamData *) lParam;
// Tell the plugin the name of the temporary file containing the data
if (m_bSaveToTempFile)
{
// Close the file
if (m_pTempFile)
{
fclose(m_pTempFile);
}
// Determine whether the plugin should be told the name of the temp
// file depending on whether it completed properly or not.
char *szTempFileName = NULL;
if (pDestroyStreamData->reason == NPRES_DONE &&
m_pTempFile)
{
szTempFileName = m_szTempFileName;
}
// Notify the plugin
if (m_pOwner->m_NPPFuncs.asfile)
{
m_pOwner->m_NPPFuncs.asfile(
pDestroyStreamData->npp,
pDestroyStreamData->stream,
szTempFileName);
}
// Remove the file if it wasn't passed into the plugin
if (!szTempFileName ||
!m_pOwner->m_NPPFuncs.asfile)
{
remove(szTempFileName);
}
// Cleanup strings & pointers
if (m_szTempFileName)
{
free(m_szTempFileName);
m_szTempFileName = NULL;
}
m_pTempFile = NULL;
}
// Notify the plugin that the stream has been closed
if (m_pOwner->m_NPPFuncs.destroystream)
{
@ -184,6 +261,7 @@ LRESULT nsURLDataCallback::OnNPPDestroyStream(UINT uMsg, WPARAM wParam, LPARAM l
pDestroyStreamData->stream,
pDestroyStreamData->reason);
}
return 0;
}
@ -206,7 +284,8 @@ LRESULT nsURLDataCallback::OnNPPURLNotify(UINT uMsg, WPARAM wParam, LPARAM lPara
LRESULT nsURLDataCallback::OnNPPWriteReady(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
_WriteReadyData *pWriteReadyData = (_WriteReadyData *) lParam;
if (m_pOwner->m_NPPFuncs.writeready)
if (m_pOwner->m_NPPFuncs.writeready &&
m_bNotifyOnWrite)
{
pWriteReadyData->result = m_pOwner->m_NPPFuncs.writeready(
pWriteReadyData->npp,
@ -219,14 +298,70 @@ LRESULT nsURLDataCallback::OnNPPWriteReady(UINT uMsg, WPARAM wParam, LPARAM lPar
LRESULT nsURLDataCallback::OnNPPWrite(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
_WriteData *pWriteData = (_WriteData *) lParam;
if (m_pOwner->m_NPPFuncs.write)
#ifdef DUMP_STREAM_DATA_AS_HEX
// Dumps out the data to the display so you can see it's correct as its
// fed into the plugin.
const int kLineBreakAfter = 16;
const int kSpaceBreakAfter = 8;
ATLTRACE(_T("nsURLDataCallback::OnNPPWrite()\n"));
for (int i = 0; i < pWriteData->len; i++)
{
m_pOwner->m_NPPFuncs.write(
TCHAR szLine[100];
TCHAR szTmp[20];
if (i % kLineBreakAfter == 0)
{
_stprintf(szLine, _T("%04x "), i);
}
unsigned char b = ((unsigned char *) pWriteData->buffer)[i];
_stprintf(szTmp, _T("%02X "), (unsigned int) b);
_tcscat(szLine, szTmp);
if (i == pWriteData->len - 1 ||
i % kLineBreakAfter == kLineBreakAfter - 1)
{
_tcscat(szLine, _T("\n"));
ATLTRACE(szLine);
}
else if (i % kSpaceBreakAfter == kSpaceBreakAfter - 1)
{
_tcscat(szLine, _T(" "));
}
}
ATLTRACE(_T("--\n"));
#endif
if (m_bSaveToTempFile)
{
if (!m_szTempFileName)
{
m_szTempFileName = strdup(_tempnam(NULL, "moz"));
}
if (!m_pTempFile)
{
m_pTempFile = fopen(m_szTempFileName, "wb");
}
ATLASSERT(m_pTempFile);
if (m_pTempFile)
{
fwrite(pWriteData->buffer, 1, pWriteData->len, m_pTempFile);
}
}
if (m_pOwner->m_NPPFuncs.write &&
m_bNotifyOnWrite)
{
int32 nConsumed = m_pOwner->m_NPPFuncs.write(
pWriteData->npp,
pWriteData->stream,
pWriteData->offset,
pWriteData->len,
pWriteData->buffer);
if (nConsumed < 0)
{
// TODO destroy the stream!
}
ATLASSERT(nConsumed == pWriteData->len);
}
return 0;
}
@ -261,6 +396,7 @@ HRESULT STDMETHODCALLTYPE nsURLDataCallback::OnStartBinding(
/* [in] */ DWORD dwReserved,
/* [in] */ IBinding __RPC_FAR *pib)
{
ATLTRACE(_T("nsURLDataCallback::OnStartBinding()\n"));
m_cpBinding = pib;
return S_OK;
}
@ -309,6 +445,7 @@ HRESULT STDMETHODCALLTYPE nsURLDataCallback::OnStopBinding(
/* [in] */ HRESULT hresult,
/* [unique][in] */ LPCWSTR szError)
{
ATLTRACE(_T("nsURLDataCallback::OnStopBinding()\n"));
if (m_pOwner && m_pOwner->m_bPluginIsAlive)
{
// TODO check for aborted ops and send NPRES_USER_BREAK
@ -368,6 +505,7 @@ HRESULT STDMETHODCALLTYPE nsURLDataCallback::OnStopBinding(
/* [in] */ FORMATETC __RPC_FAR *pformatetc,
/* [in] */ STGMEDIUM __RPC_FAR *pstgmed)
{
ATLTRACE(_T("nsURLDataCallback::OnDataAvailable()\n"));
if (pstgmed->tymed != TYMED_ISTREAM ||
!pstgmed->pstm)
{

View File

@ -37,6 +37,8 @@
#include "resource.h" // main symbols
#include <stdio.h>
#include "npapi.h"
class nsPluginHostCtrl;
@ -143,6 +145,11 @@ protected:
char *m_szContentType;
char *m_szURL;
BOOL m_bSaveToTempFile;
BOOL m_bNotifyOnWrite;
FILE *m_pTempFile;
char *m_szTempFileName;
CComPtr<IBinding> m_cpBinding;
void SetURL(const char *szURL)

View File

@ -44,7 +44,7 @@ RSC=rc.exe
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /ZI /Od /I "pluginsdk_include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX- /ZI /Od /I "pluginsdk_include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c
# ADD BASE RSC /l 0x1809 /d "_DEBUG"
# ADD RSC /l 0x1809 /d "_DEBUG"
BSC32=bscmake.exe
@ -79,7 +79,7 @@ SOURCE="$(InputPath)"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_DLL" /D "_ATL_MIN_CRT" /Yu"stdafx.h" /FD /c
# ADD CPP /nologo /MT /W3 /O1 /I "pluginsdk_include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_MIN_CRT" /D "_ATL_DLL" /Yu"stdafx.h" /FD /c
# ADD CPP /nologo /MT /W3 /GX- /O1 /I "pluginsdk_include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_MIN_CRT" /D "_ATL_DLL" /Yu"stdafx.h" /FD /c
# ADD BASE RSC /l 0x1809 /d "NDEBUG"
# ADD RSC /l 0x1809 /d "NDEBUG"
BSC32=bscmake.exe
@ -114,7 +114,7 @@ SOURCE="$(InputPath)"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_STATIC_REGISTRY" /D "_ATL_MIN_CRT" /Yu"stdafx.h" /FD /c
# ADD CPP /nologo /MT /W3 /O1 /I "pluginsdk_include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_STATIC_REGISTRY" /D "_ATL_MIN_CRT" /Yu"stdafx.h" /FD /c
# ADD CPP /nologo /MT /W3 /GX- /O1 /I "pluginsdk_include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_STATIC_REGISTRY" /D "_ATL_MIN_CRT" /Yu"stdafx.h" /FD /c
# ADD BASE RSC /l 0x1809 /d "NDEBUG"
# ADD RSC /l 0x1809 /d "NDEBUG"
BSC32=bscmake.exe