Handle<Value> ZipFile::New(const Arguments& args) { if (!args.IsConstructCall()) return ThrowException(String::New("Cannot call constructor as function, you need to use 'new' keyword")); if (args.Length() != 1 || !args[0]->IsString()) return ThrowException(Exception::TypeError( String::New("first argument must be a path to a zipfile"))); std::string input_file = TOSTR(args[0]); struct zip *za; int err; char errstr[1024]; if ((za=zip_open(input_file.c_str(), ZIP_CREATE, &err)) == NULL) { zip_error_to_str(errstr, sizeof(errstr), err, errno); std::stringstream s; s << "cannot open file: " << input_file << " error: " << errstr << "\n"; return ThrowException(Exception::Error( String::New(s.str().c_str()))); } ZipFile* zf = new ZipFile(input_file); zf->archive = za; zf->GetNames(); zf->Wrap(args.This()); return args.This(); }
/* zipfile.addFile(nameInArchive, name, offset, len) */ Handle<Value> ZipFile::Add_File(const Arguments& args) { ZipFile* zf = ObjectWrap::Unwrap<ZipFile>(args.This()); struct zip_source *source; if (zf->Busy()) return ThrowException(Exception::Error(String::New("Zipfile already in use.."))); if (!args[0]->IsString()) return ThrowException(Exception::TypeError( String::New("Argument must be a file name."))); std::string archive_file = TOSTR(args[0]); std::string name; if (args[1]->IsUndefined()) name = archive_file; else if (!args[1]->IsString()) return ThrowException(Exception::TypeError( String::New("Argument must be a file name."))); name = TOSTR(args[1]); zip_int64_t off; if (args[2]->IsUndefined()) off = 0; else off = args[2]->Int32Value(); zip_int64_t len; if (args[3]->IsUndefined()) len = -1; else len = args[3]->Int32Value(); source = zip_source_file(zf->archive, name.c_str(), off, len); if (source == NULL) { std::stringstream s; s << "Error while adding file " << name << " to zip archive: " << zip_strerror(zf->archive) << "\n"; return ThrowException(Exception::Error(String::New(s.str().c_str()))); } int ret = zip_add(zf->archive, archive_file.c_str(), source); if (ret < 0) { zip_source_free(source); std::stringstream s; s << "Error while adding file " << name << " to zip archive: " << zip_strerror(zf->archive) << "\n"; return ThrowException(Exception::Error(String::New(s.str().c_str()))); } zf->GetNames(); return Undefined(); }
/* zipfile.addDirectory(name) */ Handle<Value> ZipFile::Add_Directory(const Arguments& args) { ZipFile* zf = ObjectWrap::Unwrap<ZipFile>(args.This()); if (zf->Busy()) return ThrowException(Exception::Error(String::New("Zipfile already in use.."))); if (!args[0]->IsString()) return ThrowException(Exception::TypeError( String::New("Argument must be a directory name."))); std::string directory = TOSTR(args[0]); int ret = zip_add_dir(zf->archive, directory.c_str()); if (ret < 0) { std::stringstream s; s << "Error while adding directory " << directory << " to zip archive: " << zip_strerror(zf->archive) << "\n"; return ThrowException(Exception::Error(String::New(s.str().c_str()))); } zf->GetNames(); return Undefined(); }