gloox
1.0
|
00001 /* 00002 Copyright (c) 2005-2009 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 00014 #include "dataform.h" 00015 #include "dataformfield.h" 00016 #include "dataformitem.h" 00017 #include "dataformreported.h" 00018 #include "util.h" 00019 #include "tag.h" 00020 00021 namespace gloox 00022 { 00023 00024 DataForm::DataForm( FormType type, const StringList& instructions, const std::string& title ) 00025 : StanzaExtension( ExtDataForm ), 00026 m_type( type ), m_instructions( instructions ), m_title( title ), m_reported( 0 ) 00027 { 00028 } 00029 00030 DataForm::DataForm( FormType type, const std::string& title ) 00031 : StanzaExtension( ExtDataForm ), 00032 m_type( type ), m_title( title ), m_reported( 0 ) 00033 { 00034 } 00035 00036 DataForm::DataForm( const Tag* tag ) 00037 : StanzaExtension( ExtDataForm ), 00038 m_type( TypeInvalid ), m_reported( 0 ) 00039 { 00040 parse( tag ); 00041 } 00042 00043 DataForm::DataForm( const DataForm& form ) 00044 : StanzaExtension( ExtDataForm ), DataFormFieldContainer( form ), 00045 m_type( form.m_type ), m_instructions( form.m_instructions ), 00046 m_title( form.m_title ), m_reported( form.m_reported ? new DataFormReported( form.m_reported->tag() ) : 0 ) 00047 { 00048 } 00049 00050 DataForm::~DataForm() 00051 { 00052 util::clearList( m_items ); 00053 delete m_reported; 00054 m_reported = NULL; 00055 } 00056 00057 static const char* dfTypeValues[] = 00058 { 00059 "form", "submit", "cancel", "result" 00060 }; 00061 00062 bool DataForm::parse( const Tag* tag ) 00063 { 00064 if( !tag || tag->xmlns() != XMLNS_X_DATA || tag->name() != "x" ) 00065 return false; 00066 00067 const std::string& type = tag->findAttribute( TYPE ); 00068 if( type.empty() ) 00069 m_type = TypeForm; 00070 else 00071 { 00072 m_type = (FormType)util::lookup( type, dfTypeValues ); 00073 if( m_type == TypeInvalid ) 00074 return false; 00075 } 00076 00077 const TagList& l = tag->children(); 00078 TagList::const_iterator it = l.begin(); 00079 for( ; it != l.end(); ++it ) 00080 { 00081 if( (*it)->name() == "title" ) 00082 m_title = (*it)->cdata(); 00083 else if( (*it)->name() == "instructions" ) 00084 m_instructions.push_back( (*it)->cdata() ); 00085 else if( (*it)->name() == "field" ) 00086 m_fields.push_back( new DataFormField( (*it) ) ); 00087 else if( (*it)->name() == "reported" ) 00088 { 00089 if( m_reported == NULL ) 00090 m_reported = new DataFormReported( (*it) ); 00091 // else - Invalid data form - only one "reported" is allowed 00092 } 00093 else if( (*it)->name() == "item" ) 00094 m_items.push_back( new DataFormItem( (*it) ) ); 00095 } 00096 00097 return true; 00098 } 00099 00100 const std::string& DataForm::filterString() const 00101 { 00102 static const std::string filter = "/message/x[@xmlns='" + XMLNS_X_DATA + "']"; 00103 return filter; 00104 } 00105 00106 Tag* DataForm::tag() const 00107 { 00108 if( m_type == TypeInvalid ) 00109 return 0; 00110 00111 Tag* x = new Tag( "x" ); 00112 x->setXmlns( XMLNS_X_DATA ); 00113 x->addAttribute( TYPE, util::lookup( m_type, dfTypeValues ) ); 00114 if( !m_title.empty() ) 00115 new Tag( x, "title", m_title ); 00116 00117 StringList::const_iterator it_i = m_instructions.begin(); 00118 for( ; it_i != m_instructions.end(); ++it_i ) 00119 new Tag( x, "instructions", (*it_i) ); 00120 00121 FieldList::const_iterator it = m_fields.begin(); 00122 for( ; it != m_fields.end(); ++it ) 00123 x->addChild( (*it)->tag() ); 00124 00125 if( m_reported != NULL ) 00126 { 00127 x->addChild( m_reported->tag() ); 00128 } 00129 00130 ItemList::const_iterator iti = m_items.begin(); 00131 for( ; iti != m_items.end(); ++iti ) 00132 x->addChild( (*iti)->tag() ); 00133 00134 return x; 00135 } 00136 00137 }