You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ko...@apache.org on 2015/09/16 14:18:52 UTC

svn commit: r1703390 - in /subversion/branches/ra_serf-stream-commit/subversion/libsvn_ra_serf: ra_serf.h stream_bucket.c

Author: kotkov
Date: Wed Sep 16 12:18:51 2015
New Revision: 1703390

URL: http://svn.apache.org/r1703390
Log:
On the ra_serf-stream-commit branch: Lay the groundwork for supporting the
the new apply_textdelta_stream() function in the ra_serf's commit editor.

We are going to be taking the svn_txdelta_stream_t, converting it to a
generic svn_stream_t, and sending the contents of this stream as the PUT
request body.  So, introduce a new serf bucket type for the last part.

* subversion/libsvn_ra_serf/stream_bucket.c
  New file with functions that create a bucket wrapping around a generic
  readable svn_stream_t.

* subversion/libsvn_ra_serf/ra_serf.h
  (svn_ra_serf__create_stream_bucket): Declare this new function.

Added:
    subversion/branches/ra_serf-stream-commit/subversion/libsvn_ra_serf/stream_bucket.c   (with props)
Modified:
    subversion/branches/ra_serf-stream-commit/subversion/libsvn_ra_serf/ra_serf.h

Modified: subversion/branches/ra_serf-stream-commit/subversion/libsvn_ra_serf/ra_serf.h
URL: http://svn.apache.org/viewvc/subversion/branches/ra_serf-stream-commit/subversion/libsvn_ra_serf/ra_serf.h?rev=1703390&r1=1703389&r2=1703390&view=diff
==============================================================================
--- subversion/branches/ra_serf-stream-commit/subversion/libsvn_ra_serf/ra_serf.h (original)
+++ subversion/branches/ra_serf-stream-commit/subversion/libsvn_ra_serf/ra_serf.h Wed Sep 16 12:18:51 2015
@@ -1545,6 +1545,10 @@ svn_ra_serf__create_bucket_with_eagain(c
                                        apr_size_t len,
                                        serf_bucket_alloc_t *allocator);
 
+/* Create a bucket that wraps a generic readable STREAM. */
+serf_bucket_t *
+svn_ra_serf__create_stream_bucket(svn_stream_t *stream,
+                                  serf_bucket_alloc_t *allocator);
 
 
 #if defined(SVN_DEBUG)

Added: subversion/branches/ra_serf-stream-commit/subversion/libsvn_ra_serf/stream_bucket.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra_serf-stream-commit/subversion/libsvn_ra_serf/stream_bucket.c?rev=1703390&view=auto
==============================================================================
--- subversion/branches/ra_serf-stream-commit/subversion/libsvn_ra_serf/stream_bucket.c (added)
+++ subversion/branches/ra_serf-stream-commit/subversion/libsvn_ra_serf/stream_bucket.c Wed Sep 16 12:18:51 2015
@@ -0,0 +1,113 @@
+/*
+ * stream_bucket.c :  a serf bucket that wraps svn_stream_t
+ *
+ * ====================================================================
+ *    Licensed to the Apache Software Foundation (ASF) under one
+ *    or more contributor license agreements.  See the NOTICE file
+ *    distributed with this work for additional information
+ *    regarding copyright ownership.  The ASF licenses this file
+ *    to you under the Apache License, Version 2.0 (the
+ *    "License"); you may not use this file except in compliance
+ *    with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing,
+ *    software distributed under the License is distributed on an
+ *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *    KIND, either express or implied.  See the License for the
+ *    specific language governing permissions and limitations
+ *    under the License.
+ * ====================================================================
+ */
+
+#include <serf.h>
+#include <serf_bucket_util.h>
+
+#include "ra_serf.h"
+
+typedef struct stream_bucket_ctx_t
+{
+  svn_stream_t *stream;
+  serf_databuf_t databuf;
+} stream_bucket_ctx_t;
+
+static apr_status_t stream_reader(void *baton, apr_size_t bufsize,
+                                  char *buf, apr_size_t *len)
+{
+  stream_bucket_ctx_t *ctx = baton;
+  svn_error_t *err;
+
+  *len = bufsize;
+
+  err = svn_stream_read_full(ctx->stream, buf, len);
+  if (err)
+    {
+      apr_status_t status = err->apr_err;
+
+      /* ### TODO: Properly handle this error (perhaps, with a callback). */
+      svn_error_clear(err);
+      return status;
+    }
+
+  if (*len == bufsize)
+    return APR_SUCCESS;
+  else
+    return APR_EOF;
+}
+
+static apr_status_t bucket_read(serf_bucket_t *bucket,
+                                apr_size_t requested,
+                                const char **data, apr_size_t *len)
+{
+  stream_bucket_ctx_t *ctx = bucket->data;
+
+  return serf_databuf_read(&ctx->databuf, requested, data, len);
+}
+
+static apr_status_t bucket_readline(serf_bucket_t *bucket,
+                                    int acceptable, int *found,
+                                    const char **data, apr_size_t *len)
+{
+  stream_bucket_ctx_t *ctx = bucket->data;
+
+  return serf_databuf_readline(&ctx->databuf, acceptable, found, data, len);
+}
+
+static apr_status_t bucket_peek(serf_bucket_t *bucket,
+                                const char **data,
+                                apr_size_t *len)
+{
+  stream_bucket_ctx_t *ctx = bucket->data;
+
+  return serf_databuf_peek(&ctx->databuf, data, len);
+}
+
+
+static const serf_bucket_type_t stream_bucket_vtable = {
+    "SVNSTREAM",
+    bucket_read,
+    bucket_readline,
+    serf_default_read_iovec,
+    serf_default_read_for_sendfile,
+    serf_default_read_bucket,
+    bucket_peek,
+    serf_default_destroy_and_data,
+};
+
+
+serf_bucket_t *
+svn_ra_serf__create_stream_bucket(svn_stream_t *stream,
+                                  serf_bucket_alloc_t *allocator)
+{
+  stream_bucket_ctx_t *ctx;
+
+  ctx = serf_bucket_mem_alloc(allocator, sizeof(*ctx));
+  ctx->stream = stream;
+
+  serf_databuf_init(&ctx->databuf);
+  ctx->databuf.read = stream_reader;
+  ctx->databuf.read_baton = ctx;
+
+  return serf_bucket_create(&stream_bucket_vtable, allocator, ctx);
+}

Propchange: subversion/branches/ra_serf-stream-commit/subversion/libsvn_ra_serf/stream_bucket.c
------------------------------------------------------------------------------
    svn:eol-style = native