From 97ccbb55df2af9268f37e0bad7109d958acf6d19 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Tue, 21 Jul 2009 15:07:59 +0200
Subject: Add more fields to the VCard element support.

Extra fields: Fullname, Given/Family name, E-Mail.

diff --git a/Swiften/Elements/VCard.h b/Swiften/Elements/VCard.h
index f389ba7..a42d7e3 100644
--- a/Swiften/Elements/VCard.h
+++ b/Swiften/Elements/VCard.h
@@ -9,6 +9,18 @@ namespace Swift {
 		public:
 			VCard() {}
 
+			void setFullName(const String& fullName) { fullName_ = fullName; }
+			const String& getFullName() const { return fullName_; }
+
+			void setFamilyName(const String& familyName) { familyName_ = familyName; }
+			const String& getFamilyName() const { return familyName_; }
+
+			void setGivenName(const String& givenName) { givenName_ = givenName; }
+			const String& getGivenName() const { return givenName_; }
+
+			void setEMail(const String& email) { email_ = email; }
+			const String& getEMail() const { return email_; }
+
 			void setNickname(const String& nick) { nick_ = nick; }
 			const String& getNickname() const { return nick_; }
 
@@ -19,6 +31,10 @@ namespace Swift {
 			const String& getPhotoType() { return photoType_; }
 
 		private:
+			String fullName_;
+			String familyName_;
+			String givenName_;
+			String email_;
 			ByteArray photo_;
 			String photoType_;
 			String nick_;
diff --git a/Swiften/Parser/PayloadParsers/VCardParser.cpp b/Swiften/Parser/PayloadParsers/VCardParser.cpp
index b7845a7..87416ab 100644
--- a/Swiften/Parser/PayloadParsers/VCardParser.cpp
+++ b/Swiften/Parser/PayloadParsers/VCardParser.cpp
@@ -23,6 +23,18 @@ void VCardParser::handleEndElement(const String&, const String&) {
 	else if (elementHierarchy == "/vCard/NICKNAME") {
 		getPayloadInternal()->setNickname(currentText_);
 	}
+	else if (elementHierarchy == "/vCard/FN") {
+		getPayloadInternal()->setFullName(currentText_);
+	}
+	else if (elementHierarchy == "/vCard/N/FAMILY") {
+		getPayloadInternal()->setFamilyName(currentText_);
+	}
+	else if (elementHierarchy == "/vCard/N/GIVEN") {
+		getPayloadInternal()->setGivenName(currentText_);
+	}
+	else if (elementHierarchy == "/vCard/EMAIL/USERID") {
+		getPayloadInternal()->setEMail(currentText_);
+	}
 	elementStack_.pop_back();
 }
 
diff --git a/Swiften/Serializer/PayloadSerializers/VCardSerializer.cpp b/Swiften/Serializer/PayloadSerializers/VCardSerializer.cpp
index 26e1623..fbb0274 100644
--- a/Swiften/Serializer/PayloadSerializers/VCardSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/VCardSerializer.cpp
@@ -12,6 +12,32 @@ VCardSerializer::VCardSerializer() : GenericPayloadSerializer<VCard>() {
 
 String VCardSerializer::serializePayload(boost::shared_ptr<VCard> vcard)  const {
 	XMLElement queryElement("vCard", "vcard-temp");
+	if (!vcard->getFullName().isEmpty()) {
+		boost::shared_ptr<XMLElement> fullNameElement(new XMLElement("FN"));
+		fullNameElement->addNode(boost::shared_ptr<XMLTextNode>(new XMLTextNode(vcard->getFullName())));
+		queryElement.addNode(fullNameElement);
+	}
+	if (!vcard->getGivenName().isEmpty() || !vcard->getFamilyName().isEmpty()) {
+		boost::shared_ptr<XMLElement> nameElement(new XMLElement("N"));
+		if (!vcard->getFamilyName().isEmpty()) {
+			boost::shared_ptr<XMLElement> familyNameElement(new XMLElement("FAMILY"));
+			familyNameElement->addNode(boost::shared_ptr<XMLTextNode>(new XMLTextNode(vcard->getFamilyName())));
+			nameElement->addNode(familyNameElement);
+		}
+		if (!vcard->getGivenName().isEmpty()) {
+			boost::shared_ptr<XMLElement> givenNameElement(new XMLElement("GIVEN"));
+			givenNameElement->addNode(boost::shared_ptr<XMLTextNode>(new XMLTextNode(vcard->getGivenName())));
+			nameElement->addNode(givenNameElement);
+		}
+		queryElement.addNode(nameElement);
+	}
+	if (!vcard->getEMail().isEmpty()) {
+		boost::shared_ptr<XMLElement> emailElement(new XMLElement("EMAIL"));
+		boost::shared_ptr<XMLElement> userIDElement(new XMLElement("USERID"));
+		userIDElement->addNode(boost::shared_ptr<XMLTextNode>(new XMLTextNode(vcard->getEMail())));
+		emailElement->addNode(userIDElement);
+		queryElement.addNode(emailElement);
+	}
 	if (!vcard->getNickname().isEmpty()) {
 		boost::shared_ptr<XMLElement> nickElement(new XMLElement("NICKNAME"));
 		nickElement->addNode(boost::shared_ptr<XMLTextNode>(new XMLTextNode(vcard->getNickname())));
-- 
cgit v0.10.2-6-g49f6