Set fourth file version digit to signify rebuild.
[shibboleth/cpp-xmltooling.git] / xmltooling / AbstractXMLObject.h
index 576a7d0..3dd53ff 100644 (file)
@@ -1,32 +1,37 @@
-/*
-*  Copyright 2001-2007 Internet2
- * 
-* Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+/**
+ * Licensed to the University Corporation for Advanced Internet
+ * Development, Inc. (UCAID) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for
+ * additional information regarding copyright ownership.
+ *
+ * UCAID licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the
+ * License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific
+ * language governing permissions and limitations under the License.
  */
 
 /**
- * @file AbstractXMLObject.h
- * 
+ * @file xmltooling/AbstractXMLObject.h
+ *
  * An abstract implementation of XMLObject.
  */
 
 #ifndef __xmltooling_abstractxmlobj_h__
 #define __xmltooling_abstractxmlobj_h__
 
+#include <xmltooling/logging.h>
+#include <xmltooling/QName.h>
 #include <xmltooling/XMLObject.h>
-#include <xmltooling/util/DateTime.h>
 
-#include <log4cpp/Category.hh>
+#include <memory>
 
 #if defined (_MSC_VER)
     #pragma warning( push )
@@ -35,6 +40,8 @@
 
 namespace xmltooling {
 
+    class XMLTOOL_API DateTime;
+
     /**
      * An abstract implementation of XMLObject.
      * This is the primary concrete base class, and supplies basic namespace,
@@ -45,80 +52,48 @@ namespace xmltooling {
     class XMLTOOL_API AbstractXMLObject : public virtual XMLObject
     {
     public:
-        virtual ~AbstractXMLObject() {
-            delete m_typeQname;
-            XMLString::release(&m_schemaLocation);
-            XMLString::release(&m_noNamespaceSchemaLocation);
-        }
+        virtual ~AbstractXMLObject();
 
+        // Virtual function overrides.
         void detach();
-
-        const QName& getElementQName() const {
-            return m_elementQname;
-        }
-
-        const std::set<Namespace>& getNamespaces() const {
-            return m_namespaces;
-        }
-    
-        void addNamespace(const Namespace& ns) const {
-            std::set<Namespace>::iterator i = m_namespaces.find(ns);
-            if (i == m_namespaces.end())
-                m_namespaces.insert(ns);
-            else if (ns.alwaysDeclare())
-                const_cast<Namespace&>(*i).setAlwaysDeclare(true);
-        }
-    
-        void removeNamespace(const Namespace& ns) {
-            m_namespaces.erase(ns);
-        }
-        
-        const QName* getSchemaType() const {
-            return m_typeQname;
-        }
-        
-        const XMLCh* getXMLID() const {
-            return NULL;
-        }
-    
-        bool hasParent() const {
-            return m_parent != NULL;
-        }
-     
-        XMLObject* getParent() const {
-            return m_parent;
-        }
-    
-        void setParent(XMLObject* parent) {
-            m_parent = parent;
-        }
+        const QName& getElementQName() const;
+        const std::set<Namespace>& getNamespaces() const;
+        void addNamespace(const Namespace& ns) const;
+        void removeNamespace(const Namespace& ns);
+        const QName* getSchemaType() const;
+        const XMLCh* getXMLID() const;
+        xmlconstants::xmltooling_bool_t getNil() const;
+        void nil(xmlconstants::xmltooling_bool_t value);
+        bool hasParent() const;
+        XMLObject* getParent() const;
+        void setParent(XMLObject* parent);
 
      protected:
         /**
          * Constructor
-         * 
+         *
          * @param nsURI         the namespace of the element
          * @param localName     the local name of the XML element this Object represents
          * @param prefix        the namespace prefix to use
          * @param schemaType    the xsi:type to use
          */
         AbstractXMLObject(
-            const XMLCh* nsURI=NULL, const XMLCh* localName=NULL, const XMLCh* prefix=NULL, const QName* schemaType=NULL
+            const XMLCh* nsURI=nullptr, const XMLCh* localName=nullptr, const XMLCh* prefix=nullptr, const QName* schemaType=nullptr
             );
 
         /** Copy constructor. */
         AbstractXMLObject(const AbstractXMLObject& src);
-        
+
         /**
          * A helper function for derived classes, for assignment of strings.
          *
          * This 'normalizes' newString, and then if it is different from oldString,
          * it invalidates the DOM, frees the old string, and returns the new.
          * If not different, it frees the new string and just returns the old value.
-         * 
-         * @param oldValue the current value
-         * @param newValue the new value
-         * 
+         *
+         * @param oldValue the current value
+         * @param newValue the new value
+         *
          * @return the value that should be assigned
          */
         XMLCh* prepareForAssignment(XMLCh* oldValue, const XMLCh* newValue);
@@ -127,10 +102,10 @@ namespace xmltooling {
          * A helper function for derived classes, for assignment of date/time data.
          *
          * It invalidates the DOM, frees the old object, and returns the new.
-         * 
-         * @param oldValue the current value
-         * @param newValue the new value
-         * 
+         *
+         * @param oldValue the current value
+         * @param newValue the new value
+         *
          * @return the value that should be assigned
          */
         DateTime* prepareForAssignment(DateTime* oldValue, const DateTime* newValue);
@@ -139,50 +114,52 @@ namespace xmltooling {
          * A helper function for derived classes, for assignment of date/time data.
          *
          * It invalidates the DOM, frees the old object, and returns the new.
-         * 
-         * @param oldValue - the current value
-         * @param newValue - the epoch to assign as the new value
-         * 
+         *
+         * @param oldValue the current value
+         * @param newValue the epoch to assign as the new value
+         * @param duration true iff the value is a duration rather than an absolute timestamp
+         *
          * @return the value that should be assigned
          */
-        DateTime* prepareForAssignment(DateTime* oldValue, time_t newValue);
+        DateTime* prepareForAssignment(DateTime* oldValue, time_t newValue, bool duration=false);
 
         /**
          * A helper function for derived classes, for assignment of date/time data.
          *
          * It invalidates the DOM, frees the old object, and returns the new.
-         * 
-         * @param oldValue - the current value
-         * @param newValue - the new value in string form
-         * 
+         *
+         * @param oldValue the current value
+         * @param newValue the new value in string form
+         * @param duration true iff the value is a duration rather than an absolute timestamp
+         *
          * @return the value that should be assigned
          */
-        DateTime* prepareForAssignment(DateTime* oldValue, const XMLCh* newValue);
+        DateTime* prepareForAssignment(DateTime* oldValue, const XMLCh* newValue, bool duration=false);
 
         /**
          * A helper function for derived classes, for assignment of QName data.
          *
          * It invalidates the DOM, frees the old object, and returns the new.
-         * 
-         * @param oldValue the current value
-         * @param newValue the new value
-         * 
+         *
+         * @param oldValue the current value
+         * @param newValue the new value
+         *
          * @return the value that should be assigned
          */
         QName* prepareForAssignment(QName* oldValue, const QName* newValue);
 
         /**
          * A helper function for derived classes, for assignment of (singleton) XML objects.
-         * 
-         * It is indifferent to whether either the old or the new version of the value is null. 
+         *
+         * It is indifferent to whether either the old or the new version of the value is null.
          * This method will do a safe compare of the objects and will also invalidate the DOM if appropriate.
-         * Note that since the new value (even if NULL) is always returned, it may be more efficient
+         * Note that since the new value (even if nullptr) is always returned, it may be more efficient
          * to discard the return value and just assign independently if a dynamic cast would be involved.
-         * 
-         * @param oldValue current value
-         * @param newValue proposed new value
-         * @return the new value 
-         * 
+         *
+         * @param oldValue current value
+         * @param newValue proposed new value
+         * @return the new value
+         *
          * @throws XMLObjectException if the new child already has a parent.
          */
         XMLObject* prepareForAssignment(XMLObject* oldValue, XMLObject* newValue);
@@ -195,7 +172,7 @@ namespace xmltooling {
         /**
          * Logging object.
          */
-        log4cpp::Category& m_log;
+        logging::Category& m_log;
 
         /**
          * Stores off xsi:schemaLocation attribute.
@@ -207,10 +184,15 @@ namespace xmltooling {
          */
         XMLCh* m_noNamespaceSchemaLocation;
 
+        /**
+         * Stores off xsi:nil attribute.
+         */
+        xmlconstants::xmltooling_bool_t m_nil;
+
     private:
         XMLObject* m_parent;
         QName m_elementQname;
-        QName* m_typeQname;
+        std::auto_ptr<QName> m_typeQname;
     };
 
 };