diff -r 000000000000 -r 638b9c697799 apicompatanamdw/compatanalysercmd/headeranalyser/src/HANodeIterator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/apicompatanamdw/compatanalysercmd/headeranalyser/src/HANodeIterator.cpp Tue Jan 12 14:52:39 2010 +0530 @@ -0,0 +1,446 @@ +/* +* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "CmdGlobals.h" + +#ifdef __WIN__ +#pragma warning(disable:4786) +#endif + +#include +#include +#include +#include + +#include + +#include "Issues.h" +#include "ReportGenerator.h" +#include "ReportIssue.h" +#include "NodeIndex.h" +#include "HANodeIterator.h" +#include "XMLStringConst.h" +#include "ClassNodeAnalysis.h" +#include "Utils.h" +using namespace std; + +XERCES_CPP_NAMESPACE_USE + + +// ---------------------------------------------------------------------------- +// HANodeIterator::HANodeIterator +// Constructor +// ---------------------------------------------------------------------------- +// +HANodeIterator::HANodeIterator(DOMNode * aRootnode, NodeIndex & aNodemap, ReportGenerator & aReport, + const list< pair >& aFilesToAnalyse, bool aBaselineNode ): + root(aRootnode), + current(aRootnode), + iNodeIndex(aNodemap), + iReport(aReport), + iFilesToAnalyse(aFilesToAnalyse), + iBaselineNode(aBaselineNode) + { + } + +// ---------------------------------------------------------------------------- +// HANodeIterator::toBeAnalysed +// +// ---------------------------------------------------------------------------- +// +bool HANodeIterator::toBeAnalysed() + { + const XMLCh* fileid = this->GetAttribute(KXMLFileIdString); + const pair& file = iNodeIndex.FindFileByFileId(fileid); + return file.second; + } + +XMLCh* GClassString=NULL; + + +// ---------------------------------------------------------------------------- +// HANodeIterator::GetFullyQualifiedName +// ---------------------------------------------------------------------------- +// +pair HANodeIterator::GetFullyQualifiedName() + { + const XMLCh * fqname=NULL; + const XMLCh * nodename=NULL; + + fqname = this->GetAttribute(KXMLBBCFQNameString); + nodename = current->getNodeName(); + pair ret; + ret.first = fqname; + ret.second = nodename; + + if (Equals(ret.second,KXMLStructString)) + { +/* +#ifdef __WIN__ + ret.second = KXMLClassString; +#else + if (!GClassString) + { + GClassString = XMLString::transcode(KXMLClassString); + } + + ret.second = GClassString; +#endif*/ + GET_FULLY_QUALIFIED_NAME; + } + return ret; + } + +// ---------------------------------------------------------------------------- +// HANodeIterator::operator-> +// ---------------------------------------------------------------------------- +// +DOMNode* HANodeIterator::operator->() const + { + return (this->current); + } + +// ---------------------------------------------------------------------------- +// HANodeIterator::IndexFileNode +// ---------------------------------------------------------------------------- +// +void HANodeIterator::IndexFileNode(bool analysedfile) + { + //id="f0" name="../src/Headeranal.cpp"/ + const XMLCh * id = this->GetAttribute(KXMLIdString); + const XMLCh * name = this->GetAttribute(KXMLNameString); + pair file; + file.first = name; + file.second = analysedfile; + iNodeIndex.AddFileNodeToMap(id,file); + } + +// ---------------------------------------------------------------------------- +// HANodeIterator::IndexNode +// ---------------------------------------------------------------------------- +// +void HANodeIterator::IndexNode() + { + iNodeIndex.AddNodeIdToMap(current); + } + +// ---------------------------------------------------------------------------- +// HANodeIterator::NameNode +// Name node +// ---------------------------------------------------------------------------- +// +void HANodeIterator::NameNode(bool index) + { + + const XMLCh* fqname = this->GetAttribute(KXMLBBCFQNameString); + if ( !fqname ) + { + string generatedname; + + const XMLCh* name = this->GetAttribute(KXMLNameString); + + if ( Equals(name,"") ) + return; + + if ( Equals(current->getNodeName(),KXMLEnumValueString) ) + { + //We are naming the members of anonymous enumeration + // Generate the name for the parents context + + HANodeIterator tempnode(*this); + tempnode.current = current->getParentNode(); + + const XMLCh * parentContext = tempnode.GetAttribute(KXMLContextString); + bool found = tempnode.FindNodeById(parentContext); + assert(found); + + generatedname = GenerateFullyQualifiedName(tempnode); + generatedname += "::"; + generatedname += toString(name); + }else + { + generatedname = GenerateFullyQualifiedName(*this); + } + + //DEBUG_PRINT("Fullyqualified name: "); + //DEBUG_PRINT(generatedname); + //DEBUG_PRINT("\n"); + + XMLCh* fqnamep = XMLString::transcode(generatedname.c_str()); + this->SetAttribute(KXMLBBCFQNameString, fqnamep); + XMLString::release(&fqnamep); + } + if (index) + { + fqname = this->GetAttribute(KXMLBBCFQNameString); + pair fqname = this->GetFullyQualifiedName(); + iNodeIndex.AddNodeFQNameToMap(current,fqname); + } + } + +// ---------------------------------------------------------------------------- +// HANodeIterator::FindNodeById +// Constructor +// +// ---------------------------------------------------------------------------- +// +bool HANodeIterator::FindNodeById(const XMLCh * nodeId) + { + DOMNode * node = iNodeIndex.FindNodeById(root, nodeId); + + if (node) + { + current = node; + return true; + } + + return false; + } + +// ---------------------------------------------------------------------------- +// HANodeIterator::IsSameNodeType +// Constructor +// +// ---------------------------------------------------------------------------- +// +bool HANodeIterator::IsSameNodeType(const HANodeIterator& other) +{ + if ( Equals(current->getNodeName(),other->getNodeName()) ) + { + return true; + } + + if ( (Equals( KXMLClassString,other->getNodeName()) && Equals( KXMLStructString,current->getNodeName())) + || + (Equals( KXMLClassString,current->getNodeName()) && Equals( KXMLStructString,other->getNodeName())) + ) + { + return true; + } + + return false; +} + +// ---------------------------------------------------------------------------- +// HANodeIterator::FindNodeByName +// Find node by name +// +// ---------------------------------------------------------------------------- +// +bool HANodeIterator::FindNodeByName(pair nodeName) + { + DOMNode * node = iNodeIndex.FindNodeByFQName(root, nodeName); + + if (node) + { + current = node; + return true; + } + + return false; + } + +// ---------------------------------------------------------------------------- +// HANodeIterator::GetAttribute +// +// ---------------------------------------------------------------------------- +// +const XMLCh* HANodeIterator::GetAttribute(const char* attribute) const + { + return ::GetAttribute(this->current,attribute); + } + +// ---------------------------------------------------------------------------- +// HANodeIterator::GetAttribute +// +// ---------------------------------------------------------------------------- +// +const XMLCh* HANodeIterator::GetAttribute(const XMLCh* attribute) const + { + return ::GetAttribute(this->current,attribute); + } +// ---------------------------------------------------------------------------- +// HANodeIterator::HANodeIterator +// +// ---------------------------------------------------------------------------- +// +bool HANodeIterator::CheckForBooleanAttribute(const XMLCh* attribute) const + { + return ::CheckForBooleanAttribute(current, attribute); + } + +// ---------------------------------------------------------------------------- +// HANodeIterator::CheckForBooleanAttribute +// +// ---------------------------------------------------------------------------- +// +bool HANodeIterator::CheckForBooleanAttribute(const char* attribute) const + { + return ::CheckForBooleanAttribute(current, attribute); + } + +// ---------------------------------------------------------------------------- +// HANodeIterator::SetAttribute +// Constructor +// +// ---------------------------------------------------------------------------- +// +void HANodeIterator::SetAttribute(const char* attribute, const char* value) + { + ::SetAttribute(current, attribute, value); + } + +// ---------------------------------------------------------------------------- +// HANodeIterator::SetAttribute +// Set attribute value +// +// ---------------------------------------------------------------------------- +// +void HANodeIterator::SetAttribute(const char* attribute, const XMLCh* value) + { + XMLCh* chattribute = XMLString::transcode(attribute); + ::SetAttribute(current, chattribute, value); + XMLString::release(&chattribute); + } + +// ---------------------------------------------------------------------------- +// HANodeIterator::SetAttribute +// Set attribute value +// +// ---------------------------------------------------------------------------- +// +void HANodeIterator::SetAttribute(const XMLCh* attribute, const char* value) + { + XMLCh* chvalue = XMLString::transcode(value); + ::SetAttribute(current, attribute, chvalue); + XMLString::release(&chvalue); + } + +// ---------------------------------------------------------------------------- +// HANodeIterator::SetAttribute +// Set attribute value +// +// ---------------------------------------------------------------------------- +// +void HANodeIterator::SetAttribute(const XMLCh* attribute, const XMLCh* value) + { + ::SetAttribute(current, attribute, value); + } + + +// ---------------------------------------------------------------------------- +// HANodeIterator::GetElementsByTagName +// +// ---------------------------------------------------------------------------- +// +DOMNodeList* HANodeIterator::GetElementsByTagName(const char* tag) const + { + XMLCh * enumvaltag = XMLString::transcode(tag); + DOMNodeList* childs = GetElementsByTagName(enumvaltag); + XMLString::release(&enumvaltag); + + return childs; + } + +// ---------------------------------------------------------------------------- +// HANodeIterator::GetElementsByTagName +// +// ---------------------------------------------------------------------------- +// +DOMNodeList* HANodeIterator::GetElementsByTagName(const XMLCh* tag) const + { + return (static_cast(this->current))->getElementsByTagName(tag); + } + +// ---------------------------------------------------------------------------- +// HANodeIterator::addIssue +// Add issue found in analysis +// ---------------------------------------------------------------------------- +// +void HANodeIterator::addIssue(TIssueIdentity aIdentityId, TIssueType aTypeId, TBCSeverity bcseverity, TSCSeverity scseverity, string ignoreinfo, const XMLCh* fileid, const string name,int lineNumber) const + { + bool lFlag = false; + if ( !fileid ) + { + fileid = this->GetAttribute(KXMLFileIdString); + } + + string fqname(GenerateFullyQualifiedName(*this)); + fqname += name; + const pair& file = iNodeIndex.FindFileByFileId(fileid); + + string compareFileName(""); + + list< pair >::const_iterator it = iFilesToAnalyse.begin(); + + /*int linenumber = 0; + const XMLCh* strlinenumber = this->GetAttribute(KXMLLineString); + + if ( strlinenumber ) + { + linenumber = atoi(toString(strlinenumber).c_str()); + } + */ + string filename(toString(file.first)); + + string::size_type dirSepInd = filename.find_first_of("\\/"); + if( dirSepInd != string::npos && filename.at(dirSepInd) != DIR_SEPARATOR ) + { + // We need to convert to proper dir-separator + replaceChar(filename, filename.at(dirSepInd), DIR_SEPARATOR); + } + + for (; it != iFilesToAnalyse.end(); ++it) + { + if (iBaselineNode) + { + if ( CompareFileNames(((*it).first),filename ) ) + { + filename = ((*it).first); + compareFileName = ((*it).second); + lFlag = true; + break; + } + } + else + { + if ( CompareFileNames(((*it).second),filename ) ) + { + compareFileName = ((*it).first); + filename = ((*it).second); + lFlag = true; + break; + } + } + } + if(lFlag == true ) + { + if ( iBaselineNode ) + { + this->iReport.addIssue(filename, + fqname, aIdentityId, aTypeId, bcseverity, scseverity, ignoreinfo, lineNumber, + compareFileName, ""); + } + else + { + this->iReport.addIssue(compareFileName, + fqname, aIdentityId, aTypeId, bcseverity, scseverity, ignoreinfo, lineNumber, + filename, ""); + } + } + }