From bf96f3b0981b71452fde360c0ed12c5eb2488fc8 Mon Sep 17 00:00:00 2001 From: David Capel Date: Fri, 15 Aug 2008 12:24:51 +0000 Subject: [PATCH] Articles are now saved, as are plural personal pronouns. The personal pronouns were victim of my KEduVocWordFlag change, but the articles were victim of an API mixup: KEduVocIdentifier.articles() returned by value, and kvtml2reader was modifying the return value. Returning by reference solves the problem. Additionally I added some code to hopefully catch the null-d-pointer bug in KEduVocWordType. svn path=/trunk/KDE/kdeedu/libkdeedu/; revision=847463 --- keduvocdocument/keduvocarticle.cpp | 12 +++++++++--- keduvocdocument/keduvocidentifier.cpp | 4 ++-- keduvocdocument/keduvocidentifier.h | 4 ++-- keduvocdocument/keduvockvtml2reader.cpp | 1 - keduvocdocument/keduvockvtml2writer.cpp | 2 +- keduvocdocument/keduvocpersonalpronoun.cpp | 4 ++-- keduvocdocument/keduvoctranslation.cpp | 21 +++++++++++++++++++-- keduvocdocument/keduvocwordtype.cpp | 1 + 8 files changed, 36 insertions(+), 13 deletions(-) diff --git a/keduvocdocument/keduvocarticle.cpp b/keduvocdocument/keduvocarticle.cpp index 747d9a3..1f13d01 100644 --- a/keduvocdocument/keduvocarticle.cpp +++ b/keduvocdocument/keduvocarticle.cpp @@ -63,12 +63,12 @@ KEduVocArticle::~KEduVocArticle() QString KEduVocArticle::article(const KEduVocWordFlags& flags) { - return d->m_articles.value(flags); + return d->m_articles.value(flags & (KEduVocWordFlag::genders | KEduVocWordFlag::numbers | KEduVocWordFlag::Definite | KEduVocWordFlag::Indefinite)); } void KEduVocArticle::setArticle(const QString & article, const KEduVocWordFlags& flags) { - d->m_articles[flags] = article; + d->m_articles[flags & (KEduVocWordFlag::genders | KEduVocWordFlag::numbers | KEduVocWordFlag::Definite | KEduVocWordFlag::Indefinite)] = article; } @@ -79,7 +79,13 @@ bool KEduVocArticle::isArticle(const QString & article) const bool KEduVocArticle::isEmpty() { - return d->m_articles.isEmpty(); + // we don't count empty strings as articles + foreach(QString s, d->m_articles.values()) + { + if (!s.isEmpty()) + return false; + } + return true; } diff --git a/keduvocdocument/keduvocidentifier.cpp b/keduvocdocument/keduvocidentifier.cpp index 8b8e326..f6dea7b 100644 --- a/keduvocdocument/keduvocidentifier.cpp +++ b/keduvocdocument/keduvocidentifier.cpp @@ -103,12 +103,12 @@ void KEduVocIdentifier::setArticle( const KEduVocArticle& articles ) d->m_articles = articles; } -KEduVocArticle KEduVocIdentifier::article() const +KEduVocArticle& KEduVocIdentifier::article() const { return d->m_articles; } -KEduVocPersonalPronoun KEduVocIdentifier::personalPronouns() const +KEduVocPersonalPronoun& KEduVocIdentifier::personalPronouns() const { return d->m_personalPronouns; } diff --git a/keduvocdocument/keduvocidentifier.h b/keduvocdocument/keduvocidentifier.h index 2062288..d3bc90c 100644 --- a/keduvocdocument/keduvocidentifier.h +++ b/keduvocdocument/keduvocidentifier.h @@ -79,7 +79,7 @@ public: * Articles (a, the in English, el, la,... in Spanish) * @returns articles */ - KEduVocArticle article() const; + KEduVocArticle& article() const; /** * Sets the articles for this identifier @@ -91,7 +91,7 @@ public: * Get the personal pronouns for this identifier * @returns a KEduVocPersonalPronoun containing the personal pronouns */ - KEduVocPersonalPronoun personalPronouns() const; + KEduVocPersonalPronoun& personalPronouns() const; /** * Sets personal pronouns diff --git a/keduvocdocument/keduvockvtml2reader.cpp b/keduvocdocument/keduvockvtml2reader.cpp index 66d7004..a16b7b7 100644 --- a/keduvocdocument/keduvockvtml2reader.cpp +++ b/keduvocdocument/keduvockvtml2reader.cpp @@ -491,7 +491,6 @@ bool KEduVocKvtml2Reader::readArticle( QDomElement &articleElement, int identifi defs[0] = KEduVocWordFlag::Definite; defs[1] = KEduVocWordFlag::Indefinite; - for ( int num = 0; num <= 2; ++num) { QDomElement numberElement = articleElement.firstChildElement( KVTML_GRAMMATICAL_NUMBER[num] ); if (!numberElement.isNull()) { diff --git a/keduvocdocument/keduvockvtml2writer.cpp b/keduvocdocument/keduvockvtml2writer.cpp index 2d75044..c8ddfcd 100644 --- a/keduvocdocument/keduvockvtml2writer.cpp +++ b/keduvocdocument/keduvockvtml2writer.cpp @@ -639,7 +639,7 @@ bool KEduVocKvtml2Writer::writePersonalPronoun(QDomElement & pronounElement, con // the actual pronouns - for ( int num = 0; num <= 2; num++ ) { + for ( int num = 0; num < 3; num++ ) { QDomElement numberElement = m_domDoc.createElement( KVTML_GRAMMATICAL_NUMBER[num] ); for ( int person = 0; person < 5; person++ ) { QString pronounString = pronoun.personalPronoun(numbers[num] | persons[person]); diff --git a/keduvocdocument/keduvocpersonalpronoun.cpp b/keduvocdocument/keduvocpersonalpronoun.cpp index 3ab354e..8135120 100644 --- a/keduvocdocument/keduvocpersonalpronoun.cpp +++ b/keduvocdocument/keduvocpersonalpronoun.cpp @@ -77,12 +77,12 @@ bool KEduVocPersonalPronoun::operator ==(const KEduVocPersonalPronoun& other) co QString KEduVocPersonalPronoun::personalPronoun(KEduVocWordFlags flags) const { - return d->m_personalpronouns.value(flags & (KEduVocWordFlag::persons | KEduVocWordFlag::numbers)); + return d->m_personalpronouns.value(flags & (KEduVocWordFlag::persons | KEduVocWordFlag::numbers| KEduVocWordFlag::genders)); } void KEduVocPersonalPronoun::setPersonalPronoun(const QString & personalpronoun, KEduVocWordFlags flags) { - d->m_personalpronouns[flags & (KEduVocWordFlag::persons | KEduVocWordFlag::numbers)] = personalpronoun; + d->m_personalpronouns[flags & (KEduVocWordFlag::persons | KEduVocWordFlag::numbers| KEduVocWordFlag::genders)] = personalpronoun; } diff --git a/keduvocdocument/keduvoctranslation.cpp b/keduvocdocument/keduvoctranslation.cpp index 86959bd..1aaf884 100644 --- a/keduvocdocument/keduvoctranslation.cpp +++ b/keduvocdocument/keduvoctranslation.cpp @@ -24,6 +24,7 @@ #include "keduvockvtml2writer.h" #include #include +#include class KEduVocTranslation::KEduVocTranslationPrivate { @@ -91,12 +92,19 @@ KEduVocTranslation::KEduVocTranslationPrivate::~ KEduVocTranslationPrivate() } KEduVocTranslation::KEduVocTranslation(KEduVocExpression* entry) : d( new KEduVocTranslationPrivate(entry) ) -{} +{ + + assert(d); + +} KEduVocTranslation::KEduVocTranslation(KEduVocExpression* entry, const QString &translation ) : d( new KEduVocTranslationPrivate(entry) ) { setText(translation.simplified()); + + assert(d); + } KEduVocTranslation::KEduVocTranslation( const KEduVocTranslation &other ) @@ -125,6 +133,9 @@ KEduVocTranslation::KEduVocTranslation( const KEduVocTranslation &other ) if (other.d->m_declension) { d->m_declension = new KEduVocDeclension(*other.d->m_declension); } + + assert(d); + } KEduVocTranslation::~KEduVocTranslation() @@ -186,6 +197,9 @@ KEduVocTranslation & KEduVocTranslation::operator = ( const KEduVocTranslation & if (translation.d->m_declension) { d->m_declension = new KEduVocDeclension(*translation.d->m_declension); } + + assert(d); + return *this; } @@ -345,7 +359,10 @@ void KEduVocTranslation::setImageUrl(const KUrl &url) KEduVocWordType * KEduVocTranslation::wordType() const { - return d->m_wordType; + if (d) + return d->m_wordType; + else + return 0; } void KEduVocTranslation::setWordType(KEduVocWordType * wordType) diff --git a/keduvocdocument/keduvocwordtype.cpp b/keduvocdocument/keduvocwordtype.cpp index 65b0638..e5e32a8 100644 --- a/keduvocdocument/keduvocwordtype.cpp +++ b/keduvocdocument/keduvocwordtype.cpp @@ -91,6 +91,7 @@ void KEduVocWordType::removeTranslation(KEduVocTranslation* translation) } } + // TODO translation(i)'s d pointer can be null. How should we fix this? // remove from cache bool found = false; foreach(int i, translation->entry()->translationIndices()) { -- 2.47.3