Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 31644f47 authored by Ricki Hirner's avatar Ricki Hirner
Browse files

Process Content-Type character set information (fixes #594)

parent dd7d2a63
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
BEGIN:VCARD
VERSION:3.0
N:uek;zkan
FN:zkan uek
END:VCARD
+3 −3
Original line number Diff line number Diff line
BEGIN:VCARD
VERSION:3.0
N:Gump;Forrest;Mr.
FN:Forrest Gump
ORG:Bubba Gump Shrimp Co.
N:Gümp;Förrest;Mr.
FN:Förrest Gümp
ORG:Bubba Gump Shrimpß Co.
TITLE:Shrimp Man
PHOTO;VALUE=URL;TYPE=PNG:http://192.168.0.11:3000/assets/davdroid-logo-192.png
TEL;TYPE=WORK,VOICE:(111) 555-1212
+28 −10
Original line number Diff line number Diff line
@@ -9,15 +9,20 @@ package at.bitfire.davdroid.resource;

import android.content.res.AssetManager;
import android.test.InstrumentationTestCase;
import android.util.Log;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.CharEncoding;

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

import at.bitfire.davdroid.ArrayUtils;
import at.bitfire.davdroid.webdav.DavException;
import at.bitfire.davdroid.webdav.HttpException;
import ezvcard.VCardVersion;
@@ -36,21 +41,22 @@ public class ContactTest extends InstrumentationTestCase {
		Contact c = new Contact("test.vcf", null);

		// should generate VCard 3.0 by default
		assertEquals("text/vcard;charset=UTF-8", c.getMimeType());
		assertEquals("text/vcard; charset=utf-8", c.getContentType().toString().toLowerCase());
		assertTrue(new String(c.toEntity().toByteArray()).contains("VERSION:3.0"));

		// now let's generate VCard 4.0
		c.setVCardVersion(VCardVersion.V4_0);
		assertEquals("text/vcard;version=4.0", c.getMimeType());
		assertEquals("text/vcard; version=4.0", c.getContentType().toString());
		assertTrue(new String(c.toEntity().toByteArray()).contains("VERSION:4.0"));
	}
	
	public void testReferenceVCard() throws IOException, InvalidResourceException {
		Contact c = parseVCF("reference.vcf");
		assertEquals("Gump", c.getFamilyName());
		assertEquals("Forrest", c.getGivenName());
		assertEquals("Forrest Gump", c.getDisplayName());
		assertEquals("Bubba Gump Shrimp Co.", c.getOrganization().getValues().get(0));
	public void testReferenceVCard3() throws IOException, InvalidResourceException {
		Contact c = parseVCF("reference-vcard3.vcf", Charset.forName(CharEncoding.UTF_8));

		assertEquals("Gümp", c.getFamilyName());
		assertEquals("Förrest", c.getGivenName());
		assertEquals("Förrest Gümp", c.getDisplayName());
		assertEquals("Bubba Gump Shrimpß Co.", c.getOrganization().getValues().get(0));
		assertEquals("Shrimp Man", c.getJobTitle());
		
		Telephone phone1 = c.getPhoneNumbers().get(0);
@@ -79,11 +85,19 @@ public class ContactTest extends InstrumentationTestCase {
		assertNull(c.getUnknownProperties());
	}

	public void testParseLatin1() throws IOException {
		Contact c = parseVCF("latin1.vcf", Charset.forName(CharEncoding.ISO_8859_1));
		assertEquals("Özkan Äuçek", c.getDisplayName());
		assertEquals("Özkan", c.getGivenName());
		assertEquals("Äuçek", c.getFamilyName());
		assertNull(c.getUnknownProperties());
	}
	
	protected Contact parseVCF(String fname) throws IOException {
	
	protected Contact parseVCF(String fname, Charset charset) throws IOException {
		@Cleanup InputStream in = assetMgr.open(fname, AssetManager.ACCESS_STREAMING);
		Contact c = new Contact(fname, null);
		c.parseEntity(in, new Resource.AssetDownloader() {
		c.parseEntity(in, charset, new Resource.AssetDownloader() {
            @Override
            public byte[] download(URI uri) throws URISyntaxException, IOException, HttpException, DavException {
                return IOUtils.toByteArray(uri);
@@ -91,4 +105,8 @@ public class ContactTest extends InstrumentationTestCase {
        });
		return c;
	}

	protected Contact parseVCF(String fname) throws IOException {
		return parseVCF(fname, null);
	}
}
+1 −1
Original line number Diff line number Diff line
@@ -111,7 +111,7 @@ public class EventTest extends InstrumentationTestCase {
	protected Event parseCalendar(String fname) throws IOException, InvalidResourceException {
		@Cleanup InputStream in = assetMgr.open(fname, AssetManager.ACCESS_STREAMING);
		Event e = new Event(fname, null);
		e.parseEntity(in, null);
		e.parseEntity(in, null, null);
		return e;
	}
}
+2 −2
Original line number Diff line number Diff line
@@ -4,12 +4,12 @@ var roboHydra = require("robohydra"),
	roboHydraHeads = roboHydra.heads,
	roboHydraHead = roboHydraHeads.RoboHydraHead;

RoboHydraHeadDAV = roboHydraHeads.roboHydraHeadType({
RoboHydraHeadDAV = roboHydraHeads.robohydraHeadType({
	name: 'WebDAV Server',
	mandatoryProperties: [ 'path' ],
    optionalProperties: [ 'handler' ],

	parentPropBuilder: function() {
	parentPropertyBuilder: function() {
		var myHandler = this.handler;
		return {
			path: this.path,
Loading