aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBananeweizen <bananeweizen@gmx.de>2011-08-27 21:33:06 +0200
committerBananeweizen <bananeweizen@gmx.de>2011-08-27 21:33:06 +0200
commitafbe8c5164e1157e38e0f8c4b28942cbd9fe3d41 (patch)
tree2adf26bc568b26c40a0170b4cc8addfd0fad2e00 /src
parentc9b4637e92f789f27f643836e838f5a0fdd5050d (diff)
downloadcgeo-afbe8c5164e1157e38e0f8c4b28942cbd9fe3d41.zip
cgeo-afbe8c5164e1157e38e0f8c4b28942cbd9fe3d41.tar.gz
cgeo-afbe8c5164e1157e38e0f8c4b28942cbd9fe3d41.tar.bz2
new: support for importing opencaching.com GPX files (OX... caches)
Diffstat (limited to 'src')
-rw-r--r--src/cgeo/geocaching/cgBase.java19
-rw-r--r--src/cgeo/geocaching/connector/ConnectorFactory.java2
-rw-r--r--src/cgeo/geocaching/connector/OCConnector.java4
-rw-r--r--src/cgeo/geocaching/connector/OXConnector.java21
-rw-r--r--src/cgeo/geocaching/files/GPXParser.java19
5 files changed, 52 insertions, 13 deletions
diff --git a/src/cgeo/geocaching/cgBase.java b/src/cgeo/geocaching/cgBase.java
index 7f18024..cfa1a07 100644
--- a/src/cgeo/geocaching/cgBase.java
+++ b/src/cgeo/geocaching/cgBase.java
@@ -128,20 +128,19 @@ public class cgBase {
"MMM/dd/yyyy",
"dd MMM yy"
};
-
+
HashMap<String, SimpleDateFormat> map = new HashMap<String, SimpleDateFormat>();
-
+
for (String format : formats)
{
map.put(format, new SimpleDateFormat(format, Locale.ENGLISH));
}
-
+
gcCustomDateFormats = Collections.unmodifiableMap(map);
}
public final static SimpleDateFormat dateTbIn1 = new SimpleDateFormat("EEEEE, dd MMMMM yyyy", Locale.ENGLISH); // Saturday, 28 March 2009
public final static SimpleDateFormat dateTbIn2 = new SimpleDateFormat("EEEEE, MMMMM dd, yyyy", Locale.ENGLISH); // Saturday, March 28, 2009
public final static SimpleDateFormat dateSqlIn = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 2010-07-25 14:44:01
- public final static SimpleDateFormat dateGPXIn = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); // 2010-04-20T07:00:00Z
private Resources res = null;
private HashMap<String, String> cookies = new HashMap<String, String>();
private static final String passMatch = "[/\\?&]*[Pp]ass(word)?=[^&^#^$]+";
@@ -1318,7 +1317,7 @@ public class cgBase {
{
final Matcher matcherFound = patternFound.matcher(page);
final Matcher matcherFoundAlternative = patternFoundAlternative.matcher(page);
-
+
if (matcherFound.find() || matcherFoundAlternative.find()) {
cache.found = true;
}
@@ -1575,7 +1574,7 @@ public class cgBase {
try
{
final Matcher matcherLogCounts = patternCountLogs.matcher(page);
-
+
if (matcherLogCounts.find())
{
final Matcher matcherLog = patternCountLog.matcher(matcherLogCounts.group(1));
@@ -1584,7 +1583,7 @@ public class cgBase {
{
String typeStr = matcherLog.group(1);
String countStr = matcherLog.group(2);
-
+
if (typeStr != null
&& typeStr.length() > 0
&& logTypes.containsKey(typeStr.toLowerCase())
@@ -1907,9 +1906,9 @@ public class cgBase {
{
throw new ParseException("Input is null", 0);
}
-
+
input = input.trim();
-
+
for (SimpleDateFormat format : gcCustomDateFormats.values())
{
try
@@ -1918,7 +1917,7 @@ public class cgBase {
}
catch (ParseException e) {}
}
-
+
throw new ParseException("No matching pattern", 0);
}
diff --git a/src/cgeo/geocaching/connector/ConnectorFactory.java b/src/cgeo/geocaching/connector/ConnectorFactory.java
index 9d8f955..d052231 100644
--- a/src/cgeo/geocaching/connector/ConnectorFactory.java
+++ b/src/cgeo/geocaching/connector/ConnectorFactory.java
@@ -4,7 +4,7 @@ import cgeo.geocaching.cgCache;
public final class ConnectorFactory {
private static final GCConnector GC_CONNECTOR = new GCConnector();
- private static final IConnector[] connectors = new IConnector[] {GC_CONNECTOR, new OCConnector()};
+ private static final IConnector[] connectors = new IConnector[] {GC_CONNECTOR, new OCConnector(), new OXConnector()};
public static IConnector[] getConnectors() {
return connectors;
diff --git a/src/cgeo/geocaching/connector/OCConnector.java b/src/cgeo/geocaching/connector/OCConnector.java
index efe4232..d23b3cd 100644
--- a/src/cgeo/geocaching/connector/OCConnector.java
+++ b/src/cgeo/geocaching/connector/OCConnector.java
@@ -2,6 +2,10 @@ package cgeo.geocaching.connector;
import cgeo.geocaching.cgCache;
+/**
+ * connector for OpenCaching.de (and several other country domains)
+ *
+ */
public class OCConnector extends AbstractConnector implements IConnector {
@Override
public boolean canHandle(String geocode) {
diff --git a/src/cgeo/geocaching/connector/OXConnector.java b/src/cgeo/geocaching/connector/OXConnector.java
new file mode 100644
index 0000000..75d404e
--- /dev/null
+++ b/src/cgeo/geocaching/connector/OXConnector.java
@@ -0,0 +1,21 @@
+package cgeo.geocaching.connector;
+
+import cgeo.geocaching.cgCache;
+
+/**
+ * connector for OpenCaching.com
+ *
+ */
+public class OXConnector extends AbstractConnector implements IConnector {
+
+ @Override
+ public boolean canHandle(String geocode) {
+ return geocode != null && geocode.toUpperCase().startsWith("OX");
+ }
+
+ @Override
+ public String getCacheUrl(cgCache cache) {
+ return "http://www.opencaching.com/#!geocache/" + cache.geocode;
+ }
+
+}
diff --git a/src/cgeo/geocaching/files/GPXParser.java b/src/cgeo/geocaching/files/GPXParser.java
index 1a9bd7c..2a3b167 100644
--- a/src/cgeo/geocaching/files/GPXParser.java
+++ b/src/cgeo/geocaching/files/GPXParser.java
@@ -4,7 +4,10 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -31,6 +34,9 @@ import cgeo.geocaching.connector.ConnectorFactory;
public abstract class GPXParser extends FileParser {
+ private static final SimpleDateFormat formatSimple = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); // 2010-04-20T07:00:00Z
+ private static final SimpleDateFormat formatTimezone = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'.000'Z"); // 2010-04-20T01:01:03.000-04:00
+
private static final Pattern patternGeocode = Pattern.compile("([A-Z]{2}[0-9A-Z]+)", Pattern.CASE_INSENSITIVE);
private static final String[] nsGCList = new String[] {
"http://www.groundspeak.com/cache/1/1", // PQ 1.1
@@ -65,6 +71,15 @@ public abstract class GPXParser extends FileParser {
version = versionIn;
}
+ private static Date parseDate(String input) throws ParseException {
+ input = input.trim();
+ if (input.length() >= 3 && input.charAt(input.length() - 3) == ':') {
+ String removeColon = input.substring(0, input.length() - 3) + input.substring(input.length() - 2);
+ return formatTimezone.parse(removeColon);
+ }
+ return formatSimple.parse(input);
+ }
+
public long parse(File file, Handler handlerIn) {
handler = handlerIn;
if (file == null) {
@@ -137,7 +152,7 @@ public abstract class GPXParser extends FileParser {
@Override
public void end(String body) {
try {
- cache.hidden = cgBase.dateGPXIn.parse(body.trim());
+ cache.hidden = parseDate(body);
} catch (Exception e) {
Log.w(cgSettings.tag, "Failed to parse cache date: " + e.toString());
}
@@ -478,7 +493,7 @@ public abstract class GPXParser extends FileParser {
@Override
public void end(String body) {
try {
- log.date = cgBase.dateGPXIn.parse(body.trim()).getTime();
+ log.date = parseDate(body).getTime();
} catch (Exception e) {
Log.w(cgSettings.tag, "Failed to parse log date: " + e.toString());
}