mirror of https://github.com/tongzx/nt5src
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.
252 lines
6.0 KiB
252 lines
6.0 KiB
#include <stdarg.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include <iostream.h>
|
|
#include <fstream.h>
|
|
|
|
#include <afx.h>
|
|
#include <afxtempl.h>
|
|
#include <objbase.h>
|
|
#include <afxwin.h>
|
|
#include <afxole.h>
|
|
#include <afxmt.h>
|
|
#include <wchar.h>
|
|
#include <process.h>
|
|
#include <objbase.h>
|
|
#include <initguid.h>
|
|
|
|
#include <bool.hpp>
|
|
#include <nString.hpp>
|
|
#include <ui.hpp>
|
|
#include <symbol.hpp>
|
|
#include <type.hpp>
|
|
#include <value.hpp>
|
|
#include <valueRef.hpp>
|
|
#include <typeRef.hpp>
|
|
#include <oidValue.hpp>
|
|
#include <objType.hpp>
|
|
#include <objTypV1.hpp>
|
|
#include <objTypV2.hpp>
|
|
#include <objId.hpp>
|
|
#include <trapType.hpp>
|
|
#include <notType.hpp>
|
|
#include <group.hpp>
|
|
#include <notGroup.hpp>
|
|
#include <module.hpp>
|
|
#include <sValues.hpp>
|
|
#include <lex_yy.hpp>
|
|
#include <ytab.hpp>
|
|
#include <errorMsg.hpp>
|
|
#include <errorCon.hpp>
|
|
#include <scanner.hpp>
|
|
#include <parser.hpp>
|
|
#include <apTree.hpp>
|
|
#include <oidTree.hpp>
|
|
#include <pTree.hpp>
|
|
|
|
#include "Debug.hpp"
|
|
#include "Oid.hpp"
|
|
#include "OidToF.hpp"
|
|
#include "Configs.hpp"
|
|
|
|
extern Configs theConfigs;
|
|
|
|
OidToFile::OidToFile()
|
|
{
|
|
m_hMibFile = NULL;
|
|
m_pszMibFilename = NULL;
|
|
}
|
|
|
|
// DESCRIPTION:
|
|
// wrapper for the base class Scan();
|
|
// it find first the sizes of subtrees (subtree's root node included)
|
|
// RETURN VALUE:
|
|
// 0 on success
|
|
// -1 on failure;
|
|
int OidToFile::Scan()
|
|
{
|
|
SIMCOidTreeNode *pOidNode;
|
|
SIMCNodeList recursionTrace;
|
|
|
|
// get the root node from the oid tree,
|
|
// return "error" if no tree or no root
|
|
_VERIFY(m_pOidTree != NULL, -1);
|
|
pOidNode = (SIMCOidTreeNode *)m_pOidTree->GetRoot();
|
|
_VERIFY(pOidNode != NULL, -1);
|
|
|
|
// node hasn't been scanned; _lParam=number of dependencies
|
|
pOidNode->_lParam = (DWORD)pOidNode->GetListOfChildNodes()->GetCount();
|
|
// initialize the recursionTree with the root node
|
|
_VERIFY(recursionTrace.AddHead(pOidNode)!=NULL, -1);
|
|
|
|
// start to scan the tree
|
|
while (!recursionTrace.IsEmpty())
|
|
{
|
|
const SIMCNodeList *pLstChildren;
|
|
|
|
// allways pick up the node in the head of the list
|
|
pOidNode = recursionTrace.GetHead();
|
|
|
|
// get the dependencies list
|
|
pLstChildren = pOidNode->GetListOfChildNodes();
|
|
|
|
// if there are no more dependencies to process
|
|
// sum the children values and add to its own
|
|
if (pOidNode->_lParam == 0)
|
|
{
|
|
SIMCOidTreeNode *pParent;
|
|
const char * cszSymbol = NULL;
|
|
|
|
_VERIFY(GetNodeSymbol(pOidNode, cszSymbol)==0, -1);
|
|
|
|
pOidNode->_lParam = sizeof(T_FILE_NODE_EX) + (cszSymbol != NULL ? strlen(cszSymbol) : 0);
|
|
|
|
// compute the cumulated size of the subtree
|
|
for (POSITION p = pLstChildren->GetHeadPosition(); p != NULL;)
|
|
{
|
|
const SIMCOidTreeNode *pChild;
|
|
|
|
pChild = pLstChildren->GetNext(p);
|
|
_VERIFY(pChild!=NULL, -1);
|
|
|
|
// Modify here!!!!
|
|
pOidNode->_lParam += pChild->_lParam;
|
|
}
|
|
|
|
// decrease the number of dependencies from the parent node
|
|
pParent = m_pOidTree->GetParentOf(pOidNode);
|
|
if ( pParent != NULL)
|
|
{
|
|
pParent->_lParam--;
|
|
}
|
|
|
|
// delete the node from the list
|
|
recursionTrace.RemoveHead();
|
|
}
|
|
else
|
|
{
|
|
// add the children list to the front of the recursionTrace
|
|
for (POSITION p = pLstChildren->GetHeadPosition(); p != NULL;)
|
|
{
|
|
SIMCOidTreeNode *pChild;
|
|
|
|
pChild = pLstChildren->GetNext(p);
|
|
_VERIFY(pChild!=NULL, -1);
|
|
|
|
pChild->_lParam = (DWORD)pChild->GetListOfChildNodes()->GetCount();
|
|
_VERIFY(recursionTrace.AddHead(pChild)!=NULL, -1);
|
|
}
|
|
}
|
|
}
|
|
return OidTreeScanner::Scan();
|
|
}
|
|
|
|
// DESCRIPTION:
|
|
// Creates the output file, containing the OID encoding
|
|
// PARAMETERS:
|
|
// (in) pointer to the output file name
|
|
// RETURN VALUE:
|
|
// 0 on success, -1 on failure
|
|
int OidToFile::SetMibFilename(const char * pszMibFilename)
|
|
{
|
|
if (m_pszMibFilename != NULL)
|
|
{
|
|
delete (void *)m_pszMibFilename;
|
|
m_pszMibFilename = NULL;
|
|
}
|
|
|
|
if (pszMibFilename != NULL)
|
|
{
|
|
_VERIFY(strlen(pszMibFilename) != 0, -1);
|
|
m_pszMibFilename = new char [strlen(pszMibFilename) + 1];
|
|
_VERIFY(m_pszMibFilename != NULL, -1);
|
|
strcpy((char *)m_pszMibFilename, pszMibFilename);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// DESCRIPTION:
|
|
// "callback" function, called each time a
|
|
// tree node passes through the scan.
|
|
// in pOidNode->_lParam there is the cumulated size
|
|
// of the hole subtree, root included.
|
|
// size = sizeof(T_FILE_NODE_EX) + strlen(node symbol)
|
|
// PARAMETERS:
|
|
// (in) Pointer to the current node in the tree.
|
|
// Nodes are supplied in lexicographic order.
|
|
// RETURN VALUE:
|
|
// 0 - the scanner should continue
|
|
// -1 - the scanner should abort.
|
|
int OidToFile::OnScanNode(const SIMCOidTreeNode *pOidNode)
|
|
{
|
|
T_FILE_NODE_EX fileNode;
|
|
char *nodeSymbol = NULL;
|
|
|
|
// skip the '0' root of the OID tree
|
|
if (m_pOidTree->GetParentOf(pOidNode) == NULL)
|
|
return 0;
|
|
|
|
if (theConfigs.m_dwFlags & CFG_PRINT_TREE)
|
|
{
|
|
Oid oid;
|
|
|
|
_VERIFY(GetNodeOid(pOidNode, oid)==0, -1);
|
|
cout << oid << "\n";
|
|
}
|
|
if (theConfigs.m_dwFlags & CFG_PRINT_NODE)
|
|
{
|
|
cout << "."; cout.flush();
|
|
}
|
|
|
|
// if no need to write output file, return success
|
|
if (m_pszMibFilename == NULL)
|
|
return 0;
|
|
|
|
_VERIFY(GetNodeSymbol(pOidNode, nodeSymbol) == 0, -1);
|
|
|
|
// build the T_FILE_NODE_EX structure
|
|
fileNode.uNumChildren = (UINT)pOidNode->GetListOfChildNodes()->GetCount();
|
|
fileNode.uReserved = 0;
|
|
fileNode.uNumSubID = pOidNode->GetValue();
|
|
|
|
if (nodeSymbol == NULL)
|
|
{
|
|
fileNode.lNextOffset = pOidNode->_lParam - sizeof(T_FILE_NODE_EX);
|
|
fileNode.uStrLen = 0;
|
|
}
|
|
else
|
|
{
|
|
fileNode.uStrLen = strlen(nodeSymbol);
|
|
fileNode.lNextOffset = pOidNode->_lParam - fileNode.uStrLen - sizeof(T_FILE_NODE_EX);
|
|
}
|
|
|
|
// create / write_open file if not already created
|
|
if (m_hMibFile == NULL)
|
|
{
|
|
OFSTRUCT of;
|
|
|
|
_VERIFY(m_pszMibFilename != NULL, -1);
|
|
m_hMibFile = OpenFile(m_pszMibFilename, &of, OF_CREATE|OF_WRITE|OF_SHARE_EXCLUSIVE);
|
|
_VERIFY(m_hMibFile != -1, -1);
|
|
}
|
|
|
|
// write fileNode to file
|
|
_VERIFY(_lwrite(m_hMibFile, (LPSTR)&fileNode, sizeof(T_FILE_NODE_EX)) == sizeof(T_FILE_NODE_EX), -1);
|
|
|
|
// write node's symbol if exists
|
|
if (fileNode.uStrLen != 0)
|
|
{
|
|
_VERIFY(_lwrite(m_hMibFile, nodeSymbol, fileNode.uStrLen) == fileNode.uStrLen, -1);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
OidToFile::~OidToFile()
|
|
{
|
|
if (m_pszMibFilename != NULL)
|
|
delete (void *)m_pszMibFilename;
|
|
if (m_hMibFile != NULL)
|
|
_lclose(m_hMibFile);
|
|
}
|