dataformfield.cpp

00001 /*
00002   Copyright (c) 2005-2007 by Jakob Schroeter <js@camaya.net>
00003   This file is part of the gloox library. http://camaya.net/gloox
00004 
00005   This software is distributed under a license. The full license
00006   agreement can be found in the file LICENSE in this distribution.
00007   This software may not be copied, modified, sold or distributed
00008   other than expressed in the named license agreement.
00009 
00010   This software is distributed without any warranty.
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 }

Generated on Sat Nov 10 08:50:27 2007 for gloox by  doxygen 1.5.3-20071008