apicompatanamdw/compatanalysercmd/headeranalyser/src/PlatformData.h
changeset 0 638b9c697799
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apicompatanamdw/compatanalysercmd/headeranalyser/src/PlatformData.h	Tue Jan 12 14:52:39 2010 +0530
@@ -0,0 +1,692 @@
+/*
+* 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:  
+*
+*/
+
+
+#ifndef PLATFORMDATA_H
+#define PLATFORMDATA_H
+
+#include <xercesc/dom/DOM.hpp>
+#include <string>
+#include <vector>
+#include <map>
+
+using namespace std;
+
+class Component;
+class PlatformData;
+
+typedef vector<string> IncludePaths;
+
+#define PLATFORM_ELEMENT_COMPONENT      "component"
+#define PLATFORM_ELEMENT_HEADER         "hdr"
+#define PLATFORM_ELEMENT_PROJECT        "prj"
+#define PLATFORM_ELEMENT_SOURCE         "src"
+#define PLATFORM_ELEMENT_FILENAME       "fname"
+#define PLATFORM_ELEMENT_RELPATH        "path"
+#define PLATFORM_ELEMENT_INCLUDEPATH    "incpath"
+#define PLATFORM_ELEMENT_INCLUDE        "inc"
+#define PLATFORM_ELEMENT_FORCEDINCLUDE  "finc"
+#define PLATFORM_IGNORED_COMPONENT     "excluded header list"
+#define PLATFORM_ELEMENT_API_NAME      "api"
+/**
+ * Abstract base class for all the elements that are parsed from the 
+ * platform's XML description.
+ */
+class ParsedElement
+{
+public:
+    ParsedElement();
+    virtual ~ParsedElement();
+
+    /**
+     * Initializes the element. This must be called before finalizing the element.
+     * @param node Pointer to the DOM node containing the data for the element.
+     * @param platform Pointer to the platform in which this element belongs.
+     * @return true if the initialization was successful, false otherwise.
+     */
+    virtual bool Initialize(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode* node, PlatformData* platform);
+    
+    /**
+     * For debugging purposes. Prints the data of an element to standard output.
+     * @param indentSpaces Number of indentation spaces to get hierarchical print.
+     * @return string object containing the element's data.
+     */
+    virtual string PrettyPrint(int indentSpaces = 0) const = 0;
+
+protected:
+
+    /**
+     * Processes the attributes of an XML element.
+     * @param node Pointer to the element's DOM data.
+     */
+    virtual void ProcessAttributes(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode* node) = 0;
+
+    /**
+     * Processes the child elements of an XML element.
+     * @param node Pointer to the element's DOM data.
+     * @param platform Pointer to the platform in which this element belongs.
+     */
+    virtual bool ProcessChildElement(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode* node, PlatformData* platform) = 0;
+
+    /**
+     * Adds this element to the given platform. NOTE! When the addition
+     * is successful, the platform takes the ownership of this element.
+     * But when the addition is unsuccessful the caller must take care of
+     * the object deallocation.
+     * @param platform Pointer to the platform
+     * @return true, if the addition was successful. False otherwise. 
+     */
+    virtual bool AddToPlatform(PlatformData* platform) = 0;
+
+    // Platform's root directory. Given in application parameters (i.e BASELINEDIR or CURRENTDIR).
+    string iRootDir;
+};
+
+typedef vector<ParsedElement*> ElementVector;
+
+/**
+ * ComponentFile is a base class for files inside a component.
+ */
+class ComponentFile : public ParsedElement
+{
+public:
+    
+    /**
+     * Default constructor
+     */
+    ComponentFile();
+
+    /**
+     * Constructor
+     * @param ID Unique file id.
+     * @param comp Pointer to the <code>Component</code> in which this file belongs.
+     */
+    ComponentFile(const string& ID, Component* comp);
+
+    /**
+     * Copy constructor
+     * @param rhs Reference to the <code>ComponentFile</code> from which the data is copied.
+     */
+    ComponentFile(const ComponentFile& rhs);
+
+    /**
+     * Destructor
+     */
+    virtual ~ComponentFile();
+    
+    /**
+     * Returns the file id.
+     * @return Reference to a <code>string</code> object representing the file id.
+     */
+    virtual const string& ID() const;
+
+    /**
+     * Returns the file name.
+     * @return Reference to a <code>string</code> object representing the file name.
+     */
+    virtual const string& FileName() const;        
+
+    /**
+     * Returns the path of the file.
+     * @return Reference to a <code>string</code> object representing the path.
+     */
+    virtual const string& Path() const;
+    
+    /**
+     * Sets the file id.
+     * @param ID Reference to a <code>string</code> represeting the file id.
+     */
+    virtual void SetID(const string& ID);
+
+    /**
+     * Sets the file name.
+     * @param name Reference to a <code>string</code> represeting the file name.
+     */
+    virtual void SetFileName(const string& name);
+
+    /**
+     * Sets the path.
+     * @param path Reference to a <code>string</code> represeting the path.
+     */
+    virtual void SetPath(const string& path);
+
+    /**
+     * Returns the owner component.
+     * @return Pointer to the component in which this file belongs.
+     */
+    virtual Component* GetComponent() const;
+
+    /**
+     * Sets the owner component.
+     * Pointer to the <code>Component</code> object. Does not take the ownership.
+     */
+    virtual void SetComponent(Component* comp);
+
+    /**
+     * Assignment operator
+     */
+    virtual const ComponentFile& operator= (const ComponentFile& rhs);
+
+    /**
+     * Comparison operator
+     */
+    virtual bool operator== (const ComponentFile& rhs) const;
+
+    /**
+     * Returns the include directives defined for this element
+     * @return Reference to the <code>std::vector</code> containing include directives
+     */
+    virtual const vector<string>& Includes() const;
+
+    /**
+     * Adds include directive (string) to the object
+     * @param incHdr name of the header to be included
+     */
+    virtual void AddInclude(const string& incHdr);
+
+    /**
+     * Adds include directives to the object
+     * @param incs Reference to the <code>std::vector</code> containing the include directives.
+     */
+    virtual void SetIncludes(const vector<string>& incs);
+
+    /**
+     * Returns the include paths used in compilation of the project
+     * @return Reference to a <code>vector</code> containing <code>string</code>
+     * objects that represent the include paths.
+     */
+    const vector<string>& IncludePaths() const;
+
+    /**
+     * Adds an include path
+     * @param incPath Reference to a <code>string</code> object representing
+     * the include path.
+     */
+    void AddIncludePath(const string& incPath);   
+    
+    
+    /**
+     * Returns the forced include used in compilation of the component
+     * @return a string object representing the forced include.
+     */
+    string ForcedInclude();
+	
+	/**
+     * Returns pair of string , with API name and category
+     */
+	pair<string,string>& APIinfo();
+    
+protected:
+
+    // From ParsedElement:
+    virtual void ProcessAttributes(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode* node);
+    virtual bool ProcessChildElement(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode* node, PlatformData* platform);
+
+    string iID; // File id
+    string iName; // File name
+    string iPath; // Path
+	pair<string,string> iApiInfo; // API info for the header
+    Component* iComponent; // Component, does not own the pointer
+    vector<string> iIncludes; // Include directives
+    vector<string> iIncludePaths; // Include paths
+    string iForcedInclude; // Forced include
+};
+
+typedef vector<ComponentFile*> FileList;
+
+/**
+ * This class represents the project. Project belongs to one component and
+ * has a list of include and source paths as well as the source files 
+ * belonging to the project.
+ */
+class Project : public ComponentFile
+{
+public:
+
+    /**
+     * Default constructor
+     */
+    Project();
+    
+    /**
+     * Constructor
+     * @param prjID Project file id
+     * @param comp Pointer to the <code>Component</code> object in which 
+     * this project belongs.
+     */
+    Project(const string& prjID, Component* comp);
+
+    /**
+     * Destructor
+     */
+    virtual ~Project();
+
+    /**
+     * Returns the list of <code>Source</code> objects contained by this project
+     * @return Reference to the list of <code>Source</code> objects.
+     */
+    const FileList& Sources() const;    
+
+    // From ParsedElement:    
+    virtual string PrettyPrint(int indentSpaces = 0) const;
+
+protected:
+
+    // From ParsedElement:
+    virtual bool AddToPlatform(PlatformData* platform);    
+    virtual bool ProcessChildElement(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode* node, PlatformData* platform);
+    FileList iSourceObjs; // Source objects belonging to this project
+};
+
+
+/**
+ * This class represents the header file, which belongs to one component.
+ * It has a analysis status telling whether the header should be ignored
+ * from the analysis or it is just being analyzed or the analysis is ready.
+ */
+class Header : public ComponentFile
+{
+public:
+    
+    enum STATUS {
+        HDR_STATUS_UNDEF = 0, // Undefined status
+        HDR_STATUS_IGNORE, // Header should be ignored from the analysis
+        HDR_STATUS_TO_BE_ANALYZED, // Header will be analyzed
+        HDR_STATUS_READY, // Analysis for the header is ready
+        HDR_STATUS_INVALID,// Invalid header
+        HDR_STATUS_FAILED // Analysis and/or compilation failed
+    };
+
+    /**
+     * Default constructor
+     */
+    Header();
+
+    /**
+     * Constructor
+     * @param hdrID Header file id
+     * @param comp Pointer to the component in which this header belongs.
+     */
+    Header(const string& hdrID, Component* comp);
+
+    /**
+     * Destructor
+     */
+    virtual ~Header();
+
+    /**
+     * Returns the status of the header
+     * @return Status of the header
+     */
+    STATUS Status() const;
+
+    /**
+     * Sets the status of the header
+     * @param s Status of the header.
+     */
+    void SetStatus(STATUS s);
+
+    // From ParsedElement:    
+    virtual string PrettyPrint(int indentSpaces = 0) const;  
+
+    /**
+     * Returns pointer to the cached include directives. Once the include directives
+     * are fetched by <code>PlatformData</code>, they are cached for further use to
+     * speed up the analysis.
+     *
+     * @return Pointer to the <code>std::vector</code> containing cached include
+     * directives
+     */
+    const vector<string>* CachedIncludes() const;
+
+    /**
+     * Returns pointer to the cached include paths. Once the include paths
+     * are fetched by <code>PlatformData</code>, they are cached for further use to
+     * speed up the analysis.
+     *
+     * @return Pointer to the <code>std::vector</code> containing cached include
+     * paths
+     */
+    const vector<string>* CachedIncludePaths() const;
+    
+    /**
+     * Returns the cached forced include directive. Once the forced include directive
+     * is fetched by <code>PlatformData</code>, it is cached for further use to
+     * speed up the analysis.
+     *
+     * @return cached forced include
+     * directives
+     */
+    string CachedForcedInclude() const;
+
+	 /**
+     * Returns the cached source object for the header. 
+     */
+	string CachedSource() const;
+	
+
+    /** 
+     * Sets cached include directives. Takes the ownership of the given pointer.
+     * @param Pointer to the include directives
+     */
+    void SetCachedIncludes(vector<string>* incs);
+
+    /** 
+     * Sets cached include paths. Takes the ownership of the given pointer.
+     * @param Pointer to the include directives
+     */
+    void SetCachedIncludePaths(vector<string>* incPaths);
+    
+    /** 
+     * Sets cached forced include directive.
+     * @param Forced include directive
+     */
+    void SetCachedForcedInclude(string finc);
+
+	/** 
+     * Sets cached soource file.
+     * @param source File
+     */
+	void SetCachedSourceFile (string srcObj);
+
+protected:
+
+    // From ParsedElement:
+    virtual void ProcessAttributes(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode* node);    
+    virtual bool AddToPlatform(PlatformData* platform);        
+
+private:
+    STATUS iStatus; // Header's status
+    vector<string>* iCachedIncludes; // Cached additional include directives. Owns the pointer!!
+    vector<string>* iCachedIncludePaths; // Cached include paths. Owns the pointer!!
+    string iCachedForcedInclude; // Cached forced include.
+	string iCacheSrcObj;
+};
+
+/**
+ * This class represents the source file belonging to a component.
+ * It has a list of include directives.
+ */
+class Source : public ComponentFile
+{
+public:
+
+    /**
+     * Default constructor
+     */
+    Source();
+
+    /**
+     * Constructor
+     * @param srcID Source file id
+     * @param comp Pointer to the component
+     */
+    Source(const string& srcID, Component* comp);
+
+    /**
+     * Destructor
+     */
+    virtual ~Source();
+
+    // From ParsedElement:    
+    virtual string PrettyPrint(int indentSpaces = 0) const;
+
+protected:
+    // From ParsedElement:
+    virtual bool AddToPlatform(PlatformData* platform);        
+};
+
+/**
+ * Component
+ */
+class Component : public ComponentFile
+{
+public:
+    /**
+     * Default constructor
+     */
+    Component();
+
+    /**
+     * Constructor
+     * @param compID Unique component ID
+     */
+    Component(const string& compID, Component* comp);
+
+    /**
+     * Destructor
+     */
+    virtual ~Component();
+    
+    /**
+     * Returns the header objects belonging to this component.
+     * @return Header objects.
+     */
+    const FileList& Headers() const;
+
+    /**
+     * Returns the header objects belonging to this component.
+     * @return Header objects.
+     */
+    FileList& Headers();
+
+    /**
+     * Returns the project objects belonging to this component.
+     * @return Project objects.
+     */
+    const FileList& Projects() const;
+
+    /**
+     * Returns the project objects belonging to this component.
+     * @return Project objects.
+     */
+    FileList& Projects();
+
+    /**
+     * Adds <code>Header</code> object to the component
+     * @param hdr Pointer to the <code>Header</code> object.
+     */
+    void AddHeader(ComponentFile* hdr); 
+
+    /**
+     * Adds <code>Project</code> object to the component
+     * @param hdr Pointer to the <code>Project</code> object.
+     */
+    void AddProject(ComponentFile* prj);
+    
+    // From ParsedElement:    
+    virtual string PrettyPrint(int indentSpaces = 0) const;
+    
+protected:
+    // From ParsedElement:
+    virtual bool AddToPlatform(PlatformData* platform);   
+    virtual bool ProcessChildElement(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode* node, PlatformData* platform);
+        
+    FileList iHeaders; // Header objects
+    FileList iProjects; // Project objects
+};
+
+typedef map<string, ComponentFile*> CFileMap;
+typedef map<string, Component*> ComponentList;
+
+/**
+ * PlatformData class represents the platform specific data that is needed
+ * in compilation of platform's header files.
+ * This class contains methods that offer different views to the platform data
+ * in order to enable efficient data processing for the clients.
+ */
+class PlatformData
+{
+public:
+
+    /**
+     * Constructor
+     * @param pfVersion Platform version given in application parameters.
+     * @param rootDir Platform's root directory given in application parameters.
+     */
+    PlatformData(const string& pfVersion, const string& rootDir);
+
+    /**
+     * Destructor
+     */
+    virtual ~PlatformData();
+
+    /**
+     * Initializes the platform data. This method reads and parses the 
+     * platform data from the given file and sorts the data in private
+     * containers for later use. 
+     * @param dataFileName Platform data file name.
+     */
+    void Initialize(const string& dataFileName);
+
+    /**
+     * Returns headers sorted by their file ids.
+     * @return Reference to the <code>CFileMap</code> object containing the
+     * headers sorted by their file ids.
+     */
+    const CFileMap& HeadersById() const;    
+    
+    /**
+     * Returns headers having the given status sorted by their file ids.
+     * @param hdrStatus Header status. All the headers having this status 
+     * are returned.
+     * @param Reference to the <code>CFileMap</code> object in which the
+     * the headers matching the hdrStatus are returned.
+     */
+    void HeadersByStatus(Header::STATUS hdrStatus, CFileMap& hdrFiles) const;
+
+    /**
+     * Returns projects sorted by their file ids.
+     * @return Reference to the <code>CFileMap</code> object containing the
+     * projects sorted by their file ids.
+     */
+    const CFileMap& ProjectsById() const;
+
+    /**
+     * Returns projects sorted by their file ids.
+     * @return Reference to the <code>CFileMap</code> object containing the
+     * projects sorted by their file ids.
+     */
+    CFileMap& ProjectsById();
+
+    /**
+     * Returns sources sorted by their file ids.
+     * @return Reference to the <code>CFileMap</code> object containing the
+     * sources sorted by their file ids.
+     */
+    const CFileMap& SourcesById() const;
+
+    /**
+     * Gets include paths needed in compilation of the given header
+     * @param headerID ID of the header file.
+     * @param incPaths Include paths needed in compilation of the header.
+     */
+    const vector<string>& IncludePathsForHeader(const string& headerID);
+
+    /**
+     * Gets include paths needed in compilation of the given header
+     * @param headerObj Pointer to the header file object.
+     * @param incPaths Include paths needed in compilation of the header.
+     */
+    const vector<string>& IncludePathsForHeader(Header* headerObj);
+
+    /**
+     * Gets additional include directives needed in compilation of the given header
+     * @param headerID ID of the header file.
+     * @param incs Include directives needed in compilation of the header.
+     */
+    const vector<string>& IncludesForHeader(const string& headerID);
+
+    /**
+     * Gets additional include directives needed in compilation of the given header
+     * @param headerObj Pointer to the header file object.
+     * @param incs Include directives needed in compilation of the header.
+     */
+    const vector<string>& IncludesForHeader(Header* headerObj, Header* baseHObj = NULL);
+
+    /**
+     * Adds component to the component list. Takes the ownership of the pointer.
+     * @param comp Pointer to the <code>Component</code> object.
+     */
+    bool AddComponent(Component* comp);
+
+    /**
+     * Adds project to the project list. Takes the ownership of the pointer.
+     * @param prj Pointer to the <code>Project</code> object.
+     */
+    bool AddProject(Project* prj);
+
+    /**
+     * Adds header to the header list. Takes the ownership of the pointer.
+     * @param hdr Pointer to the <code>Header</code> object.
+     */
+    bool AddHeader(Header* hdr);
+
+    /**
+     * Adds source to the source list. Takes the ownership of the pointer.
+     * @param src Pointer to the <code>Source</code> object.
+     */
+    bool AddSource(Source* src);
+
+    /**
+     * Factory method creating correct element type for the given <code>DOMNode</code>.
+     * @param node Pointer to the <code>DOMNode</code>.
+     * @return Pointer to the created object.
+     */
+    ParsedElement* CreateElement( XERCES_CPP_NAMESPACE_QUALIFIER DOMNode* node );
+
+    /**
+     * Returns the list of components
+     * @return Reference to the component list
+     */
+    const ComponentList& Components() const;
+
+    /**
+     * Prints the elements read from the platform data file.
+     * For debugging purposes.
+     * @return string representing the platform data.
+     */
+    string PrettyPrint() const;
+
+    /**
+     * Returns the root directory of the platform.
+     * @return Root directory string
+     */
+    const string& GetRootDir() const;
+
+private:
+    void IncludesFromSource(const Header* hObj, const Source* srcObj, vector<string>& includes) const;
+    vector<string> iDummyStringVector;    
+    void InitializeElements();    
+    ComponentList iCList; // All components in platform
+    CFileMap iHeadersById; // All headers in platform
+    CFileMap iSourcesById; // All sources in platform
+    CFileMap iProjectsById; // All projects in platform
+        
+    // Pointer to DOMBuilder
+    XERCES_CPP_NAMESPACE_QUALIFIER DOMBuilder* iDOMParser;
+    // Pointer to DOMDocument
+    XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument* iDOMDoc;
+    // Pointer to DOM root node
+    XERCES_CPP_NAMESPACE_QUALIFIER DOMNode* iDOMRootElement;
+
+    string iRootDir; // Root directory
+    string iPfVersion; // Version string given in constructor.
+    string iVersionStr; // Read from the XML-file (versionid attribute)
+};
+
+#endif