Class: Mspack::ChmDecompressor

Inherits:
Object
  • Object
show all
Defined in:
lib/mspack/chm_decompressor.rb,
ext/mspack_native/chm_decompressor.c

Defined Under Namespace

Classes: File, Header

Instance Method Summary collapse

Instance Method Details

#close(header) ⇒ Object



102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'ext/mspack_native/chm_decompressor.c', line 102

VALUE chmd_close(VALUE self, VALUE header) {
  if (!CLASS_OF(header) == ChmDHeader) {
    rb_raise(rb_eTypeError, "Parameter must be a CHM decompression header");
  }

  struct mschm_decompressor *decom;
  Data_Get_Struct(self, struct mschm_decompressor, decom);

  struct mschmd_header *headerPtr;
  Data_Get_Struct(header, struct mschmd_header, headerPtr);

  decom->close(decom, headerPtr);
  return Qnil;
}

#extract(file, dir) ⇒ Object

Expects a ChmDecompressor::File and a string. Calls Mspack.ensure_path and extracts file. Returns the absolute file path.



9
10
11
12
13
# File 'lib/mspack/chm_decompressor.rb', line 9

def extract(file, dir)
  path = Mspack.ensure_path(file.filename, dir)
  extract_to_path(file, path)
  path
end

#extract_to_path(file, outputPath) ⇒ Object



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'ext/mspack_native/chm_decompressor.c', line 117

VALUE chmd_extract_to_path(VALUE self, VALUE file, VALUE outputPath) {
  if (!CLASS_OF(file) == ChmDFile) {
    rb_raise(rb_eTypeError, "First parameter must be a CHM decompression file");
  }

  Check_Type(outputPath, T_STRING);

  struct mschm_decompressor *decom;
  Data_Get_Struct(self, struct mschm_decompressor, decom);

  struct mschmd_file *filePtr;
  Data_Get_Struct(file, struct mschmd_file, filePtr);
  const char *pathStr = StringValueCStr(outputPath);

  int result = decom->extract(decom, filePtr, pathStr);
  return result == MSPACK_ERR_OK ? Qtrue : Qfalse;
}

#fast_find(header, filename) ⇒ Object



147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'ext/mspack_native/chm_decompressor.c', line 147

VALUE chmd_fast_find(VALUE self, VALUE header, VALUE filename) {
  struct mschm_decompressor *decom;
  Data_Get_Struct(self, struct mschm_decompressor, decom);

  struct mschmd_header *headerPtr;
  Data_Get_Struct(header, struct mschmd_header, headerPtr);

  const char *filenameStr = StringValueCStr(filename);

  int structSize = sizeof(struct mschmd_file);
  struct mschmd_file *file = malloc(structSize);

  int result = 
    decom->fast_find(decom, headerPtr, filenameStr, file, structSize);

  if (result != MSPACK_ERR_OK || file->length == 0) {
    free(file);
    return Qnil;
  }  

  file->filename = malloc(sizeof(char) * strlen(filenameStr) + 1);
  strcpy(file->filename, filenameStr);

  VALUE fileObj = Data_Wrap_Struct(ChmDFile, NULL, NULL, file);
  rb_iv_set(fileObj, "is_fast_find", Qtrue);
  return fileObj;
}

#fast_open(path) ⇒ Object



143
144
145
# File 'ext/mspack_native/chm_decompressor.c', line 143

VALUE chmd_fast_open(VALUE self, VALUE path) {
  return _open(self, path, 1);
}

#last_errorObject



135
136
137
138
139
140
141
# File 'ext/mspack_native/chm_decompressor.c', line 135

VALUE chmd_last_error(VALUE self) {
  struct mschm_decompressor *decom;
  Data_Get_Struct(self, struct mschm_decompressor, decom);

  int error = decom->last_error(decom);
  return _error_code_sym(error);
}

#open(path) ⇒ Object



98
99
100
# File 'ext/mspack_native/chm_decompressor.c', line 98

VALUE chmd_open(VALUE self, VALUE path) {
  return _open(self, path, 0);
}