Exemplo n.º 1
0
http_off_t http_req_body_get_sync(HTTP_REQ *request, ACL_VSTREAM *stream,
	void *buf, int size)
{
	HTTP_CHAT_CTX *ctx;

	if (request->hdr_req->hdr.content_length == 0) {
		/* 扩展了HTTP请求协议部分, 允许请求数据为块传输 */
		if (request->hdr_req->hdr.chunked == 0)
			return 0;
	}

	if (request->ctx == NULL) {
		ctx            = new_ctx();
		ctx->hdr       = &request->hdr_req->hdr;
		ctx->stream    = stream;

		/* 扩展了HTTP请求协议部分, 允许请求数据为块传输 */
		ctx->chunked   = request->hdr_req->hdr.chunked;
		ctx->chunk_len = request->hdr_req->hdr.content_length;
		ctx->body_len  = 0;
		ctx->read_cnt  = 0;
		if (ctx->chunked)
			ctx->chunk.chunk_oper = CHUNK_OPER_HEAD;
		request->ctx = (void*) ctx;
		request->free_ctx = free_ctx;
	} else
		ctx = (HTTP_CHAT_CTX*) request->ctx;

	ctx->flag = request->flag;
	return body_get(ctx, buf, size);
}
Exemplo n.º 2
0
http_off_t http_res_body_get_sync(HTTP_RES *respond, ACL_VSTREAM *stream,
	void *buf, int size)
{
	HTTP_CHAT_CTX *ctx;

	if (respond->hdr_res->hdr.content_length == 0) {
		/* 块传输协议优先于 content-length */
		if (respond->hdr_res->hdr.chunked == 0)
			return 0;
	}

	if (respond->ctx == NULL) {
		ctx            = new_ctx();
		ctx->hdr       = &respond->hdr_res->hdr;
		ctx->stream    = stream;
		ctx->chunked   = respond->hdr_res->hdr.chunked;
		ctx->chunk_len = respond->hdr_res->hdr.content_length;
		ctx->body_len  = 0;
		ctx->read_cnt  = 0;
		if (ctx->chunked)
			ctx->chunk.chunk_oper = CHUNK_OPER_HEAD;
		respond->ctx = (void*) ctx;
		respond->free_ctx = free_ctx;
	} else
		ctx = (HTTP_CHAT_CTX*) respond->ctx;

	ctx->flag = respond->flag;
	return body_get(ctx, buf, size);
}
Exemplo n.º 3
0
BIO *neo4j_openssl_new_bio(BIO *delegate, const char *hostname, int port,
        const neo4j_config_t *config, uint_fast32_t flags)
{
    neo4j_logger_t *logger = neo4j_get_logger(config, "tls");

    SSL_CTX *ctx = new_ctx(config, logger);
    if (ctx == NULL)
    {
        return NULL;
    }

    BIO *ssl_bio = BIO_new_ssl(ctx, 1);
    if (ssl_bio == NULL)
    {
        errno = openssl_error(logger, NEO4J_LOG_ERROR, __FILE__, __LINE__);
        SSL_CTX_free(ctx);
        goto failure;
    }

    SSL_CTX_free(ctx);

    BIO_push(ssl_bio, delegate);
    if (BIO_set_close(ssl_bio, BIO_CLOSE) != 1)
    {
        errno = openssl_error(logger, NEO4J_LOG_ERROR, __FILE__, __LINE__);
        goto failure;
    }

    int result = BIO_do_handshake(ssl_bio);
    if (result != 1)
    {
        if (result == 0)
        {
            errno = NEO4J_NO_SERVER_TLS_SUPPORT;
            goto failure;
        }
        errno = openssl_error(logger, NEO4J_LOG_ERROR, __FILE__, __LINE__);
        goto failure;
    }

    SSL *ssl = NULL;
    BIO_get_ssl(ssl_bio, &ssl);
    assert(ssl != NULL);
    if (verify(ssl, hostname, port, config, flags, logger))
    {
        goto failure;
    }

    return ssl_bio;

    int errsv;
failure:
    errsv = errno;
    BIO_free(ssl_bio);
    errno = errsv;
    return NULL;
}
Exemplo n.º 4
0
void GrowWindow::update_attributes()
{
    if ( strcmp( input_file_name, file_name) != 0 ||
            (window_ctx && strcmp( window_ctx->owner, owner) != 0)) {
        // New graph, create new context
#if 0
        int ur_x = int( (x_right - vertical_scrollbar * scrollbar_width) * ctx->mw.zoom_factor_x) - ctx->mw.offset_x;
        int	ll_x = int( x_left * ctx->mw.zoom_factor_x) - ctx->mw.offset_x;
        int	ur_y = int( (y_high - horizontal_scrollbar * scrollbar_width) * ctx->mw.zoom_factor_y) - ctx->mw.offset_y;
        int ll_y = int( (y_low + y_low_offs) * ctx->mw.zoom_factor_y) - ctx->mw.offset_y;

        if ( window_ctx)
            window_ctx->draw_buffer_only = ctx->draw_buffer_only;
        glow_draw_set_clip_rectangle( ctx, ll_x, ll_y, ur_x, ur_y);
#endif
        int ur_x = int( x_right * ctx->mw.zoom_factor_x) - ctx->mw.offset_x;
        int	ll_x = int( x_left * ctx->mw.zoom_factor_x) - ctx->mw.offset_x;
        int	ur_y = int( y_high * ctx->mw.zoom_factor_y) - ctx->mw.offset_y;
        int ll_y = int( y_low * ctx->mw.zoom_factor_y) - ctx->mw.offset_y;
        ctx->gdraw->set_clip_rectangle( &ctx->mw, ll_x, ll_y, ur_x, ur_y);

        if ( window_ctx) {
            if ( window_ctx->trace_started)
                window_ctx->trace_close();
            delete window_ctx;
            fill_drawtype = original_fill_drawtype = glow_eDrawType_Inherit;
            fill = 0;
        }
        strcpy( file_name, input_file_name);
        new_ctx();

        //#if 0
        ctx->gdraw->reset_clip_rectangle( &ctx->mw);
        //#endif
    }
    if ( window_ctx) {
        window_ctx->mw.subwindow_scale = window_scale;
        window_ctx->mw.zoom_factor_x = window_ctx->mw.zoom_factor_y =
                                           window_ctx->mw.subwindow_scale * ctx->mw.zoom_factor_x;
        window_ctx->a.zoom();
    }

    configure_scrollbars();

    if ( v_scrollbar)
        v_scrollbar->set_colors( scrollbar_bg_color, scrollbar_color);
    if ( h_scrollbar)
        h_scrollbar->set_colors( scrollbar_bg_color, scrollbar_color);
}
Exemplo n.º 5
0
static void hdr_get_async(ctx_type type, HTTP_HDR *hdr, ACL_ASTREAM *astream,
	HTTP_HDR_NOTIFY notify, void *arg, int timeout)
{
	const char *myname = "hdr_get_async";
	HTTP_CHAT_CTX *ctx;
	ACL_VSTREAM *stream;

	if (hdr == NULL || astream == NULL || notify == NULL)
		acl_msg_fatal("%s: input invalid", myname);

	stream = acl_aio_vstream(astream);
	stream->rw_timeout = 0; /* bug fix, --zsx, 2007.7.7 */

	if (hdr->chat_ctx == NULL) {
		hdr->chat_ctx = new_ctx(type);
		hdr->chat_free_ctx_fn = free_ctx_fn;
	}
	ctx = (HTTP_CHAT_CTX*) hdr->chat_ctx;
	ctx->hdr = hdr;
	ctx->timeout = timeout;
	ctx->notify.hdr_notify = notify;
	ctx->arg = arg;
	ctx->status = CHAT_S_HDR;

	if (0) {
		acl_aio_ctl(astream,
			ACL_AIO_CTL_READ_HOOK_ADD, hdr_gets_ready, ctx,
			ACL_AIO_CTL_TIMEOUT, timeout,
			ACL_AIO_CTL_END);
		acl_aio_gets_nonl(astream);
	} else {
		acl_aio_ctl(astream, ACL_AIO_CTL_TIMEOUT, timeout,
			ACL_AIO_CTL_END);
		acl_aio_enable_read(astream, hdr_can_read, ctx);
	}
}
Exemplo n.º 6
0
/**
 * @brief
 *	This function is called from vn_addvnr() before vn_addvnr() inserts a
 *	new name/value pair.  If we return zero, the insertion of the given
 *	<ID, name, value> tuple will not occur (but processing of the file
 *	will continue normally);  if we return nonzero, the insertion of
 *	the given tuple will occur (and again, processing continues normally).
 *
 *	Currently we use this function to perform these actions:
 *
 *		for the "cpus" attribute, build a list of the CPUs belonging
 *		to given vnodes
 *
 *		for the "mems" attribute, to record the memory node number of
 *		the memory board belonging to a given vnode (note that in
 *		contrast to CPUs, of which there may be more than one, the
 *		model for memory is that of a single (logical) memory board
 *		per vnode)
 *
 *		for the "sharing" attribute, we simply remember the attribute
 *		value for later use in make_cpuset(), q.v.
 *
 *		for the "resources_available.mem" attribute, set a flag that
 *		tells us to remember to do the memreserved adjustment
 *
 * @param[in] vnid - vnode id
 * @param[in] attr - attributes
 * @param[in] attrval - attribute value
 *
 * @return int
 * @retval -1     Failure
 * @retval  0,1   Success
 *
 */
int
vn_callback(const char *vnid, char *attr, char *attrval)
{
	static void		*ctx = NULL;
#if	defined(MOM_CPUSET)
	static char		memres[] = "resources_available.mem";

	/*
	 *	If we're setting the memory on a vnode, turn on a flag telling
	 *	us to remember to do the memreserved adjustment.
	 */
	if ((do_memreserved_adjustment == 0) && (strcmp(attr, memres) == 0)) {
		do_memreserved_adjustment = 1;
		return (1);
	}
#endif	/* MOM_CPUSET */

	if (strcmp(attr, "cpus") == 0) {
		mom_vninfo_t	*mvp;

		sprintf(log_buffer, "vnid %s, attr %s, val %s",
			vnid, attr, attrval);
		log_event(PBSEVENT_DEBUG3, 0, 0, __func__, log_buffer);

		if ((ctx == NULL) && ((ctx = new_ctx()) == NULL))
			return (-1);
		if ((mvp = vnid2mominfo(vnid, ctx)) == NULL)
			return (0);

		add_CPUlist(mvp, attrval);
		return (0);
	} else if (strcmp(attr, "mems") == 0) {
		mom_vninfo_t	*mvp;

		sprintf(log_buffer, "vnid %s, attr %s, val %s",
			vnid, attr, attrval);
		log_event(PBSEVENT_DEBUG3, 0, 0, __func__, log_buffer);

		if ((ctx == NULL) && ((ctx = new_ctx()) == NULL))
			return (-1);
		if ((mvp = vnid2mominfo(vnid, ctx)) == NULL)
			return (0);

		mvp->mvi_memnum = atoi(attrval);
#if	defined(MOM_CPUSET) && (CPUSET_VERSION >= 4)
		if (memmask_add(mvp->mvi_memnum) != 0)
			return (-1);
#endif	/* MOM_CPUSET && CPUSET_VERSION >= 4 */
		return (0);
	} else if (strcmp(attr, "sharing") == 0) {
		mom_vninfo_t	*mvp;

		if ((ctx == NULL) && ((ctx = new_ctx()) == NULL))
			return (-1);
		if ((mvp = vnid2mominfo(vnid, ctx)) == NULL)
			return (0);

		mvp->mvi_sharing = str_to_vnode_sharing(attrval);
		return (1);

	} else
		return (1);
}
Exemplo n.º 7
0
int
be_visitor_structure_cdr_op_cs::visit_structure (be_structure *node)
{
  if (node->cli_stub_cdr_op_gen ()
      || node->imported ()
      || node->is_local ())
    {
      return 0;
    }

  // Set the substate as generating code for the types defined in our scope.
  this->ctx_->sub_state (TAO_CodeGen::TAO_CDR_SCOPE);

  if (this->visit_scope (node) == -1)
    {
      ACE_ERROR_RETURN ((LM_ERROR,
                         ACE_TEXT ("be_visitor_structure_cdr_op_cs::")
                         ACE_TEXT ("visit_structure - ")
                         ACE_TEXT ("codegen for scope failed\n")),
                        -1);
    }

  TAO_OutStream *os = this->ctx_->stream ();

  *os << be_nl_2 << "// TAO_IDL - Generated from" << be_nl
      << "// " << __FILE__ << ":" << __LINE__ << be_nl;

  *os << be_global->core_versioning_begin () << be_nl;

  //  Set the sub state as generating code for the output operator.
  this->ctx_->sub_state (TAO_CodeGen::TAO_CDR_OUTPUT);

  *os << "::CORBA::Boolean operator<< (" << be_idt << be_idt_nl
      << "TAO_OutputCDR &strm," << be_nl
      << "const " << node->name () << " &_tao_aggregate)" << be_uidt
      << be_uidt_nl
      << "{" << be_idt_nl;

  be_visitor_context new_ctx (*this->ctx_);
  be_visitor_cdr_op_field_decl field_decl (&new_ctx);

  if (field_decl.visit_scope (node) == -1)
    {
      ACE_ERROR_RETURN ((LM_ERROR,
                         ACE_TEXT ("be_visitor_structure_cdr_op_cs::")
                         ACE_TEXT ("visit_structure - ")
                         ACE_TEXT ("codegen for field decl failed\n")),
                        -1);
    }

  *os << "return" << be_idt_nl;

  if (this->visit_scope (node) == -1)
    {
      ACE_ERROR_RETURN ((LM_ERROR,
                         ACE_TEXT ("be_visitor_structure_cdr_op_cs::")
                         ACE_TEXT ("visit_structure - ")
                         ACE_TEXT ("codegen for scope failed\n")),
                        -1);
    }

  *os << ";" << be_uidt << be_uidt_nl
      << "}" << be_nl_2;

  // Set the substate as generating code for the input operator.
  this->ctx_->sub_state (TAO_CodeGen::TAO_CDR_INPUT);

  *os << "::CORBA::Boolean operator>> (" << be_idt << be_idt_nl
      << "TAO_InputCDR &";

  if (! node->is_local ())
    {
      *os << "strm";
    }

  *os << "," << be_nl
      << node->name () << " &";

  if (! node->is_local ())
    {
      *os << "_tao_aggregate";
    }

  *os << ")" << be_uidt << be_uidt_nl
      << "{" << be_idt_nl;

  if (node->is_local ())
    {
      *os << "return false;";
    }
  else
    {
      new_ctx.sub_state (TAO_CodeGen::TAO_CDR_INPUT);

      if (field_decl.visit_scope (node) == -1)
        {
          ACE_ERROR_RETURN ((LM_ERROR,
                             ACE_TEXT ("be_visitor_structure_cdr_op_cs::")
                             ACE_TEXT ("visit_structure - ")
                             ACE_TEXT ("codegen for field ")
                             ACE_TEXT ("decl scope failed\n")),
                            -1);
        }

      *os << "return" << be_idt_nl;

      if (this->visit_scope (node) == -1)
        {
          ACE_ERROR_RETURN ((LM_ERROR,
                             ACE_TEXT ("be_visitor_structure_cdr_op_cs")
                             ACE_TEXT ("::visit_structure - ")
                             ACE_TEXT ("codegen for scope failed\n")),
                            -1);
        }

      *os << ";" << be_uidt << be_uidt;
    }

  *os << be_uidt_nl << "}" << be_nl;

  if (be_global->gen_ostream_operators ())
    {
      node->gen_ostream_operator (os, false);
    }

  *os << be_global->core_versioning_end () << be_nl;

  node->cli_stub_cdr_op_gen (true);

  return 0;
}
Exemplo n.º 8
0
int
be_visitor_valuetype_cdr_op_cs::visit_valuetype (be_valuetype *node)
{
  // Already generated and/or we are imported. Don't do anything.
  if (node->cli_stub_cdr_op_gen ()
      || node->imported ()
      || ! node->is_defined ())
    {
      return 0;
    }

  // Generate helper functions implementation.
  if (node->gen_helper_stubs () == -1)
    {
      ACE_ERROR_RETURN ((LM_ERROR,
                         "(%N:%l) be_visitor_valuetype_cdr_op_cs::"
                         "visit_valuetype - "
                         "codegen for helper functions failed\n"),
                        -1);
    }

  TAO_OutStream *os = this->ctx_->stream ();
  node->cli_stub_cdr_op_gen (true);

  if (this->visit_scope (node) == -1)
    {
      ACE_ERROR_RETURN ((LM_ERROR,
                         "(%N:%l) be_visitor_valuetype_cdr_op_ci"
                         "::visit_valuetype - "
                         "codegen for scope failed\n"),
                        -1);
    }

  *os << be_nl_2 << "// TAO_IDL - Generated from" << be_nl
      << "// " << __FILE__ << ":" << __LINE__ << be_nl_2;

  *os << be_global->core_versioning_begin () << be_nl;

  //  Set the sub state as generating code for the output operator.
  this->ctx_->sub_state(TAO_CodeGen::TAO_CDR_OUTPUT);

  *os << "::CORBA::Boolean" << be_nl
      << "operator<< (" << be_idt << be_idt_nl
      << "TAO_OutputCDR &strm," << be_nl
      << "const " << node->full_name ()
      << " *_tao_valuetype" << be_uidt_nl
      << ")" << be_uidt_nl
      << "{" << be_idt_nl;
  *os << "return" << be_idt_nl
      << "::CORBA::ValueBase::_tao_marshal (" << be_idt << be_idt_nl
      << "strm," << be_nl
      << "_tao_valuetype," << be_nl
      << "reinterpret_cast<ptrdiff_t> (&"
      << node->full_name () << "::_downcast)"
      << be_uidt_nl
      << ");" << be_uidt << be_uidt << be_uidt_nl
      << "}" << be_nl_2;

  *os << "::CORBA::Boolean" << be_nl
      << "operator>> (" << be_idt << be_idt_nl
      << "TAO_InputCDR &strm," << be_nl
      << node->full_name ()
      << " *&_tao_valuetype" << be_uidt_nl
      << ")" << be_uidt_nl
      << "{" << be_idt_nl;
  *os << "return " << node->full_name ()
      << "::_tao_unmarshal (strm, _tao_valuetype);"
      << be_uidt_nl
      << "}" << be_nl_2;

  if (be_global->gen_ostream_operators ())
    {
      node->gen_ostream_operator (os, false);
    }

  *os << be_global->core_versioning_end () << be_nl;

  if (!node->is_abstract ())
    {
      // Functions that marshal state.
      be_visitor_context new_ctx (*this->ctx_);
      be_visitor_valuetype_marshal_cs visitor (&new_ctx);
      visitor.visit_valuetype (node);
    }

  return 0;
}
Exemplo n.º 9
0
int
be_visitor_exception_cdr_op_cs::visit_exception (be_exception *node)
{
  if (node->cli_stub_cdr_op_gen ()
      || node->imported ()
      || node->is_local ())
    {
      return 0;
    }

  this->ctx_->sub_state(TAO_CodeGen::TAO_CDR_SCOPE);

  if (this->visit_scope (node) == -1)
    {
      ACE_ERROR_RETURN ((LM_ERROR,
                         ACE_TEXT ("(be_visitor_exception_cdr_op_cs::")
                         ACE_TEXT ("visit_exception - ")
                         ACE_TEXT ("codegen for scope failed\n")),
                        -1);
    }

  TAO_OutStream *os = this->ctx_->stream ();

  *os << be_nl_2 << "// TAO_IDL - Generated from" << be_nl
      << "// " << __FILE__ << ":" << __LINE__;

  *os << be_global->core_versioning_begin () << be_nl;

  //  Set the sub state as generating code for the output operator.
  this->ctx_->sub_state (TAO_CodeGen::TAO_CDR_OUTPUT);

  *os << be_nl_2
      << "::CORBA::Boolean operator<< (" << be_idt << be_idt_nl
      << "TAO_OutputCDR &strm," << be_nl
      << "const " << node->name () << " &_tao_aggregate)" << be_uidt
      << be_uidt_nl
      << "{" << be_idt_nl;

  // Do we have any members?
  if (node->nmembers () > 0)
    {
      be_visitor_context new_ctx (*this->ctx_);
      be_visitor_cdr_op_field_decl field_decl (&new_ctx);

      if (field_decl.visit_scope (node) == -1)
        {
          ACE_ERROR_RETURN ((LM_ERROR,
                             ACE_TEXT ("be_visitor_exception_cdr_op_cs::")
                             ACE_TEXT ("visit_exception - ")
                             ACE_TEXT ("codegen for field decl scope failed\n")),
                            -1);
        }

      // some members
      *os << "// First marshal the repository ID." << be_nl
          << "if (strm << _tao_aggregate._rep_id ())" << be_idt_nl
          << "{" << be_idt_nl
          << "// Now marshal the members (if any)." << be_nl
          << "return (" << be_idt_nl;

      if (this->visit_scope (node) == -1)
        {
          ACE_ERROR_RETURN ((LM_ERROR,
                             ACE_TEXT ("be_visitor_exception_cdr_op_cs::")
                             ACE_TEXT ("visit_exception - ")
                             ACE_TEXT ("codegen for scope failed\n")),
                            -1);
        }

      *os << be_uidt_nl << " );" << be_uidt_nl
          << "}" << be_uidt_nl
          << "else" << be_idt_nl
          << "{" << be_idt_nl
          << "return false;" << be_uidt_nl
          << "}" << be_uidt << be_uidt_nl;
    }
  else
    {
      // No members.
      *os << "// Marshal the repository ID." << be_nl
          << "return (strm << _tao_aggregate._rep_id ());" << be_uidt_nl;
    }

  *os << "}" << be_nl_2;

  // Set the substate as generating code for the input operator.
  this->ctx_->sub_state(TAO_CodeGen::TAO_CDR_INPUT);

  *os << "::CORBA::Boolean operator>> (" << be_idt << be_idt_nl
      << "TAO_InputCDR &";

  if (node->nmembers () > 0)
    {
      *os << "strm," << be_nl
          << node->name () << " &_tao_aggregate)" << be_uidt
          << be_uidt_nl;
    }
  else
    {
      *os << "," << be_nl
          << node->name () << "&)" << be_uidt
          << be_uidt_nl;
    }

  *os  << "{" << be_idt_nl;

  // WARNING: This method is not symmetric with respect to the
  // encoding function!
  // Exceptions are strange.... the repository ID is retrieved by the
  // caller, and they invoke this method only to demarshal the
  // members.  While the marshaling method encodes both...

  // Do we have any members?
  if (node->nmembers () > 0)
    {
      be_visitor_context new_ctx (*this->ctx_);
      be_visitor_cdr_op_field_decl field_decl (&new_ctx);

      if (field_decl.visit_scope (node) == -1)
        {
          ACE_ERROR_RETURN ((LM_ERROR,
                             ACE_TEXT ("be_visitor_exception_cdr_op_cs::")
                             ACE_TEXT ("visit_exception - ")
                             ACE_TEXT ("codegen for field decl failed\n")),
                            -1);
        }

      // Some members.
      *os << "// Demarshal the members." << be_nl
          << "return (" << be_idt_nl;

      if (this->visit_scope (node) == -1)
        {
          ACE_ERROR_RETURN ((LM_ERROR,
                             ACE_TEXT ("be_visitor_exception_cdr_op_cs::")
                             ACE_TEXT ("visit_exception - ")
                             ACE_TEXT ("codegen for scope failed\n")),
                            -1);
        }

      *os << be_uidt_nl << ");" << be_uidt_nl;
    }
  else
    {
      *os << "return true;" << be_uidt_nl;
    }

  *os << "}" << be_nl;

  if (be_global->gen_ostream_operators ())
    {
      node->gen_ostream_operator (os, false);
    }

  *os << be_global->core_versioning_end () << be_nl;

  node->cli_stub_cdr_op_gen (1);
  return 0;
}
Exemplo n.º 10
0
void GrowWindow::open( ifstream& fp)
{
    int		type;
    int 		end_found = 0;
    char		dummy[40];
    int		tmp;

    for (;;)
    {
        if ( !fp.good()) {
            fp.clear();
            fp.getline( dummy, sizeof(dummy));
            printf( "** Read error GrowWindow: \"%d %s\"\n", type, dummy);
        }

        fp >> type;
        switch( type) {
        case glow_eSave_GrowWindow:
            break;
        case glow_eSave_GrowWindow_file_name:
            fp >> file_name;
            break;
        case glow_eSave_GrowWindow_scrollbar_width:
            fp >> scrollbar_width;
            break;
        case glow_eSave_GrowWindow_scrollbar_color:
            fp >> tmp;
            scrollbar_color = (glow_eDrawType)tmp;
            break;
        case glow_eSave_GrowWindow_scrollbar_bg_color:
            fp >> tmp;
            scrollbar_bg_color = (glow_eDrawType)tmp;
            break;
        case glow_eSave_GrowWindow_vertical_scrollbar:
            fp >> vertical_scrollbar;
            break;
        case glow_eSave_GrowWindow_horizontal_scrollbar:
            fp >> horizontal_scrollbar;
            break;
        case glow_eSave_GrowWindow_window_scale:
            fp >> window_scale;
            break;
        case glow_eSave_GrowWindow_owner:
            fp.get();
            fp.getline( owner, sizeof(owner));
            break;
        case glow_eSave_GrowWindow_rect_part:
            GrowRect::open( fp);
            break;
        case glow_eSave_GrowWindow_userdata_cb:
            if ( ctx->userdata_open_callback)
                (ctx->userdata_open_callback)(&fp, this, glow_eUserdataCbType_Node);
            break;
        case glow_eSave_End:
            end_found = 1;
            break;
        default:
            cout << "GrowWindow:open syntax error" << endl;
            fp.getline( dummy, sizeof(dummy));
        }
        if ( end_found)
            break;
    }

    if ( strcmp( file_name, "") != 0)
        new_ctx();
    configure_scrollbars();
}