summaryrefslogtreecommitdiff
path: root/subversion/bindings/javahl/native/StateReporter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'subversion/bindings/javahl/native/StateReporter.cpp')
-rw-r--r--subversion/bindings/javahl/native/StateReporter.cpp191
1 files changed, 191 insertions, 0 deletions
diff --git a/subversion/bindings/javahl/native/StateReporter.cpp b/subversion/bindings/javahl/native/StateReporter.cpp
new file mode 100644
index 0000000..a0c05ed
--- /dev/null
+++ b/subversion/bindings/javahl/native/StateReporter.cpp
@@ -0,0 +1,191 @@
+/**
+ * @copyright
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ * @endcopyright
+ *
+ * @file StateReporter.cpp
+ * @brief Implementation of the class StateReporter
+ */
+
+#include <jni.h>
+
+#include "JNIUtil.h"
+#include "JNIStringHolder.h"
+#include "StateReporter.h"
+#include "EnumMapper.h"
+#include "Path.h"
+
+#include "svn_private_config.h"
+
+StateReporter::StateReporter()
+ : m_valid(false),
+ m_raw_reporter(NULL),
+ m_report_baton(NULL),
+ m_editor(NULL),
+ m_target_revision(SVN_INVALID_REVNUM)
+{}
+
+StateReporter::~StateReporter()
+{
+ delete m_editor;
+}
+
+StateReporter*
+StateReporter::getCppObject(jobject jthis)
+{
+ static jfieldID fid = 0;
+ jlong cppAddr = SVNBase::findCppAddrForJObject(jthis, &fid,
+ JAVAHL_CLASS("/remote/StateReporter"));
+ return (cppAddr == 0 ? NULL : reinterpret_cast<StateReporter*>(cppAddr));
+}
+
+void
+StateReporter::dispose(jobject jthis)
+{
+ //DEBUG:fprintf(stderr, " (n) StateReporter::dispose()\n");
+
+ if (m_valid)
+ abortReport();
+
+ static jfieldID fid = 0;
+ SVNBase::dispose(jthis, &fid, JAVAHL_CLASS("/remote/StateReporter"));
+}
+
+namespace {
+void throw_reporter_inactive()
+{
+ JNIUtil::raiseThrowable("java/lang/IllegalStateException",
+ _("The reporter is not active"));
+}
+} // anonymous namespace
+
+void
+StateReporter::setPath(jstring jpath, jlong jrevision, jobject jdepth,
+ jboolean jstart_empty, jstring jlock_token)
+{
+ //DEBUG:fprintf(stderr, " (n) StateReporter::setPath()\n");
+
+ if (!m_valid) { throw_reporter_inactive(); return; }
+
+ JNIStringHolder lock_token(jlock_token);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ SVN::Pool subPool(pool);
+ Relpath path(jpath, subPool);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ svn_depth_t depth = EnumMapper::toDepth(jdepth);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ SVN_JNI_ERR(m_raw_reporter->set_path(m_report_baton, path.c_str(),
+ svn_revnum_t(jrevision), depth,
+ bool(jstart_empty), lock_token.c_str(),
+ subPool.getPool()),);
+}
+
+void
+StateReporter::deletePath(jstring jpath)
+{
+ //DEBUG:fprintf(stderr, " (n) StateReporter::deletePath()\n");
+
+ if (!m_valid) { throw_reporter_inactive(); return; }
+
+ SVN::Pool subPool(pool);
+ Relpath path(jpath, subPool);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ SVN_JNI_ERR(m_raw_reporter->delete_path(m_report_baton, path.c_str(),
+ subPool.getPool()),);
+}
+
+void
+StateReporter::linkPath(jstring jurl, jstring jpath,
+ jlong jrevision, jobject jdepth,
+ jboolean jstart_empty, jstring jlock_token)
+{
+ //DEBUG:fprintf(stderr, " (n) StateReporter::linkPath()\n");
+
+ if (!m_valid) { throw_reporter_inactive(); return; }
+
+ JNIStringHolder lock_token(jlock_token);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ SVN::Pool subPool(pool);
+ Relpath path(jpath, subPool);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ URL url(jurl, subPool);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ svn_depth_t depth = EnumMapper::toDepth(jdepth);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ SVN_JNI_ERR(m_raw_reporter->link_path(m_report_baton, path.c_str(),
+ url.c_str(), svn_revnum_t(jrevision),
+ depth, bool(jstart_empty),
+ lock_token.c_str(),
+ subPool.getPool()),);
+}
+
+jlong
+StateReporter::finishReport()
+{
+ //DEBUG:fprintf(stderr, " (n) StateReporter::finishReport()\n");
+
+ if (!m_valid) { throw_reporter_inactive(); return SVN_INVALID_REVNUM; }
+
+ SVN::Pool subPool(pool);
+ SVN_JNI_ERR(m_raw_reporter->finish_report(m_report_baton,
+ subPool.getPool()),
+ SVN_INVALID_REVNUM);
+ m_valid = false;
+ return jlong(m_target_revision);
+}
+
+void
+StateReporter::abortReport()
+{
+ //DEBUG:fprintf(stderr, " (n) StateReporter::abortReport()\n");
+
+ if (!m_valid) { throw_reporter_inactive(); return; }
+
+ SVN::Pool subPool(pool);
+ SVN_JNI_ERR(m_raw_reporter->abort_report(m_report_baton,
+ subPool.getPool()),);
+ m_valid = false;
+}
+
+void
+StateReporter::set_reporter_data(const svn_ra_reporter3_t* raw_reporter,
+ void* report_baton,
+ EditorProxy* editor)
+{
+ //DEBUG:fprintf(stderr, " (n) StateReporter::set_reporter_data()\n");
+
+ m_editor = editor;
+ m_raw_reporter = raw_reporter;
+ m_report_baton = report_baton;
+ m_valid = true;
+}