SSPCPP-568 The INSTALL_DIR has to have a trailing backslash or else keygen fails.
[shibboleth/cpp-sp.git] / shibsp / attribute / ScopedAttribute.h
1 /**
2  * Licensed to the University Corporation for Advanced Internet
3  * Development, Inc. (UCAID) under one or more contributor license
4  * agreements. See the NOTICE file distributed with this work for
5  * additional information regarding copyright ownership.
6  *
7  * UCAID licenses this file to you under the Apache License,
8  * Version 2.0 (the "License"); you may not use this file except
9  * in compliance with the License. You may obtain a copy of the
10  * License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
17  * either express or implied. See the License for the specific
18  * language governing permissions and limitations under the License.
19  */
20
21 /**
22  * @file shibsp/attribute/ScopedAttribute.h
23  * 
24  * An Attribute whose values are relations of a value and a scope.
25  */
26
27 #ifndef __shibsp_scopedattr_h__
28 #define __shibsp_scopedattr_h__
29
30 #include <shibsp/attribute/Attribute.h>
31
32 namespace shibsp {
33
34 #if defined (_MSC_VER)
35     #pragma warning( push )
36     #pragma warning( disable : 4251 )
37 #endif
38
39     /**
40      * An Attribute whose values are relations of a value and a scope.
41      * 
42      * <p>In practice, scoped attributes are simple pairs of strings instead
43      * of a single string. They can be expressed as a string easily using a delimeter,
44      * typically an '@' symbol. The scope concept allows certain kinds of filtering to
45      * be performed more intelligently and efficiently, although not all scoped
46      * attributes can be effectively filtered (e.g. if the set of scope values is
47      * unconstrained).
48      */
49     class SHIBSP_API ScopedAttribute : public Attribute
50     {
51     public:
52         /**
53          * Constructor.
54          * 
55          * @param ids   array with primary identifier in first position, followed by any aliases
56          * @param delimeter value/scope delimeter when serializing
57          */
58         ScopedAttribute(const std::vector<std::string>& ids, char delimeter='@');
59
60         /**
61          * Constructs based on a remoted ScopedAttribute.
62          * 
63          * @param in    input object containing marshalled ScopedAttribute
64          */
65         ScopedAttribute(DDF& in);
66         
67         virtual ~ScopedAttribute();
68
69         /**
70          * Returns the set of values encoded as UTF-8 strings.
71          * 
72          * <p>Each compound value is a pair containing the simple value and the scope. 
73          * 
74          * @return  a mutable vector of the values
75          */
76         std::vector< std::pair<std::string,std::string> >& getValues();
77
78         /**
79          * Returns the set of values encoded as UTF-8 strings.
80          * 
81          * <p>Each compound value is a pair containing the simple value and the scope. 
82          * 
83          * @return  an immutable vector of the values
84          */
85         const std::vector< std::pair<std::string,std::string> >& getValues() const;
86
87         // Virtual function overrides.
88         size_t valueCount() const;
89         void clearSerializedValues();
90         const char* getString(size_t index) const;
91         const char* getScope(size_t index) const;
92         void removeValue(size_t index);
93         const std::vector<std::string>& getSerializedValues() const;
94         DDF marshall() const;
95     
96     private:
97         char m_delimeter;
98         std::vector< std::pair<std::string,std::string> > m_values;
99     };
100
101 #if defined (_MSC_VER)
102     #pragma warning( pop )
103 #endif
104
105 };
106
107 #endif /* __shibsp_scopedattr_h__ */