Handle<Value> MSMap::DrawMap (const Arguments& args) { HandleScope scope; REQ_FUN_ARG(0, cb); MSMap *map = ObjectWrap::Unwrap<MSMap>(args.This()); char * version = msGetVersion(); char * regex = "SUPPORTS\\=THREADS"; int match; match = 0; if (msEvalRegex(regex, version) == MS_TRUE) { match = 1; } else { // discard the error reported by msEvalRegex saying that it failed msResetErrorList(); } if (match == 1) { drawmap_baton * baton = new drawmap_baton(); baton->request.data = (void*) baton; baton->map = map; baton->cb = Persistent<Function>::New(cb); map->Ref(); uv_queue_work(uv_default_loop(), &baton->request, DrawMapWork, (uv_after_work_cb) DrawMapAfter); } else { Local<Value> argv[2]; argv[0] = Local<Value>::New(Null()); imageObj * im = msDrawMap(map->this_, MS_FALSE); if (im != NULL) { int size; char * data = (char *)msSaveImageBuffer(im, &size, map->this_->outputformat); msFreeImage(im); Buffer * buffer = Buffer::New(data, size, FreeImageBuffer, NULL); argv[1] = Local<Value>::New(buffer->handle_); } else { errorObj * err = msGetErrorObj(); Local<Value> _arg_ = External::New(err); argv[0] = Local<Value>::New(MSError::New(err)); argv[1] = Local<Value>::New(Null()); } cb->Call(Context::GetCurrent()->Global(), 2, argv); } return Undefined(); }
void MSMap::DrawMapWork(uv_work_t *req) { drawmap_baton *baton = static_cast<drawmap_baton*>(req->data); imageObj * im = msDrawMap(baton->map->this_, MS_FALSE); if (im != NULL) { baton->error = NULL; baton->data = (char *)msSaveImageBuffer(im, &baton->size, baton->map->this_->outputformat); msFreeImage(im); } else { baton->error = msGetErrorObj(); baton->data = NULL; } return; }
PHP_METHOD(imageObj, saveImage) { zval *zobj = getThis(); zval *zmap = NULL; char *filename = NULL; long filename_len = 0; php_image_object *php_image; php_map_object *php_map; int status = MS_SUCCESS; /* stdout specific vars */ int size=0; void *iptr=NULL; PHP_MAPSCRIPT_ERROR_HANDLING(TRUE); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sO", &filename, &filename_len, &zmap, mapscript_ce_map) == FAILURE) { PHP_MAPSCRIPT_RESTORE_ERRORS(TRUE); return; } PHP_MAPSCRIPT_RESTORE_ERRORS(TRUE); php_image = (php_image_object *) zend_object_store_get_object(zobj TSRMLS_CC); if (zmap) php_map = (php_map_object *) zend_object_store_get_object(zmap TSRMLS_CC); if(filename_len > 0) { if ((status = msSaveImage((zmap ? php_map->map:NULL), php_image->image, filename) != MS_SUCCESS)) { mapscript_throw_mapserver_exception("Failed writing image to %s" TSRMLS_CC, filename); return; } RETURN_LONG(status); } /* no filename - read stdout */ /* if there is no output buffer active, set the header */ //handle changes in PHP 5.4.x #if PHP_VERSION_ID < 50399 if (OG(ob_nesting_level)<=0) { php_header(TSRMLS_C); } #else if (php_output_get_level(TSRMLS_C)<=0) { php_header(TSRMLS_C); } #endif if (MS_RENDERER_PLUGIN(php_image->image->format)) { iptr = (void *)msSaveImageBuffer(php_image->image, &size, php_image->image->format); } else if (php_image->image->format->name && (strcasecmp(php_image->image->format->name, "imagemap")==0)) { iptr = php_image->image->img.imagemap; size = strlen(php_image->image->img.imagemap); } if (size == 0) { mapscript_throw_mapserver_exception("Failed writing image to stdout" TSRMLS_CC); return; } else { php_write(iptr, size TSRMLS_CC); status = MS_SUCCESS; /* status = size; why should we return the size ?? */ msFree(iptr); } RETURN_LONG(status); }