reman3/Rayman_X/cpa/tempgrp/TSN/Src/lSNinterf.cpp

745 lines
19 KiB
C++

//#################################################################################
//
// BASE CLASS OF YOUR DLL interface
//
//#################################################################################
#include "stdafx.h"
#include "SCR.h"
#include "SND.h"
#include "sndld_s.h" // for SND_pstGetEventGroupLinkTable...
#include "sndld_hy.h" // for SND_fn_czGetProjectTitle...
#include "snddbg.h" // for SND_fn_pstGetSelectedResource && SND_fn_bDoesSupervisaterSelectResource
#include "sndres.h" // for tdstBlockResourceMem type use
#include "acp_base.h" // for CPA_Tooldllb class definition
#include "incITF.h" // for CPA_Tooldllb class definition
#include "SNinterf.hpp"
#include "TSNEvent.h"
#include "SIF.h" // Sound info server..
//#include "Sifloads.h" //for SIF_fn_pstGetSoundInfosDescriptor
#include "x:\cpa\main\inc\_editid.h" //Object type names..
/*
#include "ITF/cpasaveo.hpp" // For TSN_Event&SIF_InfoValue class definition
#include "LST/cpalist.hpp" // for the CPA_List defined in the SIF_InfoType object
#include "ITF/CPAProj.hpp" // for M_GetMainWnd()
//static CList<CPA_DLLBase*,CPA_DLLBase*> g_oListOfInstances; //private internal
#define C_lEDST_Active 1
#define C_lEDST_Inactive 0
*/
// the DLL global definition
tdstDLLIdentity g_stSNDEDITIdentity;
SNDEDIT_Interface* g_poSNDEDITInterface=NULL;
//--------------------------------------------------------------------------------
// CONSTRUCTOR.
// You must put here all your DLL interface definitions.
//--------------------------------------------------------------------------------
SNDEDIT_Interface::SNDEDIT_Interface(void)
{
SetEditorInfo( "Sound", "Frédéric Décréau", "v6.0.0", "","");
// ************************** private internal
m_p_stDLLIdentity = &g_stSNDEDITIdentity;
// Name of your .INI file.
// m_stBaseDLLDefinition.p_cIniName = NULL;
// Does your DLL can output in main game view ?
m_stBaseDLLDefinition.bCanOutputIn3DView = FALSE;
// Does your DLL can be refresh by engine ?
m_stBaseDLLDefinition.bCanBeRefreshedByEngine = FALSE;
m_bEditorEnabled=FALSE;
m_uiTimerId=NULL;
}
SNDEDIT_Interface::~SNDEDIT_Interface(void)
{
POSITION Pos;
TSN_Event *pEvent;
// delete events:
Pos=NULL;
while (pEvent=m_EdiEventList.GetNextElement(Pos)) delete pEvent;
fn_vDestroyResList();
TSN_fn_bDesInitSoundInfos();
}
void SNDEDIT_Interface::fn_vJustAfterRegistered(void)
{
int iTypeNum;
int iNbTypes,iNbInfoTypes;
CString *pa_csTypes;
//*******************************************************
//* Register the CPA_SaveObject types *
//*******************************************************
// Number of CPA_SaveObject types: 1 for sound events + 1 for each info type:
iNbInfoTypes=SIF_fn_iGetSoundInfosCount();
iNbTypes=iNbInfoTypes+1;
pa_csTypes= new CString[iNbTypes];
for (iTypeNum=0;iTypeNum<iNbInfoTypes;iTypeNum++)
pa_csTypes[iTypeNum]=CString("SIF_")+SIF_fn_czGetSoundInfoNameForType(iTypeNum);
pa_csTypes[iNbInfoTypes]=C_szSoundEventTypeName;
fn_vRegisterObjectsType(pa_csTypes, iNbTypes);
delete[] pa_csTypes;
}
void SNDEDIT_Interface::fn_vConstruct(void)
{
ASSERT(g_poSNDEDITInterface==NULL);
g_poSNDEDITInterface=this;
}
void SNDEDIT_Interface::fn_vLevelChanges (void)
{
SCR_tdst_Link_Table *p_stTable;
SCR_tdst_Link_Value *p_stValue;
unsigned int uiPos;
CString csName,csTemp;
SCR_tdst_Anl_Callback *pCallback;
SCR_tdpfn_Anl_Callback pOldSndResM_CB;
SCR_tdpfn_Anl_Callback pOldSndEventM_CB;
static BOOL bFirstLevelChange=TRUE;
if (bFirstLevelChange)
{
// Set the script callback fot the editor event:
SCR_fn_v_RdL0_RegisterCallback("SndEventE",TSN_Event::m_fn_eLoad,SCR_CRC_c_RdL0_ForSection);
bFirstLevelChange=FALSE;
}
else
{
AfxMessageBox(" Sound Editor Error: Second level Change not implemented yet!");
return;
}
// Add a message in the status bar:
M_GetMainWnd()->UpdateStatus("Loading sound data",C_STATUSPANE_INFOS,C_STATUS_NORMAL);
// Save and delete script callbacks on SndResourceM and SndEventM:
pCallback=SCR_fnp_st_RdL0_GetRegisterCallback("SndResourceM",SCR_CRC_c_RdL0_ForSection);
pOldSndResM_CB=pCallback->pfn_eCallback;
pCallback=SCR_fnp_st_RdL0_GetRegisterCallback("SndEventM",SCR_CRC_c_RdL0_ForSection);
pOldSndEventM_CB=pCallback->pfn_eCallback;
SCR_fn_v_RdL0_DeleteRegisterCallback("SndResourceM",SCR_CRC_c_RdL0_ForSection, SCR_CDR_c_RdL0_Match);
SCR_fn_v_RdL0_DeleteRegisterCallback("SndEventM",SCR_CRC_c_RdL0_ForSection, SCR_CDR_c_RdL0_Match);
csName=SND_fn_czGetProjectTitle();
csName+=".sif";
TSN_fn_bInitSoundInfos(csName);
// Scan event groups:
// Get first list element:
uiPos = 0;
p_stTable=SND_pstGetEventGroupLinkTable();
SCR_M_DyAr_GetNextElement(SCR_tdst_Link_Value,uiPos,p_stValue,
SCR_M_st_Link_GetDynamicArray(p_stTable));
while(p_stValue) // p_sValue is NULL at the end of the array
{
if(SCR_M_e_Link_GetState(p_stValue) != SCR_ELS_Link_Initialized) continue;
// Get event group name:
csName=SCR_M_p_sz_Link_GetKey(p_stValue);
// Update status bar:
csTemp.Format("Loading sound bank: %s",csName);
M_GetMainWnd()->UpdateStatus((char*)(LPCTSTR)csTemp,C_STATUSPANE_INFOS,C_STATUS_NORMAL);
csName+=".csb";
SCR_fnp_st_RdL0_AnalyseSection((char*)(LPCTSTR)csName, SCR_CDF_uw_Anl_Normal);
uiPos++;
SCR_M_DyAr_GetNextElement(SCR_tdst_Link_Value,uiPos,p_stValue,
SCR_M_st_Link_GetDynamicArray(SND_pstGetEventGroupLinkTable()));
}
// Reset the script callbacks we deleted:
unsigned char ucOldMemLevel = SCR_fn_uc_Mem_GetCurrentLevel();
SCR_fn_v_Mem_SetCurrentLevel(0);
SCR_fn_v_RdL0_RegisterCallback("SndResourceM",pOldSndResM_CB,SCR_CRC_c_RdL0_ForSection);
SCR_fn_v_RdL0_RegisterCallback("SndEventM",pOldSndEventM_CB,SCR_CRC_c_RdL0_ForSection);
SCR_fn_v_Mem_SetCurrentLevel(ucOldMemLevel);
// Sound load finished:
M_GetMainWnd()->UpdateStatus("",C_STATUSPANE_INFOS,C_STATUS_NORMAL);
};
void SNDEDIT_Interface::fn_vBeforeEngine()
{
if (!m_bEditorEnabled) return;
ASSERT(m_uiTimerId==NULL);
m_uiTimerId=timeSetEvent(10,10,m_fn_vTimerProc,NULL,TIME_ONESHOT);
ASSERT(m_uiTimerId!=NULL);
}
void SNDEDIT_Interface::fn_vBeforeEditor()
{
char szPath[MAX_PATH];
MMRESULT mReturn;
if (!m_bEditorEnabled) return;
ASSERT(m_uiTimerId!=NULL);
mReturn=timeKillEvent(m_uiTimerId);
ASSERT(mReturn==TIMERR_NOERROR);
m_uiTimerId=NULL;
// Record modified resources:
IResource IRes;
LPDISPATCH lpDispatch;
POSITION Pos;
tdstBlockResourceMem* pResM;
if (m_ModifiedResList.IsEmpty()) return;
Pos=NULL;
while (pResM=m_ModifiedResList.GetNextElement(Pos))
{
// Find corresponding resource in editor:
lpDispatch=m_IEditor.FindResFromEditorId(pResM->Id);
if (lpDispatch!=NULL)
{
IRes.AttachDispatch(lpDispatch);
// Change the volume in the editor:
IRes.SetVolume(pResM->ucVolume);
IRes.DetachDispatch();
}
}
// Open the sound project:
GetTempPath(MAX_PATH,szPath);
strcat(szPath,"\\");
strcat(szPath,"TSltemp.tmp");
SCR_fn_v_SvL1_RegisterNotify(szPath,mfn_vNotificationCallback,NULL,SCR_EA_Ntfy_AddOrRebuildSection);
m_ModifiedResList.RemoveAll();
}
void CALLBACK EXPORT SNDEDIT_Interface::m_fn_vTimerProc(
UINT uID, // event ID
UINT nMsg, // Reserved
DWORD dwUser, // user data
DWORD dw1,DWORD dw2 // Reserved
)
{
IResource IRes;
tdstBlockResourceMem* pResM;
long lTemp;
POSITION Pos=NULL;
BOOL bKeyPressed=FALSE;
if (IPT_fn_bIsJustValidated(g_poSNDEDITInterface->m_hSoundResourceVolumeUp)==IPT_C_TRUE)
{
bKeyPressed=TRUE;
lTemp=1;
}
if (IPT_fn_bIsJustValidated(g_poSNDEDITInterface->m_hSoundResourceVolumeDown)==IPT_C_TRUE)
{
bKeyPressed=TRUE;
lTemp=-1;
}
if (IPT_fn_bIsJustValidated(g_poSNDEDITInterface->m_hSoundResourceVolumeUpFast)==IPT_C_TRUE)
{
bKeyPressed=TRUE;
lTemp=10;
}
if (IPT_fn_bIsJustValidated(g_poSNDEDITInterface->m_hSoundResourceVolumeDownFast)==IPT_C_TRUE)
{
bKeyPressed=TRUE;
lTemp=-10;
}
if (!bKeyPressed) goto procend_label;
if (!SND_fn_bDoesSupervisaterSelectResource()) goto procend_label;
pResM=SND_fn_pstGetSelectedResource();
if (pResM==NULL) goto procend_label;
// Compute new volume and check bounds:
lTemp+=(long)pResM->ucVolume;
if ((lTemp<0)||(lTemp>127)) goto procend_label;
// Change the volume in the game:
pResM->ucVolume=(unsigned char)lTemp;
if (g_poSNDEDITInterface->m_ModifiedResList.Find(pResM)==NULL)
g_poSNDEDITInterface->m_ModifiedResList.AddTail(pResM);
procend_label:
//resend the timer:
if (g_poSNDEDITInterface->m_uiTimerId!=NULL)
{
g_poSNDEDITInterface->m_uiTimerId=timeSetEvent(10,10,m_fn_vTimerProc,NULL,TIME_ONESHOT);
ASSERT(g_poSNDEDITInterface->m_uiTimerId!=NULL);
}
}
BOOL SNDEDIT_Interface::fn_bLoadBaseObject(CPA_BaseObject *p_oObject)
{
TSN_Event *pEvent=(TSN_Event *)p_oObject;
return (pEvent->fn_bEngineLoad());
}
BOOL SNDEDIT_Interface::fn_bDefineSubMenu(EDT_SubMenu *_pSubMenu)
{
switch(_pSubMenu->GetSubMenuType())
{
case C_SubMenuEditor:
break;
case C_SubMenuTool: //AddAnEntry args: Owner,Text,Id,_bCheck,_bEnable.
_pSubMenu->AddAnEntry(this,"Enable Sound Mixing",1,m_bEditorEnabled,TRUE);
break;
}
return TRUE;
}
void SNDEDIT_Interface::_OnSubMenuCommand(EDT_SubMenu *_pSubMenu,UINT uiMsgId)
{
char szName[MAX_PATH],szPath[MAX_PATH];
switch (_pSubMenu->GetSubMenuType())
{
case C_SubMenuEditor:
break;
case C_SubMenuTool:
switch (uiMsgId)
{
case 1:
//***********************************************
//* Initialize sound editor *
//***********************************************
// OLE DLL initailisation:
if (!AfxOleInit())
{
AfxMessageBox("OLE Init failed. Check the OLE DLL versions.");
return;
}
// Sound editor int:
if (!m_IEditor.CreateDispatch(_T("SoundEditor.Document")))
{
AfxMessageBox("Could not load the sound editor");
return;
}
// Open the sound project:
strcpy(szName,SND_fn_czGetProjectTitle());
strcat(szName,".lcb");
SND_fn_vResolveFileName(szName,szPath);
SND_fn_bGetCurrentDirectory(szName,MAX_PATH);
strcat(szName,"\\");
strcat(szName,szPath);
if (!m_IEditor.OpenDocument(szName))
{
AfxMessageBox("Could not open the sound project");
return;
}
// *** Init Sound resource mixing keys //
m_hSoundResourceVolumeUp = IPT_fn_hGetEntryActionHandle("SndResVolumeUp");
m_hSoundResourceVolumeDown= IPT_fn_hGetEntryActionHandle("SndResVolumeDown");
m_hSoundResourceVolumeUpFast= IPT_fn_hGetEntryActionHandle("SndResVolumeUpFast");
m_hSoundResourceVolumeDownFast= IPT_fn_hGetEntryActionHandle("SndResVolumeDownFast");
if (m_hSoundResourceVolumeUp==NULL) return;
if (m_hSoundResourceVolumeDown==NULL) return;
if (m_hSoundResourceVolumeUpFast==NULL) return;
if (m_hSoundResourceVolumeDownFast==NULL) return;
fn_vFillResList();
SND_fn_vSetResNameCallback(fn_czGetResNameFromEdId);
m_bEditorEnabled=TRUE;
break;
}
break;
}
}
void SNDEDIT_Interface::mfn_vNotificationCallback(SCR_tdst_File_Description *_p_stFile, char *_p_szSectionName, void *_pvData, SCR_tde_Ntfy_Action _eAction)
{
char szName[MAX_PATH],szPath[MAX_PATH];
switch (_eAction)
{
case SCR_EA_Ntfy_AddSection:
case SCR_EA_Ntfy_ModifySection:
case SCR_EA_Ntfy_RebuildSection:
case SCR_EA_Ntfy_AddOrModifySection:
case SCR_EA_Ntfy_AddOrRebuildSection:
strcpy(szName,SND_fn_czGetProjectTitle());
strcat(szName,".lcb");
SND_fn_vResolveFileName(szName,szPath);
SND_fn_bGetCurrentDirectory(szName,MAX_PATH);
strcat(szName,"\\");
strcat(szName,szPath);
g_poSNDEDITInterface->m_IEditor.SaveDocument(szName);
break;
case SCR_EA_Ntfy_DeleteIfExists:
case SCR_EA_Ntfy_DeleteSection:
case SCR_EA_Ntfy_Dummy:
break;
}
}
/* OLD FUNCTIONS:
BOOL SNDEDIT_Interface::fn_bDefineSubMenu(EDT_SubMenu *_pSubMenu)
{
switch(_pSubMenu->GetSubMenuType())
{
case C_SubMenuEditor:
if (!fn_bIsCurrentEditor())
_pSubMenu->AddAnEntry(this, "Sound Editor", C_uiOpenID, FALSE);
else
_pSubMenu->AddAnEntry(this, "Sound Editor", C_uiCloseID, TRUE);
break;
case C_SubMenuTool:
if (fn_bIsCurrentEditor())
{
_pSubMenu->AddAnEntry(this,"Save sound data",1,FALSE);
_pSubMenu->AddAnEntry(this,"Dump sound events in map",2,FALSE);
_pSubMenu->AddAnEntry(this,"Check sample<->resource coherence",3,FALSE);
_pSubMenu->AddAnEntry(this,"Load all sound banks",4,FALSE);
}
break;
}
return TRUE;
}
void SNDEDIT_Interface::_OnSubMenuCommand(EDT_SubMenu *_pSubMenu,UINT uiMsgId)
{
CString csDataPath;
CString csLCBName,csSITName;
POSITION Pos;
SND_EventGroup *pGroup;
switch (_pSubMenu->GetSubMenuType())
{
case C_SubMenuEditor:
switch (uiMsgId)
{
case C_uiOpenID:
if (!fn_bIsCurrentEditor())
GetMainWorld()->fn_bActivateEditor(this, NULL);
break;
case C_uiCloseID:
if (fn_bIsCurrentEditor())
GetMainWorld()->fn_bCloseEditor(this);
break;
}
break;
case C_SubMenuTool:
switch (uiMsgId)
{
case 1: // Save Sound data:
// Get the lcb name:
csLCBName="ed_main.lcb";
csSITName="ed_main.sit";
csDataPath=m_Editor.m_fn_csGetSoundDirectory();
csLCBName=csDataPath+"ed_main.lcb";
m_Editor.m_fn_bSaveData((char*)(LPCTSTR)csLCBName);
break;
case 2: // Dump events in map:
m_Editor.m_fn_vDumpEventsInMap();
break;
case 3: //Check sample<->resource coherence:
m_Editor.m_fn_vCheckSampleResCoherence();
break;
case 4: //Load all sound banks:
Pos=NULL;
while (pGroup=m_Editor.m_fn_poGetEventGroupList()->GetNextElement(Pos))
if (!pGroup->fn_bIsLoaded()) pGroup->fn_bLoadData();
break;
}
break;
}
}
void CALLBACK EXPORT SNDEDIT_Interface::m_fn_vTimerProc(HWND hWnd, // handle of CWnd that called SetTimer
UINT nMsg, // WM_TIMER
UINT nIDEvent, // timer identification
DWORD dwTime // system time
)
{
SND_ResourceView *pResView;
SND_EdiRes* pRes;
static SND_EdiRes* s_pEditedRes=NULL;
tdstBlockResourceMem* pResM;
long lTemp;
unsigned long ulEvtGrpId;
POSITION Pos=NULL;
BOOL bKeyPressed=FALSE;
if (IPT_fn_bIsJustValidated(g_poSNDEDITInterface->m_hSoundResourceVolumeUp)==IPT_C_TRUE)
{
bKeyPressed=TRUE;
lTemp=1;
}
if (IPT_fn_bIsJustValidated(g_poSNDEDITInterface->m_hSoundResourceVolumeDown)==IPT_C_TRUE)
{
bKeyPressed=TRUE;
lTemp=-1;
}
if (IPT_fn_bIsJustValidated(g_poSNDEDITInterface->m_hSoundResourceVolumeUpFast)==IPT_C_TRUE)
{
bKeyPressed=TRUE;
lTemp=10;
}
if (IPT_fn_bIsJustValidated(g_poSNDEDITInterface->m_hSoundResourceVolumeDownFast)==IPT_C_TRUE)
{
bKeyPressed=TRUE;
lTemp=-10;
}
if (bKeyPressed)
{
if (SND_fn_bDoesSupervisaterSelectResource())
{
pResM=SND_fn_pstGetSelectedResource();
if (pResM==NULL) return;
if ((s_pEditedRes==NULL)||(s_pEditedRes->GetStruct()!=pResM))
{ // selected resource changed: get new corresponding editor res:
ulEvtGrpId=HIWORD(pResM->Id); // Get event group id:
// Get corresponding event group:
SND_EventGroup* pGroup;
Pos=NULL;
while(pGroup=g_poSNDEDITInterface->m_Editor.m_fn_poGetEventGroupList()->GetNextElement(Pos))
if (pGroup->fn_ulGetId()==ulEvtGrpId) break;
if (pGroup==NULL) return; // event group not found;
// Load event group if not yet loaded:
if (!pGroup->fn_bIsLoaded()) pGroup->fn_bLoadData();
// find resource in the group:
Pos=NULL;
while(s_pEditedRes=pGroup->m_ResList.GetNextElement(Pos))
if (s_pEditedRes->GetStruct()==pResM) break;
if (s_pEditedRes==NULL) return;
}
// Add ltemp to this resource's volume:
lTemp+=(long)s_pEditedRes->m_oBRDisk.ucVolume;
if ((lTemp>=0)&&(lTemp<=127))
{
s_pEditedRes->m_oBRDisk.ucVolume=(unsigned char)lTemp;
s_pEditedRes->GetStruct()->ucVolume=(unsigned char)lTemp;
s_pEditedRes->m_pGroup->fn_vNotifyRebuild();
MessageBeep(MB_ICONEXCLAMATION);
pResView=(SND_ResourceView *)g_poSNDEDITInterface->m_pSplitFrame->m_fn_p_oGetPane(2);
pResView->OnUpdate(0,0,0);
}
}
else
{
pResView=(SND_ResourceView *)g_poSNDEDITInterface->m_pSplitFrame->m_fn_p_oGetPane(2);
while (pRes=pResView->m_EditedResList.GetNextElement(Pos))
{
// Add ltemp to this resource's volume:
lTemp+=(long)pRes->m_oBRDisk.ucVolume;
if ((lTemp>=0)&&(lTemp<=127))
{
pRes->m_oBRDisk.ucVolume=(unsigned char)lTemp;
pRes->GetStruct()->ucVolume=(unsigned char)lTemp;
pRes->m_pGroup->fn_vNotifyRebuild();
MessageBeep(MB_ICONEXCLAMATION);
pResView->OnUpdate(0,0,0);
}
}
}
}
*/
/*
const char * SNDEDIT_Interface::fn_czGetResNameFromEdId(unsigned long _ulId)
{
if (g_poSNDEDITInterface->m_bEditorEnabled==FALSE) return "";
IResource IRes;
LPDISPATCH lpDispatch;
CString csName;
// Find corresponding resource in editor:
lpDispatch=g_poSNDEDITInterface->m_IEditor.FindResFromEditorId(_ulId);
if (lpDispatch==NULL) return "Unknown Id";
IRes.AttachDispatch(lpDispatch);
csName=IRes.GetName();
IRes.DetachDispatch();
return csName;
}
*/
const char * SNDEDIT_Interface::fn_czGetResNameFromEdId(unsigned long _ulId)
{
short wEventGroupId,wResId;
POSITION Pos;
TSN_ResList *pResList;
TSN_Res *pRes;
wEventGroupId=HIWORD(_ulId);
wResId=LOWORD(_ulId);
if (g_poSNDEDITInterface->m_bEditorEnabled==FALSE) return "";
Pos=NULL;
while (pResList=g_poSNDEDITInterface->m_ResListList.GetNextElement(Pos))
if (pResList->m_wId==wEventGroupId) break;
if (pResList==NULL) return "Unknown Id";
Pos=NULL;
while (pRes=pResList->m_ResList.GetNextElement(Pos))
if (pRes->m_wId==wResId) break;
if (pRes==NULL) return "Unknown Id";
return pRes->m_csName;
}
void SNDEDIT_Interface::fn_vFillResList()
{
IEventGroups IGroups;
IEventGroup IGroup;
IResources IResList;
TSN_ResList *pResList;
TSN_Res *pRes;
IResource IRes;
int iNbGroups,iGroupNum,iNbRes,iResNum;
IGroups.AttachDispatch(m_IEditor.GetEventGroups());
iNbGroups=IGroups.GetCount();
for (iGroupNum=0;iGroupNum<iNbGroups;iGroupNum++)
{
IGroup.AttachDispatch(IGroups.Item(iGroupNum));
pResList=new TSN_ResList();
pResList->m_csName=IGroup.GetName();
pResList->m_wId=(short)IGroup.GetId();
m_ResListList.AddTail(pResList);
IResList.AttachDispatch(IGroup.GetResources());
iNbRes=IResList.GetCount();
for (iResNum=0;iResNum<iNbRes;iResNum++)
{
IRes.AttachDispatch(IResList.Item(iResNum));
pRes=new TSN_Res();
pRes->m_csName=IRes.GetName();
pRes->m_wId=(short)IRes.GetId();
pResList->m_ResList.AddTail(pRes);
IRes.DetachDispatch();
}// end group scan
IGroup.DetachDispatch();
}// end group scan
}
void SNDEDIT_Interface::fn_vDestroyResList()
{
POSITION Pos,SubPos;
TSN_ResList *pResList;
TSN_Res *pRes;
Pos=NULL;
while (pResList=m_ResListList.GetNextElement(Pos))
{
SubPos=NULL;
while (pRes=pResList->m_ResList.GetNextElement(SubPos)) delete pRes;
delete pResList;
}
}