com.geeksville.location.LeonardoUpload.java Source code

Java tutorial

Introduction

Here is the source code for com.geeksville.location.LeonardoUpload.java

Source

/*******************************************************************************
 * Gaggle is Copyright 2010 by Geeksville Industries LLC, a California limited liability corporation. 
 * 
 * Gaggle is distributed under a dual license.  We've chosen this approach because within Gaggle we've used a number
 * of components that Geeksville Industries LLC might reuse for commercial products.  Gaggle can be distributed under
 * either of the two licenses listed below.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details. 
 * 
 * Commercial Distribution License
 * If you would like to distribute Gaggle (or portions thereof) under a license other than 
 * the "GNU General Public License, version 2", contact Geeksville Industries.  Geeksville Industries reserves
 * the right to release Gaggle source code under a commercial license of its choice.
 * 
 * GNU Public License, version 2
 * All other distribution of Gaggle must conform to the terms of the GNU Public License, version 2.  The full
 * text of this license is included in the Gaggle source, see assets/manual/gpl-2.0.txt.
 ******************************************************************************/
package com.geeksville.location;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.util.EntityUtils;

/**
 * Uses an HTTP post to submit an IGC file to Leonardo
 * 
 * @author kevinh Per
 *         http://www.paraglidingforum.com/leonardo/doc/direct_upload.html
 */
public class LeonardoUpload {

    /**
     * Upload a flight to Leonardo
     * 
     * @param username
     * @param password
     * @param postURL
     * @param shortFilename
     * @param igcFile
     *            we will take care of closing this stram
     * @return null for success, otherwise a string description of the problem
     * @throws IOException
     */
    public static String upload(String username, String password, String postURL, int competitionClass,
            String shortFilename, String igcFile, int connectionTimeout, int operationTimeout) throws IOException {

        // Strip off extension (leonado docs say they don't want it
        int i = shortFilename.lastIndexOf('.');
        if (i >= 1)
            shortFilename = shortFilename.substring(0, i);
        String sCompetitionClass = String.valueOf(competitionClass);
        HttpParams httpParameters = new BasicHttpParams();
        // Set the timeout in milliseconds until a connection is established.
        HttpConnectionParams.setConnectionTimeout(httpParameters, connectionTimeout);
        // Set the default socket timeout (SO_TIMEOUT) 
        // in milliseconds which is the timeout for waiting for data.
        HttpConnectionParams.setSoTimeout(httpParameters, operationTimeout);

        HttpClient httpclient = new DefaultHttpClient(httpParameters);
        httpclient.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
        HttpPost httppost = new HttpPost(postURL);
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("user", username));
        nameValuePairs.add(new BasicNameValuePair("pass", password));
        nameValuePairs.add(new BasicNameValuePair("igcfn", shortFilename));
        nameValuePairs.add(new BasicNameValuePair("Klasse", sCompetitionClass));
        nameValuePairs.add(new BasicNameValuePair("IGCigcIGC", igcFile));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();

        String resp = EntityUtils.toString(entity);

        // An error looks like:
        // <html><body>problem<br>This is not a valid .igc
        // file</body></html>

        // Check for success
        if (resp.contains("flight scored"))
            resp = null;
        else {
            int bodLoc = resp.indexOf("<body>");
            if (bodLoc >= 0)
                resp = resp.substring(bodLoc + 6);
            int probLoc = resp.indexOf("problem");
            if (probLoc >= 0)
                resp = resp.substring(probLoc + 7);
            if (resp.startsWith("<br>"))
                resp = resp.substring(4);
            int markLoc = resp.indexOf('<');
            if (markLoc >= 0)
                resp = resp.substring(0, markLoc);
            resp = resp.trim();
        }

        return resp;
    }
}