RetroZilla/modules/plugin/tools/tester/common/plugbase.cpp
2015-10-20 23:03:22 -04:00

401 lines
11 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "xp.h"
#include "plugbase.h"
#include "logger.h"
#include "scripter.h"
extern CLogger * pLogger;
static char szINIFile[] = NPAPI_INI_FILE_NAME;
#ifdef XP_UNIX
static char szTarget[] = LOGGER_DEFAULT_TARGET;
#endif
CPluginBase::CPluginBase(NPP pNPInstance, WORD wMode) :
m_pNPInstance(pNPInstance),
m_wMode(wMode),
m_pStream(NULL),
m_pScriptStream(NULL),
m_bWaitingForScriptStream(FALSE),
m_pNPNAlloced(NULL),
m_pValue(NULL)
{
assert(m_pNPInstance != NULL);
m_szScriptCacheFile[0] = '\0';
if(m_wMode == NP_FULL)
{
// next should be NPP_NewStream with the script to perform
// so we set a flag for a special stream treatment
m_bWaitingForScriptStream = TRUE;
}
}
CPluginBase::~CPluginBase()
{
if(m_pStream != NULL)
{
NPN_DestroyStream(m_pNPInstance, m_pStream, NPRES_DONE);
m_pStream = NULL;
}
if(m_pScriptStream != NULL)
{
NPN_DestroyStream(m_pNPInstance, m_pScriptStream, NPRES_DONE);
m_pScriptStream = NULL;
}
if(m_pNPNAlloced != NULL)
{
NPN_MemFree(m_pNPNAlloced);
m_pNPNAlloced = NULL;
}
}
BOOL CPluginBase::initFull(DWORD dwInitData)
{
pLogger->setLogToFrameFlag(FALSE);
pLogger->setLogToFileFlag(FALSE);
pLogger->clearLog();
return TRUE;
}
void CPluginBase::shutFull()
{
}
BOOL CPluginBase::init(DWORD dwInitData)
{
if(m_wMode == NP_EMBED)
return initEmbed(dwInitData);
else
return initFull(dwInitData);
}
void CPluginBase::shut()
{
if(m_wMode == NP_EMBED)
shutEmbed();
else
shutFull();
}
void CPluginBase::getLogFileName(LPSTR szLogFileName, int iSize)
{
char szFileName[_MAX_PATH];
getModulePath(szFileName, sizeof(szFileName));
strcat(szFileName, szINIFile);
XP_GetPrivateProfileString(SECTION_LOG, KEY_FILE_NAME, "", szLogFileName, (DWORD)iSize, szFileName);
if(!*szLogFileName)
{
strcpy(szLogFileName, m_szScriptCacheFile);
// last three chars MUST be pts
int iLength = strlen(szLogFileName);
szLogFileName[iLength - 3] = 'l';
szLogFileName[iLength - 2] = 'o';
szLogFileName[iLength - 1] = 'g';
}
}
const NPP CPluginBase::getNPInstance()
{
return m_pNPInstance;
}
const WORD CPluginBase::getMode()
{
return m_wMode;
}
const NPStream * CPluginBase::getNPStream()
{
return m_pStream;
}
void CPluginBase::onNPP_NewStream(NPP pInstance, LPSTR szMIMEType, NPStream * pStream, NPBool bSeekable, uint16 * puType)
{
if(!m_bWaitingForScriptStream)
return;
m_pScriptStream = pStream;
*puType = NP_ASFILEONLY;
m_bWaitingForScriptStream = FALSE;
}
void CPluginBase::onNPP_StreamAsFile(NPP pInstance, NPStream * pStream, const char * szFileName)
{
if((m_pScriptStream == NULL) || (pStream != m_pScriptStream) || (szFileName == NULL))
return;
strcpy(m_szScriptCacheFile, szFileName);
#ifdef DEBUG
fprintf(stderr,"CPluginBase::onNPP_StreamAsFile(), Script Cache File \"%s\"", m_szScriptCacheFile);
#endif
}
void CPluginBase::onNPP_DestroyStream(NPStream * pStream)
{
// if this is a stream created by tester, reflect the fact it is destroyed
if(pStream == m_pStream)
m_pStream = NULL;
// if this is a script stream, reflect the fact it is destroyed too, and execute the script
if(pStream == m_pScriptStream)
{
m_pScriptStream = NULL;
if(!XP_IsFile(m_szScriptCacheFile))
return;
CScripter * pScripter = new CScripter();
pScripter->associate(this);
if(pScripter->createScriptFromFile(m_szScriptCacheFile))
{
char szOutput[128];
char szExecutingScript[] = "Executing script...";
strcpy(szOutput, szExecutingScript);
NPN_Status(m_pNPInstance, szOutput);
int iRepetitions = pScripter->getCycleRepetitions();
int iDelay = pScripter->getCycleDelay();
if(iDelay < 0)
iDelay = 0;
assert(pLogger != NULL);
pLogger->resetStartTime();
pLogger->setLogToFileFlag(TRUE);
pLogger->blockDumpToFile(FALSE);
for(int i = 0; i < iRepetitions; i++)
{
wsprintf(szOutput, "%s %i", szExecutingScript, i);
NPN_Status(m_pNPInstance, szOutput);
pScripter->executeScript();
if(iDelay != 0)
XP_Sleep(iDelay);
}
}
else
NPN_Status(m_pNPInstance, "Cannot create script...");
pLogger->setLogToFileFlag(FALSE);
delete pScripter;
m_szScriptCacheFile[0] = '\0';
NPN_Status(m_pNPInstance, "Script execution complete");
}
}
DWORD CPluginBase::makeNPNCall(NPAPI_Action action, DWORD dw1, DWORD dw2, DWORD dw3,
DWORD dw4, DWORD dw5, DWORD dw6, DWORD dw7)
{
DWORD dwRet = 0L;
DWORD dwTickEnter = XP_GetTickCount();
switch (action)
{
case action_invalid:
assert(0);
break;
case action_npn_version:
{
static int iP_maj = 0;
static int iP_min = 0;
static int iN_maj = 0;
static int iN_min = 0;
if(dw1 == DEFAULT_DWARG_VALUE)
dw1 = (DWORD)&iP_maj;
if(dw2 == DEFAULT_DWARG_VALUE)
dw2 = (DWORD)&iP_min;
if(dw3 == DEFAULT_DWARG_VALUE)
dw3 = (DWORD)&iN_maj;
if(dw4 == DEFAULT_DWARG_VALUE)
dw4 = (DWORD)&iN_min;
NPN_Version((int *)dw1, (int *)dw2, (int *)dw3, (int *)dw4);
break;
}
case action_npn_get_url_notify:
if(dw1 == DEFAULT_DWARG_VALUE)
dw1 = (DWORD)m_pNPInstance;
dwRet = NPN_GetURLNotify((NPP)dw1, (char *)dw2, (char *)dw3, (void *)dw4);
break;
case action_npn_get_url:
if(dw1 == DEFAULT_DWARG_VALUE)
dw1 = (DWORD)m_pNPInstance;
dwRet = NPN_GetURL((NPP)dw1, (char *)dw2, (char *)dw3);
break;
case action_npn_post_url_notify:
if(dw1 == DEFAULT_DWARG_VALUE)
dw1 = (DWORD)m_pNPInstance;
dwRet = NPN_PostURLNotify((NPP)dw1, (char *)dw2, (char *)dw3, (int32)dw4, (char *)dw5,
(BOOL)dw6, (void *)dw7);
break;
case action_npn_post_url:
if(dw1 == DEFAULT_DWARG_VALUE)
dw1 = (DWORD)m_pNPInstance;
dwRet = NPN_PostURL((NPP)dw1, (char *)dw2, (char *)dw3, (int32)dw4, (char *)dw5, (BOOL)dw6);
break;
case action_npn_new_stream:
assert(m_pStream == NULL);
if(dw1 == DEFAULT_DWARG_VALUE)
dw1 = (DWORD)m_pNPInstance;
if(dw4 == DEFAULT_DWARG_VALUE)
dw4 = (DWORD)&m_pStream;
dwRet = NPN_NewStream((NPP)dw1, (char *)dw2, (char *)dw3, (NPStream **)dw4);
break;
case action_npn_destroy_stream:
assert(m_pStream != NULL);
if(dw1 == DEFAULT_DWARG_VALUE)
dw1 = (DWORD)m_pNPInstance;
if(dw2 == DEFAULT_DWARG_VALUE)
dw2 = (DWORD)m_pStream;
dwRet = NPN_DestroyStream((NPP)dw1, (NPStream *)dw2, (NPError)dw3);
m_pStream = NULL;
break;
case action_npn_request_read:
break;
case action_npn_write:
if(dw1 == DEFAULT_DWARG_VALUE)
dw1 = (DWORD)m_pNPInstance;
if(dw2 == DEFAULT_DWARG_VALUE)
dw2 = (DWORD)m_pStream;
dwRet = NPN_Write((NPP)dw1, (NPStream *)dw2, (int32)dw3, (void *)dw4);
break;
case action_npn_status:
if(dw1 == DEFAULT_DWARG_VALUE)
dw1 = (DWORD)m_pNPInstance;
NPN_Status((NPP)dw1, (char *)dw2);
break;
case action_npn_user_agent:
if(dw1 == DEFAULT_DWARG_VALUE)
dw1 = (DWORD)m_pNPInstance;
dwRet = (DWORD)NPN_UserAgent((NPP)dw1);
break;
case action_npn_mem_alloc:
assert(m_pNPNAlloced == NULL);
m_pNPNAlloced = NPN_MemAlloc((int32)dw1);
dwRet = (DWORD)m_pNPNAlloced;
if(m_pNPNAlloced != NULL)
{
for(int i = 0; i < (int)dw1; i++)
*(((BYTE *)m_pNPNAlloced) + i) = 255;
}
break;
case action_npn_mem_free:
assert(m_pNPNAlloced != NULL);
dw1 = (DWORD)m_pNPNAlloced;
NPN_MemFree((void *)dw1);
m_pNPNAlloced = NULL;
break;
case action_npn_mem_flush:
dwRet = (DWORD)NPN_MemFlush((int32)dw1);
break;
case action_npn_reload_plugins:
NPN_ReloadPlugins((NPBool)dw1);
break;
case action_npn_get_java_env:
dwRet = (DWORD)NPN_GetJavaEnv();
break;
case action_npn_get_java_peer:
if(dw1 == DEFAULT_DWARG_VALUE)
dw1 = (DWORD)m_pNPInstance;
dwRet = (DWORD)NPN_GetJavaPeer((NPP)dw1);
break;
case action_npn_get_value:
if(dw1 == DEFAULT_DWARG_VALUE)
dw1 = (DWORD)m_pNPInstance;
if(dw3 == DEFAULT_DWARG_VALUE)
dw3 = (DWORD)m_pValue;
dwRet = (DWORD)NPN_GetValue((NPP)dw1, (NPNVariable)dw2, (void *)dw3);
break;
case action_npn_set_value:
if(dw1 == DEFAULT_DWARG_VALUE)
dw1 = (DWORD)m_pNPInstance;
if(dw3 == DEFAULT_DWARG_VALUE)
dw3 = (DWORD)m_pValue;
// note that Mozilla expects boolean values not as a pointer to BOOL
// but rather as simply null and not null, let's convert
if((dw2 == NPPVpluginWindowBool) ||
(dw2 == NPPVpluginTransparentBool) ||
(dw2 == NPPVpluginKeepLibraryInMemory)) {
dwRet = (DWORD)NPN_SetValue((NPP)dw1, (NPPVariable)dw2, (void *)(*(BOOL *)dw3));
} else
dwRet = (DWORD)NPN_SetValue((NPP)dw1, (NPPVariable)dw2, (void *)dw3);
break;
case action_npn_invalidate_rect:
if(dw1 == DEFAULT_DWARG_VALUE)
dw1 = (DWORD)m_pNPInstance;
NPN_InvalidateRect((NPP)dw1, (NPRect *)dw2);
break;
case action_npn_invalidate_region:
if(dw1 == DEFAULT_DWARG_VALUE)
dw1 = (DWORD)m_pNPInstance;
NPN_InvalidateRegion((NPP)dw1, (NPRegion)dw2);
break;
case action_npn_force_redraw:
if(dw1 == DEFAULT_DWARG_VALUE)
dw1 = (DWORD)m_pNPInstance;
NPN_ForceRedraw((NPP)dw1);
break;
default:
assert(0);
break;
}
DWORD dwTickReturn = XP_GetTickCount();
pLogger->appendToLog(action, dwTickEnter, dwTickReturn, dwRet, dw1, dw2, dw3, dw4, dw5, dw6, dw7);
return dwRet;
}
void CPluginBase::autoStartScriptIfNeeded()
{
}