aboutsummaryrefslogtreecommitdiffstats
path: root/src/cmd-version.c
blob: 4ee43095cfcc7808531bcae0f11a61a15bdc66e2 (plain) (blame)
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
#include "command.h"
#include "commands.h"
#include "digest/digest.h"
#include "version.h"
#include "l2su.h"
#include "macros.h"
#include "args.h"

#include <jansson.h>
#include <stdio.h>
#include <unistd.h>

unsigned cmd_version_list_remote(struct l2_context_node *ctx, char **args)
{
  unsigned res;
  L2_UNUSED(ctx);

  if (*args) {
    CMD_FATAL(CMD_MSG_UNKNOWN_ARGUMENT, *args);
  }

  res = l2_version_load_remote();
  if (res != VERSION_SUCCESS) {
    CMD_FATAL("Failed to load versions: %s", l2_version_strerror(res));
  }

  for (struct l2_version_remote *rv = l2_state.ver_remote_head; rv; rv = rv->next) {
    printf("%s\n", rv->id);
  }

  return CMD_RESULT_SUCCESS;
}

unsigned cmd_version_list_local(struct l2_context_node *ctx, char **args)
{
  return CMD_RESULT_SUCCESS;
}

bool feat_match_cb(const char *name, json_t *js) {
  L2_UNUSED(name);
  L2_UNUSED(js);
  return false;
}

int l2_assets__load_index(json_t *version, json_t **asset_index);
int l2_assets__download_assets(json_t *asset_index, char **path);

unsigned cmd_version_install(struct l2_context_node *ctx, char **args)
{
  unsigned res = l2_version_load_remote();
  char *jarpath = NULL;

  if (res != VERSION_SUCCESS) {
    CMD_FATAL("failed to load versions: %s", l2_version_strerror(res));
  }
 
  json_t *js;
  res = l2_version_load_local(*args, &js);
  if (res != VERSION_SUCCESS) {
    CMD_FATAL("failed to load 1.8.9: %s", l2_version_strerror(res));
  }

  CMD_INFO0("Retrieving library list...");
  struct l2_version_library *libs = NULL;
  if ((res = l2_version_collect_libraries(js, &libs, &feat_match_cb)) != VERSION_SUCCESS) {
    CMD_FATAL("Failed to collect library list: %s", l2_version_strerror(res));
  }

  CMD_INFO0("Downloading libraries...");
  if ((res = l2_version_download_libraries(libs)) != VERSION_SUCCESS) {
    CMD_FATAL("Failed to download libraries: %s", l2_version_strerror(res));
  }

  CMD_INFO0("Downloading client jar...");
  if ((res = l2_version_download_jar(js, "client", &jarpath)) != VERSION_SUCCESS) {
    CMD_FATAL("Failed to download client jar: %s", l2_version_strerror(res));
  }

  CMD_INFO0("Downloading asset index...");
  json_t *assets = NULL;
  if (l2_assets__load_index(js, &assets) < 0) {
    CMD_FATAL0("Failed to load asset index.");
  }

  CMD_INFO0("Downloading assets...");
  char *assetsbase = NULL;
  if (l2_assets__download_assets(assets, &assetsbase) < 0) {
    CMD_FATAL0("Failed to download assets.");
  }

  char *nativesdir = NULL;
  CMD_INFO0("Extracting natives...");
  if ((res = l2_version_extract_natives(libs, &nativesdir)) != VERSION_SUCCESS) {
    CMD_FATAL("Failed to extract natives: %s", l2_version_strerror(res));
  }

  char **game_args;
  size_t ngame_args;
  l2_subst_t *st;
  l2_subst_init(&st);
  l2_subst_add(st, "version_name", "1.8.9");
  if (l2_args_get_game_args(js, st, &feat_match_cb, &game_args, &ngame_args) < 0) {
    CMD_FATAL0("Failed to find game arguments");
  }
  for (size_t n = 0; n < ngame_args; ++n) {
    CMD_DEBUG("arg: %s", game_args[n]);
    free(game_args[n]);
  }
  free(game_args);

  if (l2_args_get_jvm_args(js, st, &feat_match_cb, &game_args, &ngame_args) < 0) {
    CMD_FATAL0("Failed to find JVM arguments");
  }
  for (size_t n = 0; n < ngame_args; ++n) {
    CMD_DEBUG("jvm arg: %s", game_args[n]);
    free(game_args[n]);
  }
  free(game_args);

  l2_subst_free(st);

  CMD_INFO("Assets base: %s", assetsbase);

  free(assetsbase);
  json_decref(assets);

  l2_version_free_libraries(libs);
  free(jarpath);
  json_decref(js);

  return CMD_RESULT_SUCCESS;
}