File: GemRB.java

package info (click to toggle)
gemrb 0.8.5-1
  • links: PTS, VCS
  • area: contrib
  • in suites: buster
  • size: 32,476 kB
  • sloc: cpp: 125,206; python: 31,280; ansic: 2,012; objc: 756; sh: 568; makefile: 467; perl: 178; java: 105
file content (141 lines) | stat: -rw-r--r-- 5,144 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package net.sourceforge.gemrb;

import org.libsdl.app.SDLActivity;
import android.os.Bundle;
import android.util.Log;
import java.io.IOException;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.BufferedOutputStream;
import java.io.BufferedInputStream;
import java.io.InputStream;
import android.content.res.AssetManager;
import java.util.Enumeration;
import java.util.zip.*;
import java.util.Properties;
import android.app.AlertDialog;
import android.widget.EditText;
import android.content.DialogInterface;
import android.content.res.Configuration;
import android.os.Environment;

public class GemRB extends SDLActivity {

  public String newPath;

  protected void onCreate(Bundle savedInstanceState) {
    File gemrbHomeFolder = getApplicationContext().getExternalFilesDir(null); // null for general purpose files
    String[] foldersToExtract = { "GUIScripts", "override", "unhardcoded" };

    // first clear the directories and their contents
    Log.d("GemRB Activity", "Cleaning up...");
    for(String folder : foldersToExtract) {
      deleteRecursive(new File(gemrbHomeFolder.getAbsolutePath().concat(gemrbHomeFolder.separator).concat(folder)));
    }

    Log.d("GemRB Activity", "Extracting new files...");
    try {
      extractFolder(this.getApplication().getPackageCodePath(), gemrbHomeFolder.getAbsolutePath());
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
    Log.d("GemRB Activity", "Done.");

    Log.d("GemRB Activity", "Checking GemRB.cfg content.");

    File finalConfFile = new File(gemrbHomeFolder.getAbsolutePath().concat(gemrbHomeFolder.separator).concat("GemRB.cfg"));
    File userSuppliedConfig = new File(Environment.getExternalStorageDirectory().getAbsolutePath().concat(gemrbHomeFolder.separator).concat("GemRB.cfg"));

    if(!finalConfFile.exists()) {
      Log.d("GemRB Activity", "GemRB.cfg doesn't exist in the expected location, creating it from the packaged template.");

      // String[] keysToChange = { "GUIScriptsPath", "GemRBOverridePath", "GemRBUnhardcodedPath" };
      try {
        File inConfFile = new File(gemrbHomeFolder.getAbsolutePath().concat(gemrbHomeFolder.separator).concat("packaged.GemRB.cfg"));
        BufferedReader inConf = new BufferedReader(new FileReader(inConfFile));
        File outConfFile = new File(gemrbHomeFolder.getAbsolutePath().concat(gemrbHomeFolder.separator).concat("new.GemRB.cfg"));
        BufferedWriter outConf = new BufferedWriter(new FileWriter(outConfFile));

        String line;

        while((line = inConf.readLine()) != null) {
          outConf.write(line.concat("\n"));
          outConf.flush();
        }
        inConf.close();
        outConf.flush();
        outConf.close();

        inConfFile.delete();
        outConfFile.renameTo(finalConfFile);
      } catch (IOException e) {
        throw new RuntimeException(e);
      }
    }

    super.onCreate(savedInstanceState);
  }

  private static void deleteRecursive(File fileOrDirectory) {
      if (fileOrDirectory.isDirectory())
          for (File child : fileOrDirectory.listFiles())
              deleteRecursive(child);

      fileOrDirectory.delete();
  }

  private static void extractFolder(String zipFile, String newPath) throws ZipException, IOException {
      int BUFFER = 1024 * 1024;
      File file = new File(zipFile);

      ZipFile zip = new ZipFile(file);

      new File(newPath).mkdir();
      Enumeration zipFileEntries = zip.entries();

      // establish buffer for writing file
      byte data[] = new byte[BUFFER];
      // Process each entry
      while (zipFileEntries.hasMoreElements()) {
          // grab a zip file entry
          ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();
          String currentEntry = entry.getName();
          if(!currentEntry.contains("asset")) {
            continue;
          }
          File destFile = new File(newPath, currentEntry.substring(7)); // 6th index should be "/" of "assets/"
          //destFile = new File(newPath, destFile.getName());
          File destinationParent = destFile.getParentFile();

          // create the parent directory structure if needed
          destinationParent.mkdirs();

          if (!entry.isDirectory()) {
              InputStream is = zip.getInputStream(entry);
              int currentByte;

              // write the current file to disk
              FileOutputStream dest = new FileOutputStream(destFile);

              // read and write until last byte is encountered
              while ((currentByte = is.read(data, 0, BUFFER)) != -1) {
                  dest.write(data, 0, currentByte);
              }
              dest.flush();
              dest.close();
              is.close();
          }
      }
  }

  public void onConfigurationChanged(Configuration newConfig) {
    // we're only overriding for orientation change (cmp AndroidManifest.xml)
    // but we don't actually want to react to that
    super.onConfigurationChanged(newConfig);
  }
}