VS10 solution files, convert from NULL macro to nullptr.
[shibboleth/sp.git] / shibsp / attribute / Attribute.h
index b533296..c734909 100644 (file)
@@ -1,6 +1,6 @@
 /*
- *  Copyright 2001-2006 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
@@ -16,7 +16,7 @@
 
 /**
  * @file shibsp/attribute/Attribute.h
- * 
+ *
  * A resolved attribute.
  */
 
 
 #include <shibsp/remoting/ddf.h>
 
+#include <map>
 #include <string>
 #include <vector>
 
 namespace shibsp {
 
+#if defined (_MSC_VER)
+    #pragma warning( push )
+    #pragma warning( disable : 4251 )
+#endif
+
     /**
      * 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
     {
@@ -49,63 +55,178 @@ namespace shibsp {
     protected:
         /**
          * Constructor
-         * 
-         * @param id    Attribute identifier 
+         *
+         * @param ids   array with primary identifier in first position, followed by any aliases
+         */
+        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(const char* id) : m_id(id) {}
+        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 {
-            return m_id.c_str();
-        }
-        
+        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
+         */
+        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);
+
+        /**
+         * 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;
+
+        /**
+         * 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;
+
         /**
-         * Returns serialized attribute values encoded as UTF-8 strings.
-         * 
+         * 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. 
+         * Informs the Attribute that values have changed and any serializations
+         * 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 nullptr if undefined
+         */
+        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 nullptr if attribute is unscoped
+         */
+        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);
+
         /**
          * Marshalls an Attribute for remoting.
-         * 
-         * This allows Attribute objects to be communicated across process boundaries
+         *
+         * <p>This allows Attribute objects to be communicated across process boundaries
          * without excess XML parsing. The DDF returned must be a struct containing
-         * a string member called "id" and a list called "values". The name of the struct
-         * should contain the registered name of the Attribute implementation.  
-         */
-        virtual DDF marshall() const {
-            DDF ddf(NULL);
-            ddf.structure().addmember("id").string(m_id.c_str());
-            return ddf;
-        }
-        
+         * 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;
+
+        /**
+         * Unmarshalls a remoted Attribute.
+         *
+         * @param in    remoted Attribute data
+         * @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);
+
+        /**
+         * 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);
+
+        /**
+         * Clears the map of factories.
+         */
+        static void deregisterFactories();
+
     private:
-        std::string m_id;
+        static std::map<std::string,AttributeFactory*> m_factoryMap;
+        std::vector<std::string> m_id;
+        bool m_caseSensitive,m_internal;
     };
 
+#if defined (_MSC_VER)
+    #pragma warning( pop )
+#endif
+
+    /** Registers built-in Attribute types into the runtime. */
+    void registerAttributeFactories();
+
 };
 
 #endif /* __shibsp_attribute_h__ */