gloox  0.9.9.12
dataformfield.cpp
1 /*
2  Copyright (c) 2005-2008 by Jakob Schroeter <js@camaya.net>
3  This file is part of the gloox library. http://camaya.net/gloox
4 
5  This software is distributed under a license. The full license
6  agreement can be found in the file LICENSE in this distribution.
7  This software may not be copied, modified, sold or distributed
8  other than expressed in the named license agreement.
9 
10  This software is distributed without any warranty.
11 */
12 
13 #include "dataformfield.h"
14 #include "dataformbase.h"
15 #include "tag.h"
16 
17 namespace gloox
18 {
19 
21  : m_type( type ), m_required( false )
22  {
23  }
24 
25  DataFormField::DataFormField( const std::string& name, const std::string& value,
26  const std::string& label, DataFormFieldType type )
27  : m_name( name ), m_label( label ), m_type( type ), m_required( false )
28  {
29  m_values.push_back( value );
30  }
31 
33  : m_type( FieldTypeInvalid ), m_required( false )
34  {
35  if( !tag )
36  return;
37 
38  if( tag->hasAttribute( "type", "boolean" ) )
39  m_type = FieldTypeBoolean;
40  else if( tag->hasAttribute( "type", "fixed" ) )
41  m_type = FieldTypeFixed;
42  else if( tag->hasAttribute( "type", "hidden" ) )
43  m_type = FieldTypeHidden;
44  else if( tag->hasAttribute( "type", "jid-multi" ) )
45  m_type = FieldTypeJidMulti;
46  else if( tag->hasAttribute( "type", "jid-single" ) )
47  m_type = FieldTypeJidSingle;
48  else if( tag->hasAttribute( "type", "list-multi" ) )
49  m_type = FieldTypeListMulti;
50  else if( tag->hasAttribute( "type", "list-single" ) )
51  m_type = FieldTypeListSingle;
52  else if( tag->hasAttribute( "type", "text-multi" ) )
53  m_type = FieldTypeTextMulti;
54  else if( tag->hasAttribute( "type", "text-private" ) )
55  m_type = FieldTypeTextPrivate;
56  else if( tag->hasAttribute( "type", "text-single" ) )
57  m_type = FieldTypeTextSingle;
58  else if( !tag->hasAttribute( "type" ) && !tag->name().empty() )
59  m_type = FieldTypeNone;
60 
61  if( tag->hasAttribute( "var" ) )
62  m_name = tag->findAttribute( "var" );
63 
64  if( tag->hasAttribute( "label" ) )
65  m_label = tag->findAttribute( "label" );
66 
67  const Tag::TagList& l = tag->children();
68  Tag::TagList::const_iterator it = l.begin();
69  for( ; it != l.end(); ++it )
70  {
71  if( (*it)->name() == "desc" )
72  m_desc = (*it)->cdata();
73  else if( (*it)->name() == "required" )
74  m_required = true;
75  else if( (*it)->name() == "value" )
76  {
77  if( m_type == FieldTypeTextMulti || m_type == FieldTypeListMulti || m_type == FieldTypeJidMulti )
78  addValue( (*it)->cdata() );
79  else
80  setValue( (*it)->cdata() );
81  }
82  else if( (*it)->name() == "option" )
83  {
84  Tag *v = (*it)->findChild( "value" );
85  if( v )
86  m_options[(*it)->findAttribute( "label" )] = v->cdata();
87  }
88  }
89 
90  }
91 
93  {
94  }
95 
97  {
98  if( m_type == FieldTypeInvalid )
99  return 0;
100 
101  Tag *field = new Tag( "field" );
102 
103  switch( m_type )
104  {
105  case FieldTypeBoolean:
106  field->addAttribute( "type", "boolean" );
107  break;
108  case FieldTypeFixed:
109  field->addAttribute( "type", "fixed" );
110  break;
111  case FieldTypeHidden:
112  field->addAttribute( "type", "hidden" );
113  break;
114  case FieldTypeJidMulti:
115  field->addAttribute( "type", "jid-multi" );
116  break;
117  case FieldTypeJidSingle:
118  field->addAttribute( "type", "jid-single" );
119  break;
120  case FieldTypeListMulti:
121  field->addAttribute( "type", "list-multi" );
122  break;
123  case FieldTypeListSingle:
124  field->addAttribute( "type", "list-single" );
125  break;
126  case FieldTypeTextMulti:
127  field->addAttribute( "type", "text-multi" );
128  break;
130  field->addAttribute( "type", "text-private" );
131  break;
132  case FieldTypeTextSingle:
133  field->addAttribute( "type", "text-single" );
134  break;
135  default:
136  break;
137  }
138 
139  field->addAttribute( "var", m_name );
140  field->addAttribute( "label", m_label );
141  if( m_required )
142  new Tag( field, "required" );
143 
144  if( !m_desc.empty() )
145  new Tag( field, "desc", m_desc );
146 
147  if( m_type == FieldTypeListSingle || m_type == FieldTypeListMulti )
148  {
149  StringMap::const_iterator it = m_options.begin();
150  for( ; it != m_options.end(); ++it )
151  {
152  Tag *option = new Tag( field, "option" );
153  option->addAttribute( "label", (*it).first );
154  new Tag( option, "value", (*it).second );
155  }
156  }
157  else if( m_type == FieldTypeBoolean )
158  {
159  if( m_values.size() == 0 || m_values.front() == "false" || m_values.front() == "0" )
160  new Tag( field, "value", "0" );
161  else
162  new Tag( field, "value", "1" );
163  }
164 
165  if( m_type == FieldTypeTextMulti || m_type == FieldTypeListMulti || m_type == FieldTypeJidMulti )
166  {
167  StringList::const_iterator it = m_values.begin();
168  for( ; it != m_values.end() ; ++it )
169  new Tag( field, "value", (*it) );
170  }
171 
172  if( m_values.size() && !( m_type == FieldTypeTextMulti || m_type == FieldTypeListMulti
173  || m_type == FieldTypeBoolean || m_type == FieldTypeJidMulti ) )
174  new Tag( field, "value", m_values.front() );
175 
176  return field;
177  }
178 
179 }