VS10 solution files, convert from NULL macro to nullptr.
[shibboleth/sp.git] / shibsp / attribute / Attribute.h
index 4b0e474..c734909 100644 (file)
@@ -1,6 +1,6 @@
 /*
- *  Copyright 2001-2007 Internet2
- * 
+ *  Copyright 2001-2009 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
 
 /**
  * @file shibsp/attribute/Attribute.h
- * 
+ *
  * A resolved attribute.
  */
 
 #ifndef __shibsp_attribute_h__
 #define __shibsp_attribute_h__
 
-#include <shibsp/exceptions.h>
 #include <shibsp/remoting/ddf.h>
 
 #include <map>
@@ -39,16 +38,16 @@ namespace shibsp {
 
     /**
      * A resolved attribute.
-     * 
+     *
      * <p>Resolved attributes are a neutral construct that represent both simple and
      * complex attribute data structures that might be found in SAML assertions
      * or obtained from other sources.
-     * 
+     *
      * <p>Attributes consist of an id/name that is locally unique (that is, unique to a
      * configuration at any given point in time) and zero or more values. Values can
      * be of any type or structure, but will generally be made available to applications
      * only if a serialized string form exists. More complex values can be used with
-     * access control plugins that understand them, however. 
+     * access control plugins and other components that understand them, however.
      */
     class SHIBSP_API Attribute
     {
@@ -56,178 +55,169 @@ namespace shibsp {
     protected:
         /**
          * Constructor
-         * 
-         * @param id    Attribute identifier 
+         *
+         * @param ids   array with primary identifier in first position, followed by any aliases
          */
-        Attribute(const char* id) : m_id(id ? id : ""), m_caseSensitive(true) {
-        }
+        Attribute(const std::vector<std::string>& ids);
 
         /**
          * Constructs based on a remoted Attribute.
-         * 
+         *
          * <p>This allows Attribute objects to be recreated after marshalling.
          * The DDF supplied must be a struct containing a single list member named
          * with the Attribute's "id" and containing the values.
-         * 
+         *
          * @param in    input object containing marshalled Attribute
          */
-        Attribute(DDF& in) : m_caseSensitive(in["case_insensitive"].isnull()) {
-            const char* id = in.first().name();
-            if (id && *id)
-                m_id = id;
-            else
-                throw AttributeException("No id found in marshalled attribute content.");
-        }
-        
+        Attribute(DDF& in);
 
         /**
          * Maintains a copy of serialized attribute values, when possible.
-         * 
+         *
          * <p>Implementations should maintain the array when values are added or removed.
          */
         mutable std::vector<std::string> m_serialized;
 
     public:
-        virtual ~Attribute() {}
-        
+        virtual ~Attribute();
+
         /**
          * Returns the Attribute identifier.
-         * 
-         * @return Attribute identifier
+         *
+         * @return the Attribute identifier
+         */
+        const char* getId() const;
+
+        /**
+         * Returns all of the effective names for the Attribute.
+         *
+         * @return immutable array of identifiers, with the primary ID in the first position
+         */
+        const std::vector<std::string>& getAliases() const;
+
+        /**
+         * Returns all of the effective names for the Attribute.
+         *
+         * @return mutable array of identifiers, with the primary ID in the first position
          */
-        const char* getId() const {
-            return m_id.c_str();
-        }
+        std::vector<std::string>& getAliases();
 
         /**
          * Sets whether case sensitivity should apply to basic value comparisons.
          *
          * @param caseSensitive  true iff value comparisons should be case sensitive
          */
-        void setCaseSensitive(bool caseSensitive) {
-            m_caseSensitive = caseSensitive;
-        }
+        void setCaseSensitive(bool caseSensitive);
+
+        /**
+         * Sets whether the attribute should be exported for CGI use.
+         *
+         * @param export  true iff the attribute should <strong>NOT</strong> be exported
+         */
+        void setInternal(bool internal);
 
         /**
          * Indicates whether case sensitivity should apply to basic value comparisons.
          *
          * @return  true iff value comparisons should be case sensitive
          */
-        bool isCaseSensitive() const {
-            return m_caseSensitive;
-        }
-        
+        bool isCaseSensitive() const;
+
+        /**
+         * Indicates whether the attribute should be exported for CGI use.
+         *
+         * @return  true iff the attribute should <strong>NOT</strong> be exported
+         */
+        bool isInternal() const;
+
         /**
          * Returns the number of values.
-         * 
+         *
          * @return  number of values
          */
-        virtual size_t valueCount() const {
-            return m_serialized.size();
-        }
-        
+        virtual size_t valueCount() const;
+
         /**
          * Returns serialized Attribute values encoded as UTF-8 strings.
-         * 
+         *
          * @return  an immutable vector of values
          */
-        virtual const std::vector<std::string>& getSerializedValues() const {
-            return m_serialized;
-        }
-        
+        virtual const std::vector<std::string>& getSerializedValues() const;
+
         /**
          * Informs the Attribute that values have changed and any serializations
-         * must be cleared. 
+         * must be cleared.
          */
         virtual void clearSerializedValues()=0;
-        
+
         /**
          * Gets the string equivalent of the value at the specified position (starting from zero).
          *
          * @param index position of value
-         * @return the specified value in its "string" form, or NULL if undefined
+         * @return the specified value in its "string" form, or nullptr if undefined
          */
-        virtual const char* getString(size_t index) const {
-            return m_serialized[index].c_str();
-        }
+        virtual const char* getString(size_t index) const;
 
         /**
          * Gets the "scope" of the value at the specified position (starting from zero).
          *
          * @param index position of value
-         * @return the specified value's "scope", or NULL if attribute is unscoped
+         * @return the specified value's "scope", or nullptr if attribute is unscoped
          */
-        virtual const char* getScope(size_t index) const {
-            return NULL;
-        }
+        virtual const char* getScope(size_t index) const;
 
         /**
          * Removes the value at the specified position (starting from zero).
          *
          * @param index position of value to remove
          */
-        virtual void removeValue(size_t index) {
-            if (index < m_serialized.size())
-                m_serialized.erase(m_serialized.begin() + index);
-        }
+        virtual void removeValue(size_t index);
 
         /**
          * Marshalls an Attribute for remoting.
-         * 
+         *
          * <p>This allows Attribute objects to be communicated across process boundaries
          * without excess XML parsing. The DDF returned must be a struct containing
          * a single list member named with the Attribute's "id". The name of the struct
          * should contain the registered name of the Attribute implementation.
          */
-        virtual DDF marshall() const {
-            DDF ddf(NULL);
-            ddf.structure().addmember(m_id.c_str()).list();
-            if (!m_caseSensitive)
-                ddf.addmember("case_insensitive");
-            return ddf;
-        }
-        
+        virtual DDF marshall() const;
+
         /**
          * Unmarshalls a remoted Attribute.
-         * 
+         *
          * @param in    remoted Attribute data
-         * @return  a resolved Attribute of the proper subclass 
+         * @return  a resolved Attribute of the proper subclass
          */
         static Attribute* unmarshall(DDF& in);
-        
+
         /** A function that unmarshalls remoted data into the proper Attribute subclass. */
         typedef Attribute* AttributeFactory(DDF& in);
 
         /**
          * Registers an AttributeFactory function for a given attribute "type".
-         * 
+         *
          * @param type      string used at the root of remoted Attribute structures
          * @param factory   factory function
-         */        
-        static void registerFactory(const char* type, AttributeFactory* factory) {
-            m_factoryMap[type] = factory;
-        }
+         */
+        static void registerFactory(const char* type, AttributeFactory* factory);
 
         /**
          * Deregisters an AttributeFactory function for a given attribute "type".
-         * 
+         *
          * @param type      string used at the root of remoted Attribute structures
-         */        
-        static void deregisterFactory(const char* type) {
-            m_factoryMap.erase(type);
-        }
+         */
+        static void deregisterFactory(const char* type);
 
         /**
          * Clears the map of factories.
          */
-        static void deregisterFactories() {
-            m_factoryMap.clear();
-        }
-        
+        static void deregisterFactories();
+
     private:
         static std::map<std::string,AttributeFactory*> m_factoryMap;
-        std::string m_id;
-        bool m_caseSensitive;
+        std::vector<std::string> m_id;
+        bool m_caseSensitive,m_internal;
     };
 
 #if defined (_MSC_VER)
@@ -236,7 +226,7 @@ namespace shibsp {
 
     /** Registers built-in Attribute types into the runtime. */
     void registerAttributeFactories();
-    
+
 };
 
 #endif /* __shibsp_attribute_h__ */