00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "dataformfield.h"
00014 #include "dataformbase.h"
00015 #include "tag.h"
00016
00017 namespace gloox
00018 {
00019
00020 DataFormField::DataFormField( DataFormFieldType type )
00021 : m_type( type ), m_required( false )
00022 {
00023 }
00024
00025 DataFormField::DataFormField( const std::string& name, const std::string& value,
00026 const std::string& label, DataFormFieldType type )
00027 : m_name( name ), m_label( label ), m_type( type ), m_required( false )
00028 {
00029 m_values.push_back( value );
00030 }
00031
00032 DataFormField::DataFormField( Tag *tag )
00033 : m_type( FieldTypeInvalid ), m_required( false )
00034 {
00035 if( !tag )
00036 return;
00037
00038 if( tag->hasAttribute( "type", "boolean" ) )
00039 m_type = FieldTypeBoolean;
00040 else if( tag->hasAttribute( "type", "fixed" ) )
00041 m_type = FieldTypeFixed;
00042 else if( tag->hasAttribute( "type", "hidden" ) )
00043 m_type = FieldTypeHidden;
00044 else if( tag->hasAttribute( "type", "jid-multi" ) )
00045 m_type = FieldTypeJidMulti;
00046 else if( tag->hasAttribute( "type", "jid-single" ) )
00047 m_type = FieldTypeJidSingle;
00048 else if( tag->hasAttribute( "type", "list-multi" ) )
00049 m_type = FieldTypeListMulti;
00050 else if( tag->hasAttribute( "type", "list-single" ) )
00051 m_type = FieldTypeListSingle;
00052 else if( tag->hasAttribute( "type", "text-multi" ) )
00053 m_type = FieldTypeTextMulti;
00054 else if( tag->hasAttribute( "type", "text-private" ) )
00055 m_type = FieldTypeTextPrivate;
00056 else if( tag->hasAttribute( "type", "text-single" ) )
00057 m_type = FieldTypeTextSingle;
00058 else if( !tag->hasAttribute( "type" ) && !tag->name().empty() )
00059 m_type = FieldTypeNone;
00060
00061 if( tag->hasAttribute( "var" ) )
00062 m_name = tag->findAttribute( "var" );
00063
00064 if( tag->hasAttribute( "label" ) )
00065 m_label = tag->findAttribute( "label" );
00066
00067 const Tag::TagList& l = tag->children();
00068 Tag::TagList::const_iterator it = l.begin();
00069 for( ; it != l.end(); ++it )
00070 {
00071 if( (*it)->name() == "desc" )
00072 m_desc = (*it)->cdata();
00073 else if( (*it)->name() == "required" )
00074 m_required = true;
00075 else if( (*it)->name() == "value" )
00076 {
00077 if( m_type == FieldTypeTextMulti || m_type == FieldTypeListMulti || m_type == FieldTypeJidMulti )
00078 addValue( (*it)->cdata() );
00079 else
00080 setValue( (*it)->cdata() );
00081 }
00082 else if( (*it)->name() == "option" )
00083 {
00084 Tag *v = (*it)->findChild( "value" );
00085 if( v )
00086 m_options[(*it)->findAttribute( "label" )] = v->cdata();
00087 }
00088 }
00089
00090 }
00091
00092 DataFormField::~DataFormField()
00093 {
00094 }
00095
00096 Tag* DataFormField::tag() const
00097 {
00098 if( m_type == FieldTypeInvalid )
00099 return 0;
00100
00101 Tag *field = new Tag( "field" );
00102
00103 switch( m_type )
00104 {
00105 case FieldTypeBoolean:
00106 field->addAttribute( "type", "boolean" );
00107 break;
00108 case FieldTypeFixed:
00109 field->addAttribute( "type", "fixed" );
00110 break;
00111 case FieldTypeHidden:
00112 field->addAttribute( "type", "hidden" );
00113 break;
00114 case FieldTypeJidMulti:
00115 field->addAttribute( "type", "jid-multi" );
00116 break;
00117 case FieldTypeJidSingle:
00118 field->addAttribute( "type", "jid-single" );
00119 break;
00120 case FieldTypeListMulti:
00121 field->addAttribute( "type", "list-multi" );
00122 break;
00123 case FieldTypeListSingle:
00124 field->addAttribute( "type", "list-single" );
00125 break;
00126 case FieldTypeTextMulti:
00127 field->addAttribute( "type", "text-multi" );
00128 break;
00129 case FieldTypeTextPrivate:
00130 field->addAttribute( "type", "text-private" );
00131 break;
00132 case FieldTypeTextSingle:
00133 field->addAttribute( "type", "text-single" );
00134 break;
00135 default:
00136 break;
00137 }
00138
00139 field->addAttribute( "var", m_name );
00140 field->addAttribute( "label", m_label );
00141 if( m_required )
00142 new Tag( field, "required" );
00143
00144 if( !m_desc.empty() )
00145 new Tag( field, "desc", m_desc );
00146
00147 if( m_type == FieldTypeListSingle || m_type == FieldTypeListMulti )
00148 {
00149 StringMap::const_iterator it = m_options.begin();
00150 for( ; it != m_options.end(); ++it )
00151 {
00152 Tag *option = new Tag( field, "option" );
00153 option->addAttribute( "label", (*it).first );
00154 new Tag( option, "value", (*it).second );
00155 }
00156 }
00157 else if( m_type == FieldTypeBoolean )
00158 {
00159 if( m_values.size() == 0 || m_values.front() == "false" || m_values.front() == "0" )
00160 new Tag( field, "value", "0" );
00161 else
00162 new Tag( field, "value", "1" );
00163 }
00164
00165 if( m_type == FieldTypeTextMulti || m_type == FieldTypeListMulti || m_type == FieldTypeJidMulti )
00166 {
00167 StringList::const_iterator it = m_values.begin();
00168 for( ; it != m_values.end() ; ++it )
00169 new Tag( field, "value", (*it) );
00170 }
00171
00172 if( m_values.size() && !( m_type == FieldTypeTextMulti || m_type == FieldTypeListMulti
00173 || m_type == FieldTypeBoolean || m_type == FieldTypeJidMulti ) )
00174 new Tag( field, "value", m_values.front() );
00175
00176 return field;
00177 }
00178
00179 }