dataformfactory.cpp   dataformfactory.cpp 
skipping to change at line 29 skipping to change at line 29
** **
** You should have received a copy of the GNU General Public License ** You should have received a copy of the GNU General Public License
** along with this program. If not, see http://www.gnu.org/licenses/. ** along with this program. If not, see http://www.gnu.org/licenses/.
** $JREEN_END_LICENSE$ ** $JREEN_END_LICENSE$
** **
*************************************************************************** */ *************************************************************************** */
#include "dataformfactory_p.h" #include "dataformfactory_p.h"
#include "jstrings.h" #include "jstrings.h"
#include <QXmlStreamWriter> #include <QXmlStreamWriter>
#include <QSize>
#include <QUrl>
#include "util.h" #include "util.h"
#include "multimediadatafactory_p.h"
#include "logger.h" #include "logger.h"
#define NS_DATAFORM QLatin1String("jabber:x:data") #define NS_DATAFORM QLatin1String("jabber:x:data")
#define NS_MEDIA QLatin1String("urn:xmpp:media-element")
namespace Jreen { namespace Jreen {
using namespace Util; using namespace Util;
class DataFormOptionParser : XmlStreamFactory<const QPair<QString, QString> > class DataFormOptionParser : XmlStreamFactory<const QPair<QString, QString> >
{ {
public: public:
DataFormOptionParser() DataFormOptionParser()
{ {
skipping to change at line 113 skipping to change at line 115
m_label.clear(); m_label.clear();
m_value.clear(); m_value.clear();
m_atValue = 0; m_atValue = 0;
} }
int m_depth : 31; int m_depth : 31;
int m_atValue : 1; int m_atValue : 1;
QString m_label; QString m_label;
QString m_value; QString m_value;
}; };
class DataFormMediaParser : public XmlStreamFactory<DataFormMedia>
{
public:
DataFormMediaParser() : m_depth(0), m_state(AtNowhere)
{
}
virtual ~DataFormMediaParser()
{
}
virtual bool canParse(const QStringRef &name, const QStringRef &uri,
const QXmlStreamAttributes
&attributes)
{
Q_UNUSED(attributes);
return name == QLatin1String("media") && uri == NS_MEDIA;
}
virtual void handleStartElement(const QStringRef &name, const QStrin
gRef &uri,
cons
t QXmlStreamAttributes &attributes)
{
Q_UNUSED(name);
Q_UNUSED(uri);
m_depth++;
if(m_depth == 1) {
m_state = AtNowhere;
m_media = DataFormMedia::Ptr::create();
} else if (m_depth == 2 && name == QLatin1String("uri")) {
m_state = AtUri;
m_uriType = attributes.value(QLatin1String("type")).
toString();
}
}
virtual void handleEndElement(const QStringRef &name, const QStringR
ef &uri)
{
Q_UNUSED(name);
Q_UNUSED(uri);
if (m_depth == 2)
m_state = AtNowhere;
m_depth--;
}
virtual void handleCharacterData(const QStringRef &text)
{
if(m_depth == 2 && m_state == AtUri) {
m_media->appendUri(text.toString(), m_uriType);
}
}
virtual void serialize(DataFormMedia *media, QXmlStreamWriter *write
r)
{
writer->writeStartElement(QLatin1String("media"));
const QSize size = media->size();
if (size.width() >= 0)
writer->writeAttribute(QLatin1String("width"), QStri
ng::number(size.width()));
if (size.height() >= 0)
writer->writeAttribute(QLatin1String("height"), QStr
ing::number(size.height()));
writer->writeDefaultNamespace(NS_MEDIA);
foreach (const DataFormMedia::Uri &uri, media->uries()) {
writer->writeStartElement(QLatin1String("uri"));
writer->writeAttribute(QLatin1String("type"), uri.ty
pe());
writer->writeCharacters(uri.url().toString());
writer->writeEndElement();
}
writer->writeEndElement();
}
DataFormMedia::Ptr create()
{
DataFormMedia::Ptr result;
qSwap(result, m_media);
return result;
}
private:
int m_depth;
enum State {
AtNowhere,
AtUri
} m_state;
QString m_uriType;
DataFormMedia::Ptr m_media;
};
static const char* datafield_types[] = { static const char* datafield_types[] = {
"boolean", "boolean",
"fixed", "fixed",
"hidden", "hidden",
"jid-multi", "jid-multi",
"jid-single", "jid-single",
"list-multi", "list-multi",
"list-single", "list-single",
"text-multi", "text-multi",
"text-private", "text-private",
"text-single" "text-single",
""
}; };
class DataFormFieldParser : XmlStreamFactory<DataFormField> class DataFormFieldParser : XmlStreamFactory<DataFormField>
{ {
public: public:
DataFormFieldParser() DataFormFieldParser()
{ {
m_depth = 0; m_depth = 0;
m_state = AtNowhere; m_state = AtNowhere;
} }
skipping to change at line 158 skipping to change at line 241
m_depth++; m_depth++;
if(m_depth == 1) { if(m_depth == 1) {
m_type = strToEnum<DataFormField::Type>(attributes.v alue(QLatin1String("type")),datafield_types); m_type = strToEnum<DataFormField::Type>(attributes.v alue(QLatin1String("type")),datafield_types);
m_var = attributes.value(QLatin1String("var")).toStr ing(); m_var = attributes.value(QLatin1String("var")).toStr ing();
m_label = attributes.value(QLatin1String("label")).t oString(); m_label = attributes.value(QLatin1String("label")).t oString();
} else if (m_depth == 2) { } else if (m_depth == 2) {
if(name == QLatin1String("value")) { if(name == QLatin1String("value")) {
m_state = AtValue; m_state = AtValue;
} else if(m_optionParser.canParse(name,uri,attribute s)) { } else if(m_optionParser.canParse(name,uri,attribute s)) {
m_state = AtOption; m_state = AtOption;
} else if (m_mediaParser.canParse(name, uri, attribu
tes)) {
m_state = AtMedia;
} else if(name == QLatin1String("required")) { } else if(name == QLatin1String("required")) {
m_state = AtRequied; m_state = AtRequied;
m_required = true; m_required = true;
} else { } else {
m_state = AtNowhere; m_state = AtNowhere;
} }
} }
if(m_state == AtOption) if(m_state == AtOption)
m_optionParser.handleStartElement(name,uri,attribute s); m_optionParser.handleStartElement(name,uri,attribute s);
else if(m_state == AtMedia)
m_mediaParser.handleStartElement(name, uri, attribut
es);
} }
virtual void handleEndElement(const QStringRef &name, const QStringR ef &uri) virtual void handleEndElement(const QStringRef &name, const QStringR ef &uri)
{ {
if(m_state == AtOption) { if(m_state == AtOption) {
m_optionParser.handleEndElement(name,uri); m_optionParser.handleEndElement(name,uri);
if(m_depth == 2) { if(m_depth == 2) {
Logger::debug() << m_optionParser.create(); Logger::debug() << m_optionParser.create();
m_options.append(m_optionParser.create()); m_options.append(m_optionParser.create());
} }
} else if(m_state == AtMedia) {
m_mediaParser.handleEndElement(name, uri);
if(m_depth == 2)
m_media = m_mediaParser.create();
} }
if (m_depth <= 2) if (m_depth <= 2)
m_state = AtNowhere; m_state = AtNowhere;
m_depth--; m_depth--;
} }
virtual void handleCharacterData(const QStringRef &text) virtual void handleCharacterData(const QStringRef &text)
{ {
switch(m_state) { switch(m_state) {
case AtValue: case AtValue:
m_values.append(text.toString()); m_values.append(text.toString());
break; break;
case AtOption: case AtOption:
m_optionParser.handleCharacterData(text); m_optionParser.handleCharacterData(text);
break;
case AtMedia:
m_mediaParser.handleCharacterData(text);
break;
default: default:
break; break;
} }
} }
virtual void serialize(DataFormField *field, QXmlStreamWriter *write r) virtual void serialize(DataFormField *field, QXmlStreamWriter *write r)
{ {
writer->writeStartElement(QLatin1String("field")); writer->writeStartElement(QLatin1String("field"));
writeAttribute(writer,QLatin1String("type"),enumToStr(field- >type(),datafield_types)); writeAttribute(writer,QLatin1String("type"),enumToStr(field- >type(),datafield_types));
writeAttribute(writer,QLatin1String("label"),field->descript ion()); writeAttribute(writer,QLatin1String("label"),field->descript ion());
writeAttribute(writer,QLatin1String("var"),field->var()); writeAttribute(writer,QLatin1String("var"),field->var());
skipping to change at line 222 skipping to change at line 317
} }
DataFormField create() DataFormField create()
{ {
DataFormField field; DataFormField field;
DataFormFieldPrivate *d = DataFormFieldPrivate::get(&field); DataFormFieldPrivate *d = DataFormFieldPrivate::get(&field);
d->var = m_var; d->var = m_var;
d->values = m_values; d->values = m_values;
d->label = m_label; d->label = m_label;
d->type = m_type; d->type = m_type;
d->options = m_options; d->options = m_options;
// Logger::debug() << m_label << m_var << field.var() << field. label() << d->var << d->label;
d->required = m_required; d->required = m_required;
d->media = m_media;
clear(); clear();
return field; return field;
} }
private: private:
enum State { enum State {
AtValue, AtValue,
AtOption, AtOption,
AtRequied, AtRequied,
AtMedia,
AtNowhere AtNowhere
}; };
void clear() { void clear() {
m_options.clear(); m_options.clear();
m_type = DataFormField::Invalid; m_type = DataFormField::Invalid;
m_label.clear(); m_label.clear();
m_var.clear(); m_var.clear();
m_values.clear(); m_values.clear();
m_media.clear();
m_required = false; m_required = false;
m_state = AtNowhere; m_state = AtNowhere;
} }
State m_state; State m_state;
// QScopedPointer<DataFormFieldPrivate> m_form;
int m_depth; int m_depth;
DataFormField::Type m_type; DataFormField::Type m_type;
QString m_label; QString m_label;
QString m_var; QString m_var;
QStringList m_values; QStringList m_values;
QList<QPair<QString, QString> > m_options; QList<QPair<QString, QString> > m_options;
bool m_required; bool m_required;
DataFormMedia::Ptr m_media;
DataFormOptionParser m_optionParser; DataFormOptionParser m_optionParser;
MultimediaDataFactory m_multimediaDataFactory; DataFormMediaParser m_mediaParser;
}; };
enum DataFormState { AtNowhere, AtTitle, AtInstruction, AtField }; enum DataFormState { AtNowhere, AtTitle, AtInstruction, AtField };
//static const char* dataform_states[] = { //static const char* dataform_states[] = {
// "title", // "title",
// "instruction", // "instruction",
// "field" // "field"
//}; //};
static const char* dataform_types[] = { static const char* dataform_types[] = {
"form", "form",
"submit", "submit",
"cancel", "cancel",
"result" "result"
}; };
class DataFormFactoryPrivate class JREEN_AUTOTEST_EXPORT DataFormFactoryPrivate
{ {
public: public:
void clear() void clear()
{ {
title.clear(); title.clear();
instruction.clear(); instruction.clear();
fields.clear(); fields.clear();
formType = DataForm::Invalid; formType = DataForm::Invalid;
} }
int depth; int depth;
skipping to change at line 323 skipping to change at line 422
{ {
Q_D(DataFormFactory); Q_D(DataFormFactory);
d->depth++; d->depth++;
if(d->depth == 1) { if(d->depth == 1) {
d->formType = strToEnum<DataForm::Type>(attributes.value(QLa tin1String("type")), dataform_types); d->formType = strToEnum<DataForm::Type>(attributes.value(QLa tin1String("type")), dataform_types);
} else if(d->depth == 2) { } else if(d->depth == 2) {
if(d->fieldParser.canParse(name, uri, attributes)) if(d->fieldParser.canParse(name, uri, attributes))
d->state = AtField; d->state = AtField;
else if(name == QLatin1String("title")) else if(name == QLatin1String("title"))
d->state = AtTitle; d->state = AtTitle;
else if(name == QLatin1String("instruction")) else if(name == QLatin1String("instructions"))
d->state = AtInstruction; d->state = AtInstruction;
else else
d->state = AtNowhere; d->state = AtNowhere;
} }
if(d->state == AtField) if(d->state == AtField)
d->fieldParser.handleStartElement(name,uri,attributes); d->fieldParser.handleStartElement(name,uri,attributes);
} }
void DataFormFactory::handleEndElement(const QStringRef &name, const QStrin gRef &uri) void DataFormFactory::handleEndElement(const QStringRef &name, const QStrin gRef &uri)
{ {
skipping to change at line 353 skipping to change at line 452
} }
d->depth--; d->depth--;
} }
void DataFormFactory::handleCharacterData(const QStringRef &text) void DataFormFactory::handleCharacterData(const QStringRef &text)
{ {
Q_D(DataFormFactory); Q_D(DataFormFactory);
switch(d->state) { switch(d->state) {
case AtTitle: case AtTitle:
d->title = text.toString(); d->title = text.toString();
break;
case AtInstruction: case AtInstruction:
d->instruction = text.toString(); d->instruction = text.toString();
break;
case AtField: case AtField:
d->fieldParser.handleCharacterData(text); d->fieldParser.handleCharacterData(text);
break;
default: default:
break; break;
} }
} }
void DataFormFactory::serialize(Payload *extension, QXmlStreamWriter *write r) void DataFormFactory::serialize(Payload *extension, QXmlStreamWriter *write r)
{ {
Q_D(DataFormFactory); Q_D(DataFormFactory);
DataForm *form = se_cast<DataForm*>(extension); DataForm *form = se_cast<DataForm*>(extension);
writer->writeStartElement(QLatin1String("x")); writer->writeStartElement(QLatin1String("x"));
skipping to change at line 379 skipping to change at line 481
writer->writeAttribute(QLatin1String("type"), enumToStr(form ->type(), dataform_types)); writer->writeAttribute(QLatin1String("type"), enumToStr(form ->type(), dataform_types));
writeTextElement(writer,QLatin1String("title"), form->title()); writeTextElement(writer,QLatin1String("title"), form->title());
// writer->writeTextElement(QLatin1String("instruction"), form->)); // writer->writeTextElement(QLatin1String("instruction"), form->));
d->fieldParser.serialize(*form, writer); d->fieldParser.serialize(*form, writer);
writer->writeEndElement(); writer->writeEndElement();
} }
Payload::Ptr DataFormFactory::createPayload() Payload::Ptr DataFormFactory::createPayload()
{ {
Q_D(DataFormFactory); Q_D(DataFormFactory);
DataForm *form = new DataForm(d->formType,d->title); DataForm *form = new DataForm(d->formType, d->title, d->instruction) ;
form->setFields(d->fields); form->setFields(d->fields);
d->clear(); d->clear();
return Payload::Ptr(form); return Payload::Ptr(form);
} }
} // namespace Jreen } // namespace Jreen
 End of changes. 22 change blocks. 
7 lines changed or deleted 120 lines changed or added

This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/