Handle<Value> Dataset::addBand(const Arguments& args) { HandleScope scope; Dataset *ds = ObjectWrap::Unwrap<Dataset>(args.This()); if(!ds->this_) return NODE_THROW("Dataset object has already been destroyed"); GDALDataType type; Handle<Array> band_options = Array::New(0); char **options = NULL; NODE_ARG_ENUM(0, "data type", GDALDataType, type); NODE_ARG_ARRAY_OPT(1, "band creation options", band_options); if (band_options->Length() > 0) { options = new char* [band_options->Length()]; for (unsigned int i = 0; i < band_options->Length(); ++i) { options[i] = TOSTR(band_options->Get(i)); } } CPLErr err = ds->this_->AddBand(type, options); if (options) { delete [] options; } if(err) return NODE_THROW_CPLERR(err); return scope.Close(RasterBand::New(ds->this_->GetRasterBand(ds->this_->GetRasterCount()))); }
Handle<Value> DatasetBands::create(const Arguments& args) { HandleScope scope; Handle<Object> parent = args.This()->GetHiddenValue(String::NewSymbol("parent_"))->ToObject(); Dataset *ds = ObjectWrap::Unwrap<Dataset>(parent); if (ds->uses_ogr){ return NODE_THROW("Dataset does not support getting creating bands"); } GDALDataset* raw = ds->getDataset(); if (!raw) { return NODE_THROW("Dataset object has already been destroyed"); } GDALDataType type; Handle<Array> band_options = Array::New(0); char **options = NULL; std::string *options_str = NULL; //NODE_ARG_ENUM(0, "data type", GDALDataType, type); if(args.Length() < 1) { return NODE_THROW("data type argument needed"); } if(args[0]->IsString()){ std::string type_name = TOSTR(args[0]); type = GDALGetDataTypeByName(type_name.c_str()); } else if (args[0]->IsNull() || args[0]->IsUndefined()) { type = GDT_Unknown; } else { return NODE_THROW("data type must be string or undefined"); } NODE_ARG_ARRAY_OPT(1, "band creation options", band_options); if (band_options->Length() > 0) { options = new char* [band_options->Length()]; options_str = new std::string [band_options->Length()]; for (unsigned int i = 0; i < band_options->Length(); ++i) { options_str[i] = TOSTR(band_options->Get(i)); options[i] = (char*) options_str[i].c_str(); } } CPLErr err = raw->AddBand(type, options); if(options) delete [] options; if(options_str) delete [] options_str; if (err) { return NODE_THROW_CPLERR(err); } return scope.Close(RasterBand::New(raw->GetRasterBand(raw->GetRasterCount()), raw)); }