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;
}
Exemple #3
0
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);
}