project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/Downloader/DownloadPackage.java
author Wuzzy <almikes@aol.com>
Sat, 30 Sep 2017 23:52:08 +0200
changeset 12627 07fdda8c13a2
parent 10017 de822cd3df3a
permissions -rw-r--r--
TrophyRace: Fix game never eliminating any hogs after a hog skipped or ran out of time Warning: This commit _might_ invalidate past records, but I'm not sure if this is actually the case. Note that only the eliminiation part of the script is touched, not the actual race logic. Even if records are actually broken by this, I and sheepluva have decided that it's more imporant to fix this very, VERY stupid and old bug than to preserve records.

/*
 * Hedgewars for Android. An Android port of Hedgewars, a free turn based strategy game
 * Copyright (c) 2011-2012 Richard Deurwaarder <xeli@xelification.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * 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.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

package org.hedgewars.hedgeroid.Downloader;

import java.io.IOException;

import org.hedgewars.hedgeroid.util.FileUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Parcel;
import android.os.Parcelable;
import android.preference.PreferenceManager;

public class DownloadPackage implements Parcelable{
    private String url_without_suffix;
    private String pathToStore;
    private String representation;
    private String description;
    private int versionNumber;
    private final Status status;
    private int uniqueId;


    public DownloadPackage(Parcel src){
        url_without_suffix = src.readString();
        pathToStore = src.readString();
        representation = src.readString();
        versionNumber = src.readInt();
        status = Status.values()[src.readInt()];
        description = src.readString();
        uniqueId = src.readInt();
    }

    public DownloadPackage(Context c, String _url_without_suffix, String path, int version, String _representation, String _description, int _uniqueId){
        url_without_suffix = _url_without_suffix;
        pathToStore = path;
        representation = _representation;
        versionNumber = version;
        description = _description;
        uniqueId = _uniqueId;


        //determine if the user has already downloaded this version
        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(c);
        int currentVersion = sharedPref.getInt(representation, -1);
        if(currentVersion == versionNumber) status = Status.CURRENTVERSION;
        else if (currentVersion < versionNumber) status = Status.NEWERVERSION;
        else status = Status.OLDERVERSION;
    }

    public Status getStatus(){
        return status;
    }

    public String getURL(){
        return url_without_suffix;
    }

    public String getPathToStore(){
        return pathToStore;
    }

    public String toString(){
        return representation;
    }

    public int describeContents() {
        return 0;
    }
    public int getId(){
        return uniqueId;
    }

    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(url_without_suffix);
        dest.writeString(pathToStore);
        dest.writeString(representation);
        dest.writeInt(versionNumber);
        dest.writeInt(status.ordinal());
        dest.writeString(description);
    }

    public static final Parcelable.Creator<DownloadPackage> CREATOR = new Parcelable.Creator<DownloadPackage>() {
        public DownloadPackage createFromParcel(Parcel source) {
            return new DownloadPackage(source);
        }
        public DownloadPackage[] newArray(int size) {
            return new DownloadPackage[size];
        }
    };

    /*
     * We enter with a XmlPullParser.Start_tag with name "task"
     */
    public static DownloadPackage getTaskFromXML(Context c, XmlPullParser xmlPuller) throws XmlPullParserException, IOException{
        String url = null;
        String path = null;
        String representation = null;
        String description = null;
        int uniqueId = -1;
        int version = -1;

        int eventType = DownloadPackage.getEventType(xmlPuller);//get the next token, should be a start tag
        while(eventType != XmlPullParser.END_DOCUMENT){
            switch(eventType){
            case XmlPullParser.START_TAG:
                String name = xmlPuller.getName().toLowerCase();
                if(DownloadPackage.getEventType(xmlPuller) == XmlPullParser.TEXT){
                    String text = xmlPuller.getText().trim();
                    if(name.equals("url")){
                        url = text;
                    }else if(name.equals("version")){
                        try{
                        version = Integer.parseInt(text);
                        }catch (NumberFormatException e){
                            e.printStackTrace();
                            version = -1;
                        }
                    }else if(name.equals("path")){
                        path = FileUtils.getDataPathFile(c, text).getAbsolutePath();
                    }else if(name.equals("representation")){
                        representation = text;
                    }else if(name.equals("description")){
                        description = text;
                    }else if(name.equals("uniqueid")){
                        try{
                            uniqueId = Integer.parseInt(text);
                            }catch (NumberFormatException e){
                                e.printStackTrace();
                                version = -1;
                            }
                    }
                }
                DownloadPackage.getEventType(xmlPuller);//endtag
                break;
            case XmlPullParser.END_TAG:
                if(xmlPuller.getName().toLowerCase().equals("task") && url != null && path != null && version != -1 && representation != null){
                    return new DownloadPackage(c, url, path, version, representation, description, uniqueId);
                }else{
                    throw new XmlPullParserException("XML download parsing: missing tags");
                }
            case XmlPullParser.TEXT:
                throw new XmlPullParserException("Wrong tag recieved got TEXT : " + xmlPuller.getText());
            default:
                throw new XmlPullParserException("Wrong tag recieved got: " + eventType);
            }
            eventType = DownloadPackage.getEventType(xmlPuller);
        }
        throw new XmlPullParserException("Xml: unexpected endofdocument tag");
    }

    /**
     * Skips whitespaces..
     */
    private static int getEventType(XmlPullParser xmlPuller)throws XmlPullParserException, IOException{
        int eventType = xmlPuller.next();
        while(eventType == XmlPullParser.TEXT && xmlPuller.isWhitespace()){
            eventType = xmlPuller.next();
        }
        return eventType;
    }
}

enum Status{
    CURRENTVERSION, NEWERVERSION, OLDERVERSION;
}