You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kvirc/src/kvirc/kvs/kvi_kvs_runtimecontext.cpp

207 lines
5.8 KiB

//=============================================================================
//
// File : kvi_kvs_runtimecontext.cpp
// Created on Tue 07 Oct 2003 01:49:40 by Szymon Stefanek
//
// This file is part of the KVIrc IRC client distribution
// Copyright (C) 2003 Szymon Stefanek <pragma at kvirc dot net>
//
// This program is FREE software. You can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your opinion) any later version.
//
// This program is distributed in the HOPE that it will be USEFUL,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, write to the Free Software Foundation,
// Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
//=============================================================================
#define __KVIRC__
#include "kvi_kvs_runtimecontext.h"
#include "kvi_kvs_script.h"
#include "kvi_kvs_kernel.h"
#include "kvi_kvs_report.h"
#include "kvi_console.h"
#include "kvi_kvs_treenode_base.h"
#include "kvi_locale.h"
#include "kvi_app.h"
#include "kvi_kvs_object.h"
KviKvsExtendedRunTimeData::~KviKvsExtendedRunTimeData()
{
if(m_bAutoDelete)
{
if(m_pExtendedScopeVariables) delete m_pExtendedScopeVariables;
if(m_pAliasSwitchList) delete m_pAliasSwitchList;
if(m_pThisObject) delete m_pThisObject;
if(m_pScriptFilePath) delete m_pScriptFilePath;
}
}
KviKvsRunTimeContext::KviKvsRunTimeContext(KviKvsScript * pScript,KviWindow * pWnd,KviKvsVariantList * pParams,KviKvsVariant * pRetVal,KviKvsExtendedRunTimeData * pExtData)
{
m_bError = false;
m_pScript = pScript;
m_pParameterList = pParams;
m_pWindow = pWnd;
m_pLocalVariables = new KviKvsHash();
m_pReturnValue = pRetVal;
m_uRunTimeFlags = 0;
m_pExtendedData = pExtData;
m_pDefaultReportLocation = 0;
}
KviKvsRunTimeContext::~KviKvsRunTimeContext()
{
delete m_pLocalVariables;
}
KviKvsHash * KviKvsRunTimeContext::globalVariables()
{
return KviKvsKernel::instance()->globalVariables();
}
void KviKvsRunTimeContext::enterBlockingSection()
{
// actually a NO-OP
}
bool KviKvsRunTimeContext::leaveBlockingSection()
{
if(g_pApp->closingDown())return false; // application quitting
if(!g_pApp->windowExists(m_pWindow))return false; // window lost
return true;
}
KviKvsVariant * KviKvsRunTimeContext::swapReturnValuePointer(KviKvsVariant * pNewPointer)
{
KviKvsVariant * pAux = m_pReturnValue;
m_pReturnValue = pNewPointer;
return pAux;
}
void KviKvsRunTimeContext::report(bool bError,KviKvsTreeNode * pNode,const TQString &szMsgFmt,kvi_va_list va)
{
TQString szMsg;
KviTQString::vsprintf(szMsg,szMsgFmt,va);
KviPointerList<TQString> * pCodeListing = 0;
KviPointerList<TQString> * pCallStack = 0;
TQString szLocation;
if(pNode)
{
if(pNode->location() && m_pScript)
{
pCodeListing = new KviPointerList<TQString>;
pCodeListing->setAutoDelete(true);
int iLine,iCol;
KviKvsReport::findLineColAndListing(m_pScript->buffer(),pNode->location(),iLine,iCol,pCodeListing);
KviTQString::sprintf(szLocation,__tr2qs("line %d, near character %d"),iLine,iCol);
}
// create the call stack
int iFrame = 0;
pCallStack = new KviPointerList<TQString>;
pCallStack->setAutoDelete(true);
while(pNode && (iFrame < 12))
{
TQString * pString = new TQString();
TQString szTmp;
pNode->contextDescription(szTmp);
KviTQString::sprintf(*pString,"#%d %Q",iFrame,&szTmp);
if(pNode->location())
{
int iLine,iCol;
KviKvsReport::findLineAndCol(m_pScript->buffer(),pNode->location(),iLine,iCol);
TQString tmpi;
KviTQString::sprintf(tmpi," [line %d, near character %d]",iLine,iCol);
*pString += tmpi;
}
pCallStack->append(pString);
iFrame++;
pNode = pNode->parent();
}
if(pNode)
pCallStack->append(new TQString("#12 ..."));
}
TQString szContext = m_pScript ? m_pScript->name() : "kvirc core code";
KviKvsReport rep(bError ? KviKvsReport::RunTimeError : KviKvsReport::RunTimeWarning,szContext,szMsg,szLocation,m_pWindow);
if(pCodeListing)rep.setCodeListing(pCodeListing);
if(pCallStack)rep.setCallStack(pCallStack);
KviKvsReport::report(&rep,m_pWindow);
}
void KviKvsRunTimeContext::error(KviKvsTreeNode * pNode,const TQString &szMsgFmt,...)
{
m_bError = true;
kvi_va_list va;
kvi_va_start_by_reference(va,szMsgFmt);
report(true,pNode,szMsgFmt,va);
kvi_va_end(va);
}
void KviKvsRunTimeContext::warning(KviKvsTreeNode * pNode,const TQString &szMsgFmt,...)
{
kvi_va_list va;
kvi_va_start_by_reference(va,szMsgFmt);
report(false,pNode,szMsgFmt,va);
kvi_va_end(va);
}
void KviKvsRunTimeContext::error(const TQString &szMsgFmt,...)
{
m_bError = true;
kvi_va_list va;
kvi_va_start_by_reference(va,szMsgFmt);
report(true,m_pDefaultReportLocation,szMsgFmt,va);
kvi_va_end(va);
}
void KviKvsRunTimeContext::warning(const TQString &szMsgFmt,...)
{
kvi_va_list va;
kvi_va_start_by_reference(va,szMsgFmt);
report(false,m_pDefaultReportLocation,szMsgFmt,va);
kvi_va_end(va);
}
bool KviKvsRunTimeContext::errorNoIrcContext()
{
error(m_pDefaultReportLocation,__tr2qs("This command can be used only in windows bound to an IRC context"));
return false;
}
bool KviKvsRunTimeContext::warningNoIrcConnection()
{
warning(m_pDefaultReportLocation,__tr2qs("You're not connected to an IRC server"));
return true;
}
bool KviKvsRunTimeContext::warningMissingParameter()
{
warning(m_pDefaultReportLocation,__tr2qs("Missing parameter"));
return true;
}
void KviKvsRunTimeContext::setDefaultReportLocation(KviKvsTreeNode * pNode)
{
m_pDefaultReportLocation = pNode;
}