Changeset 99a84cd


Ignore:
Timestamp:
Aug 11, 2010, 8:36:57 AM (7 years ago)
Author:
Michael Seifert <mseifert@…>
Branches:
master
Children:
d2b3ddf
Parents:
8145bd3
Message:

Cleaned up new parsing routine of replay.details;
Added DataBlock? class to read arbitrary data from replay files;
Added method to dump data blocks as JSON output;
Added unit tests

Location:
sc2replay/src
Files:
3 added
2 edited

Legend:

Unmodified
Added
Removed
  • sc2replay/src/main/java/de/erichseifert/warp/sc2replay/SC2ReplayDetail.java

    r8145bd3 r99a84cd  
    2323
    2424import java.awt.Color;
    25 import java.io.DataOutputStream;
    26 import java.io.File;
    27 import java.io.FileOutputStream;
    2825import java.io.IOException;
    29 import java.io.OutputStream;
    3026import java.nio.ByteBuffer;
    31 import java.util.HashMap;
    3227import java.util.LinkedList;
    3328import java.util.List;
    34 import java.util.Map;
    3529
    36 import de.erichseifert.warp.core.util.ReplayUtil;
    37 import de.erichseifert.warp.sc2replay.util.DataCluster;
     30import de.erichseifert.warp.sc2replay.util.DataBlock;
    3831import de.erichseifert.warp.sc2replay.util.SC2ReplayUtil;
    3932
     
    4235
    4336        public SC2ReplayDetail(ByteBuffer src) {
    44                 File dumpFile = null;
    45                 OutputStream dumpStream = null;
    46                 DataOutputStream dump = null;
     37                DataBlock data = null;
    4738                try {
    48                         dumpFile = new File("dump");
    49                         dumpStream = new FileOutputStream(dumpFile);
    50                         dump = new DataOutputStream(dumpStream);
    51                 } catch (IOException e) {
    52                         // TODO Auto-generated catch block
    53                         e.printStackTrace();
    54                 }
    55                 Map<Integer, DataCluster> data = null;
    56                 try {
    57                         DataCluster cluster = SC2ReplayUtil.readDataCluster(src);
    58                         data = cluster.getDict(0);
    59                         SC2ReplayUtil.dumpData(cluster, dump);
    60                         dumpStream.close();
    61                         dump.close();
     39                        data = SC2ReplayUtil.readDataBlock(src);
    6240                } catch (IOException e) {
    6341                        // TODO Auto-generated catch block
     
    6745                players = new LinkedList<SC2Player>();
    6846
    69                 DataCluster[] playerData = (DataCluster[]) data.get(0).getArray(0);
    70                 for (int playerIndex = 0; playerIndex < playerData.length; playerIndex++) {
    71                         Map<Integer, DataCluster> playerDict = playerData[playerIndex].getDict(0);
    72                         String name = playerDict.get(0).getString(0);
    73                         Map<Integer, DataCluster> playerDetails = playerDict.get(1).getDict(0);
    74                         String raceLocalized = playerDict.get(2).getString(0);
    75                         Map<Integer, DataCluster> colorMap = playerDict.get(3).getDict(0);
     47                DataBlock playerData = data.getDataBlock(0);
     48                for (int playerIndex = 0; playerIndex < playerData.size(); playerIndex++) {
     49                        DataBlock playerInfo = playerData.getDataBlock(playerIndex);
     50                        String name = playerInfo.getDataBlock(0).getString();
     51                        DataBlock playerDetails = playerInfo.getDataBlock(1);
     52                        String raceLocalized = playerInfo.getDataBlock(2).getString();
     53                        DataBlock colorMap = playerInfo.getDataBlock(3);
    7654
    7755                        Color color = new Color(
    78                                 colorMap.get(1).getInt(0),
    79                                 colorMap.get(2).getInt(0),
    80                                 colorMap.get(3).getInt(0),
    81                                 colorMap.get(0).getInt(0)
     56                                colorMap.getDataBlock(1).getInt(),
     57                                colorMap.getDataBlock(2).getInt(),
     58                                colorMap.getDataBlock(3).getInt(),
     59                                colorMap.getDataBlock(0).getInt()
    8260                        );
    8361                        if (!name.isEmpty()) {
    8462                                SC2Player player = new SC2Player(name);
    85                                 player.setRealID(playerDetails.get(3).getString(0));
     63                                player.setRealID(playerDetails.getDataBlock(3).getString());
    8664                                player.setRace(raceLocalized);
    8765                                player.setColor(color);
  • sc2replay/src/main/java/de/erichseifert/warp/sc2replay/util/SC2ReplayUtil.java

    r8145bd3 r99a84cd  
    8282        }
    8383
    84         public static DataCluster readDataCluster(ByteBuffer src) throws IOException {
    85                 DataCluster cluster = new DataCluster();
     84        public static DataBlock readDataBlock(ByteBuffer src) throws IOException {
     85                DataBlock block = new DataBlock();
    8686                byte type = src.get();
    8787                if (type == TYPE_BINARY) {
     
    8989                        byte[] data = new byte[size];
    9090                        src.get(data);
    91                         cluster.add(data);
     91                        block.setData(data);
    9292                }
    9393                else if (type == TYPE_ARRAY) {
     
    9898                        }
    9999                        int size = (int) readNumber(src);
    100                         DataCluster[] data = new DataCluster[size];
     100                        DataBlock[] data = new DataBlock[size];
    101101                        for (int i = 0; i < data.length; i++) {
    102                                 data[i] = readDataCluster(src);
     102                                data[i] = readDataBlock(src);
    103103                        }
    104                         cluster.add(data);
     104                        block.setData(data);
    105105                }
    106106                else if (type == TYPE_MAP) {
    107107                        int size = (int) readNumber(src);
    108                         Map<Integer, DataCluster> data = new LinkedHashMap<Integer, DataCluster>(size);
     108                        Map<Integer, DataBlock> data = new LinkedHashMap<Integer, DataBlock>(size);
    109109                        for (int i = 0; i < size; i++) {
    110110                                int index = (int) readNumber(src);
    111                                 DataCluster element = readDataCluster(src);
     111                                DataBlock element = readDataBlock(src);
    112112                                data.put(index, element);
    113113                        }
    114                         cluster.add(data);
     114                        block.setData(data);
    115115                }
    116116                else if (type == TYPE_BYTE) {
    117117                        byte data = src.get();
    118                         cluster.add(data);
     118                        block.setData(data);
    119119                }
    120120                else if (type == TYPE_INT) {
    121121                        int data = src.getInt();
    122                         cluster.add(data);
     122                        block.setData(data);
    123123                }
    124124                else if (type == TYPE_NUMBER) {
    125125                        long data = readNumber(src);
    126                         cluster.add(data);
     126                        block.setData(data);
    127127                }
    128128                else {
    129129                        throw new IOException("Unknown data type "+type+" at offset "+src.position()+")");
    130130                }
    131                 return cluster;
     131                return block;
    132132        }
    133133
    134         public static void dumpData(DataCluster data, DataOutputStream dst) throws IOException {
    135                 dumpData(data, dst, 0);
     134        public static void dumpData(DataBlock block, DataOutputStream dst) throws IOException {
     135                dumpData(block, dst, 0);
    136136        }
    137137
    138         private static void dumpData(DataCluster data, DataOutputStream dst, int depthCur) throws IOException {
    139                 for (Object element : data) {
    140                         if (element instanceof byte[]) {
    141                                 String dataString = new String((byte[]) element);
    142                                 dst.writeBytes("\""+dataString+"\"");
    143                                 dst.writeBytes(",");
     138        private static void dumpData(DataBlock block, DataOutputStream dst, int depthCur) throws IOException {
     139                Object data = block.getData();
     140                if (data instanceof byte[]) {
     141                        String dataString = new String((byte[]) data);
     142                        dst.writeBytes("\""+dataString+"\"");
     143                        dst.writeBytes(",");
     144                }
     145                else if (data instanceof Map<?, ?>) {
     146                        dst.writeBytes("{"+System.getProperty("line.separator"));
     147                        depthCur++;
     148                        indent(dst, depthCur);
     149                        for (DataBlock elem : ((Map<Integer, DataBlock>) data).values()) {
     150                                dumpData(elem, dst, depthCur);
    144151                        }
    145                         else if (element instanceof Map<?, ?>) {
    146                                 dst.writeBytes("{"+System.getProperty("line.separator"));
    147                                 depthCur++;
    148                                 indent(dst, depthCur);
    149                                 for (DataCluster elem : ((Map<Integer, DataCluster>) element).values()) {
    150                                         dumpData(elem, dst, depthCur);
    151                                 }
    152                                 depthCur--;
    153                                 dst.writeBytes(System.getProperty("line.separator"));
    154                                 indent(dst, depthCur);
    155                                 dst.writeBytes("},"+System.getProperty("line.separator"));
    156                                 indent(dst, depthCur);
     152                        depthCur--;
     153                        dst.writeBytes(System.getProperty("line.separator"));
     154                        indent(dst, depthCur);
     155                        dst.writeBytes("},"+System.getProperty("line.separator"));
     156                        indent(dst, depthCur);
     157                }
     158                else if (data instanceof Object[]) {
     159                        dst.writeBytes("["+System.getProperty("line.separator"));
     160                        depthCur++;
     161                        indent(dst, depthCur);
     162                        for (DataBlock elem : (DataBlock[]) data) {
     163                                dumpData(elem, dst, depthCur);
    157164                        }
    158                         else if (element instanceof Object[]) {
    159                                 dst.writeBytes("["+System.getProperty("line.separator"));
    160                                 depthCur++;
    161                                 indent(dst, depthCur);
    162                                 for (DataCluster elem : (DataCluster[]) element) {
    163                                         dumpData(elem, dst, depthCur);
    164                                 }
    165                                 depthCur--;
    166                                 dst.writeBytes(System.getProperty("line.separator"));
    167                                 indent(dst, depthCur);
    168                                 dst.writeBytes("],"+System.getProperty("line.separator"));
    169                                 indent(dst, depthCur);
    170                         }
    171                         else if (element instanceof Byte) {
    172                                 dst.writeBytes(String.valueOf(element));
    173                                 dst.writeBytes(",");
    174                         }
    175                         else if (element instanceof Integer) {
    176                                 dst.writeBytes(String.valueOf(element));
    177                                 dst.writeBytes(",");
    178                         }
    179                         else if (element instanceof Long) {
    180                                 dst.writeBytes(String.valueOf(element));
    181                                 dst.writeBytes(",");
    182                         }
    183                         else {
    184                                 throw new IOException();
    185                         }
     165                        depthCur--;
     166                        dst.writeBytes(System.getProperty("line.separator"));
     167                        indent(dst, depthCur);
     168                        dst.writeBytes("],"+System.getProperty("line.separator"));
     169                        indent(dst, depthCur);
     170                }
     171                else if (data instanceof Byte) {
     172                        dst.writeBytes(String.valueOf(data));
     173                        dst.writeBytes(",");
     174                }
     175                else if (data instanceof Integer) {
     176                        dst.writeBytes(String.valueOf(data));
     177                        dst.writeBytes(",");
     178                }
     179                else if (data instanceof Long) {
     180                        dst.writeBytes(String.valueOf(data));
     181                        dst.writeBytes(",");
     182                }
     183                else {
     184                        throw new IOException();
    186185                }
    187186        }
Note: See TracChangeset for help on using the changeset viewer.