1251881Speter/* 2251881Speter * cancel.c: Routines to support cancellation of running subversion functions. 3251881Speter * 4251881Speter * ==================================================================== 5251881Speter * Licensed to the Apache Software Foundation (ASF) under one 6251881Speter * or more contributor license agreements. See the NOTICE file 7251881Speter * distributed with this work for additional information 8251881Speter * regarding copyright ownership. The ASF licenses this file 9251881Speter * to you under the Apache License, Version 2.0 (the 10251881Speter * "License"); you may not use this file except in compliance 11251881Speter * with the License. You may obtain a copy of the License at 12251881Speter * 13251881Speter * http://www.apache.org/licenses/LICENSE-2.0 14251881Speter * 15251881Speter * Unless required by applicable law or agreed to in writing, 16251881Speter * software distributed under the License is distributed on an 17251881Speter * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 18251881Speter * KIND, either express or implied. See the License for the 19251881Speter * specific language governing permissions and limitations 20251881Speter * under the License. 21251881Speter * ==================================================================== 22251881Speter */ 23251881Speter 24251881Speter#include "svn_delta.h" 25251881Speter 26251881Speterstruct edit_baton 27251881Speter{ 28251881Speter const svn_delta_editor_t *wrapped_editor; 29251881Speter void *wrapped_edit_baton; 30251881Speter 31251881Speter svn_cancel_func_t cancel_func; 32251881Speter void *cancel_baton; 33251881Speter}; 34251881Speter 35251881Speterstruct dir_baton 36251881Speter{ 37251881Speter void *edit_baton; 38251881Speter void *wrapped_dir_baton; 39251881Speter}; 40251881Speter 41251881Speterstruct file_baton 42251881Speter{ 43251881Speter void *edit_baton; 44251881Speter void *wrapped_file_baton; 45251881Speter}; 46251881Speter 47251881Speterstatic svn_error_t * 48251881Speterset_target_revision(void *edit_baton, 49251881Speter svn_revnum_t target_revision, 50251881Speter apr_pool_t *pool) 51251881Speter{ 52251881Speter struct edit_baton *eb = edit_baton; 53251881Speter 54251881Speter SVN_ERR(eb->cancel_func(eb->cancel_baton)); 55251881Speter 56251881Speter return eb->wrapped_editor->set_target_revision(eb->wrapped_edit_baton, 57251881Speter target_revision, 58251881Speter pool); 59251881Speter} 60251881Speter 61251881Speterstatic svn_error_t * 62251881Speteropen_root(void *edit_baton, 63251881Speter svn_revnum_t base_revision, 64251881Speter apr_pool_t *pool, 65251881Speter void **root_baton) 66251881Speter{ 67251881Speter struct edit_baton *eb = edit_baton; 68251881Speter struct dir_baton *dir_baton = apr_palloc(pool, sizeof(*dir_baton)); 69251881Speter 70251881Speter SVN_ERR(eb->cancel_func(eb->cancel_baton)); 71251881Speter 72251881Speter SVN_ERR(eb->wrapped_editor->open_root(eb->wrapped_edit_baton, 73251881Speter base_revision, 74251881Speter pool, 75251881Speter &dir_baton->wrapped_dir_baton)); 76251881Speter 77251881Speter dir_baton->edit_baton = edit_baton; 78251881Speter 79251881Speter *root_baton = dir_baton; 80251881Speter 81251881Speter return SVN_NO_ERROR; 82251881Speter} 83251881Speter 84251881Speterstatic svn_error_t * 85251881Speterdelete_entry(const char *path, 86251881Speter svn_revnum_t base_revision, 87251881Speter void *parent_baton, 88251881Speter apr_pool_t *pool) 89251881Speter{ 90251881Speter struct dir_baton *pb = parent_baton; 91251881Speter struct edit_baton *eb = pb->edit_baton; 92251881Speter 93251881Speter SVN_ERR(eb->cancel_func(eb->cancel_baton)); 94251881Speter 95251881Speter return eb->wrapped_editor->delete_entry(path, 96251881Speter base_revision, 97251881Speter pb->wrapped_dir_baton, 98251881Speter pool); 99251881Speter} 100251881Speter 101251881Speterstatic svn_error_t * 102251881Speteradd_directory(const char *path, 103251881Speter void *parent_baton, 104251881Speter const char *copyfrom_path, 105251881Speter svn_revnum_t copyfrom_revision, 106251881Speter apr_pool_t *pool, 107251881Speter void **child_baton) 108251881Speter{ 109251881Speter struct dir_baton *pb = parent_baton; 110251881Speter struct edit_baton *eb = pb->edit_baton; 111251881Speter struct dir_baton *b = apr_palloc(pool, sizeof(*b)); 112251881Speter 113251881Speter SVN_ERR(eb->cancel_func(eb->cancel_baton)); 114251881Speter 115251881Speter SVN_ERR(eb->wrapped_editor->add_directory(path, 116251881Speter pb->wrapped_dir_baton, 117251881Speter copyfrom_path, 118251881Speter copyfrom_revision, 119251881Speter pool, 120251881Speter &b->wrapped_dir_baton)); 121251881Speter 122251881Speter b->edit_baton = eb; 123251881Speter *child_baton = b; 124251881Speter 125251881Speter return SVN_NO_ERROR; 126251881Speter} 127251881Speter 128251881Speterstatic svn_error_t * 129251881Speteropen_directory(const char *path, 130251881Speter void *parent_baton, 131251881Speter svn_revnum_t base_revision, 132251881Speter apr_pool_t *pool, 133251881Speter void **child_baton) 134251881Speter{ 135251881Speter struct dir_baton *pb = parent_baton; 136251881Speter struct edit_baton *eb = pb->edit_baton; 137251881Speter struct dir_baton *db = apr_palloc(pool, sizeof(*db)); 138251881Speter 139251881Speter SVN_ERR(eb->cancel_func(eb->cancel_baton)); 140251881Speter 141251881Speter SVN_ERR(eb->wrapped_editor->open_directory(path, 142251881Speter pb->wrapped_dir_baton, 143251881Speter base_revision, 144251881Speter pool, 145251881Speter &db->wrapped_dir_baton)); 146251881Speter 147251881Speter db->edit_baton = eb; 148251881Speter *child_baton = db; 149251881Speter 150251881Speter return SVN_NO_ERROR; 151251881Speter} 152251881Speter 153251881Speterstatic svn_error_t * 154251881Speteradd_file(const char *path, 155251881Speter void *parent_baton, 156251881Speter const char *copyfrom_path, 157251881Speter svn_revnum_t copyfrom_revision, 158251881Speter apr_pool_t *pool, 159251881Speter void **file_baton) 160251881Speter{ 161251881Speter struct dir_baton *pb = parent_baton; 162251881Speter struct edit_baton *eb = pb->edit_baton; 163251881Speter struct file_baton *fb = apr_palloc(pool, sizeof(*fb)); 164251881Speter 165251881Speter SVN_ERR(eb->cancel_func(eb->cancel_baton)); 166251881Speter 167251881Speter SVN_ERR(eb->wrapped_editor->add_file(path, 168251881Speter pb->wrapped_dir_baton, 169251881Speter copyfrom_path, 170251881Speter copyfrom_revision, 171251881Speter pool, 172251881Speter &fb->wrapped_file_baton)); 173251881Speter 174251881Speter fb->edit_baton = eb; 175251881Speter *file_baton = fb; 176251881Speter 177251881Speter return SVN_NO_ERROR; 178251881Speter} 179251881Speter 180251881Speterstatic svn_error_t * 181251881Speteropen_file(const char *path, 182251881Speter void *parent_baton, 183251881Speter svn_revnum_t base_revision, 184251881Speter apr_pool_t *pool, 185251881Speter void **file_baton) 186251881Speter{ 187251881Speter struct dir_baton *pb = parent_baton; 188251881Speter struct edit_baton *eb = pb->edit_baton; 189251881Speter struct file_baton *fb = apr_palloc(pool, sizeof(*fb)); 190251881Speter 191251881Speter SVN_ERR(eb->cancel_func(eb->cancel_baton)); 192251881Speter 193251881Speter SVN_ERR(eb->wrapped_editor->open_file(path, 194251881Speter pb->wrapped_dir_baton, 195251881Speter base_revision, 196251881Speter pool, 197251881Speter &fb->wrapped_file_baton)); 198251881Speter 199251881Speter fb->edit_baton = eb; 200251881Speter *file_baton = fb; 201251881Speter 202251881Speter return SVN_NO_ERROR; 203251881Speter} 204251881Speter 205251881Speterstatic svn_error_t * 206251881Speterapply_textdelta(void *file_baton, 207251881Speter const char *base_checksum, 208251881Speter apr_pool_t *pool, 209251881Speter svn_txdelta_window_handler_t *handler, 210251881Speter void **handler_baton) 211251881Speter{ 212251881Speter struct file_baton *fb = file_baton; 213251881Speter struct edit_baton *eb = fb->edit_baton; 214251881Speter 215251881Speter SVN_ERR(eb->cancel_func(eb->cancel_baton)); 216251881Speter 217251881Speter return eb->wrapped_editor->apply_textdelta(fb->wrapped_file_baton, 218251881Speter base_checksum, 219251881Speter pool, 220251881Speter handler, 221251881Speter handler_baton); 222251881Speter} 223251881Speter 224251881Speterstatic svn_error_t * 225251881Speterclose_file(void *file_baton, 226251881Speter const char *text_checksum, 227251881Speter apr_pool_t *pool) 228251881Speter{ 229251881Speter struct file_baton *fb = file_baton; 230251881Speter struct edit_baton *eb = fb->edit_baton; 231251881Speter 232251881Speter SVN_ERR(eb->cancel_func(eb->cancel_baton)); 233251881Speter 234251881Speter return eb->wrapped_editor->close_file(fb->wrapped_file_baton, 235251881Speter text_checksum, pool); 236251881Speter} 237251881Speter 238251881Speterstatic svn_error_t * 239251881Speterabsent_file(const char *path, 240251881Speter void *file_baton, 241251881Speter apr_pool_t *pool) 242251881Speter{ 243251881Speter struct file_baton *fb = file_baton; 244251881Speter struct edit_baton *eb = fb->edit_baton; 245251881Speter 246251881Speter SVN_ERR(eb->cancel_func(eb->cancel_baton)); 247251881Speter 248251881Speter return eb->wrapped_editor->absent_file(path, fb->wrapped_file_baton, 249251881Speter pool); 250251881Speter} 251251881Speter 252251881Speterstatic svn_error_t * 253251881Speterclose_directory(void *dir_baton, 254251881Speter apr_pool_t *pool) 255251881Speter{ 256251881Speter struct dir_baton *db = dir_baton; 257251881Speter struct edit_baton *eb = db->edit_baton; 258251881Speter 259251881Speter SVN_ERR(eb->cancel_func(eb->cancel_baton)); 260251881Speter 261251881Speter return eb->wrapped_editor->close_directory(db->wrapped_dir_baton, pool); 262251881Speter} 263251881Speter 264251881Speterstatic svn_error_t * 265251881Speterabsent_directory(const char *path, 266251881Speter void *dir_baton, 267251881Speter apr_pool_t *pool) 268251881Speter{ 269251881Speter struct dir_baton *db = dir_baton; 270251881Speter struct edit_baton *eb = db->edit_baton; 271251881Speter 272251881Speter SVN_ERR(eb->cancel_func(eb->cancel_baton)); 273251881Speter 274251881Speter return eb->wrapped_editor->absent_directory(path, db->wrapped_dir_baton, 275251881Speter pool); 276251881Speter} 277251881Speter 278251881Speterstatic svn_error_t * 279251881Speterchange_file_prop(void *file_baton, 280251881Speter const char *name, 281251881Speter const svn_string_t *value, 282251881Speter apr_pool_t *pool) 283251881Speter{ 284251881Speter struct file_baton *fb = file_baton; 285251881Speter struct edit_baton *eb = fb->edit_baton; 286251881Speter 287251881Speter SVN_ERR(eb->cancel_func(eb->cancel_baton)); 288251881Speter 289251881Speter return eb->wrapped_editor->change_file_prop(fb->wrapped_file_baton, 290251881Speter name, value, pool); 291251881Speter} 292251881Speter 293251881Speterstatic svn_error_t * 294251881Speterchange_dir_prop(void *dir_baton, 295251881Speter const char *name, 296251881Speter const svn_string_t *value, 297251881Speter apr_pool_t *pool) 298251881Speter{ 299251881Speter struct dir_baton *db = dir_baton; 300251881Speter struct edit_baton *eb = db->edit_baton; 301251881Speter 302251881Speter SVN_ERR(eb->cancel_func(eb->cancel_baton)); 303251881Speter 304251881Speter return eb->wrapped_editor->change_dir_prop(db->wrapped_dir_baton, 305251881Speter name, 306251881Speter value, 307251881Speter pool); 308251881Speter} 309251881Speter 310251881Speterstatic svn_error_t * 311251881Speterclose_edit(void *edit_baton, 312251881Speter apr_pool_t *pool) 313251881Speter{ 314251881Speter struct edit_baton *eb = edit_baton; 315251881Speter 316251881Speter SVN_ERR(eb->cancel_func(eb->cancel_baton)); 317251881Speter 318251881Speter return eb->wrapped_editor->close_edit(eb->wrapped_edit_baton, pool); 319251881Speter} 320251881Speter 321251881Speterstatic svn_error_t * 322251881Speterabort_edit(void *edit_baton, 323251881Speter apr_pool_t *pool) 324251881Speter{ 325251881Speter struct edit_baton *eb = edit_baton; 326251881Speter 327251881Speter SVN_ERR(eb->cancel_func(eb->cancel_baton)); 328251881Speter 329251881Speter return eb->wrapped_editor->abort_edit(eb->wrapped_edit_baton, pool); 330251881Speter} 331251881Speter 332251881Spetersvn_error_t * 333251881Spetersvn_delta_get_cancellation_editor(svn_cancel_func_t cancel_func, 334251881Speter void *cancel_baton, 335251881Speter const svn_delta_editor_t *wrapped_editor, 336251881Speter void *wrapped_edit_baton, 337251881Speter const svn_delta_editor_t **editor, 338251881Speter void **edit_baton, 339251881Speter apr_pool_t *pool) 340251881Speter{ 341251881Speter if (cancel_func) 342251881Speter { 343251881Speter svn_delta_editor_t *tree_editor = svn_delta_default_editor(pool); 344251881Speter struct edit_baton *eb = apr_palloc(pool, sizeof(*eb)); 345251881Speter 346251881Speter tree_editor->set_target_revision = set_target_revision; 347251881Speter tree_editor->open_root = open_root; 348251881Speter tree_editor->delete_entry = delete_entry; 349251881Speter tree_editor->add_directory = add_directory; 350251881Speter tree_editor->open_directory = open_directory; 351251881Speter tree_editor->change_dir_prop = change_dir_prop; 352251881Speter tree_editor->close_directory = close_directory; 353251881Speter tree_editor->absent_directory = absent_directory; 354251881Speter tree_editor->add_file = add_file; 355251881Speter tree_editor->open_file = open_file; 356251881Speter tree_editor->apply_textdelta = apply_textdelta; 357251881Speter tree_editor->change_file_prop = change_file_prop; 358251881Speter tree_editor->close_file = close_file; 359251881Speter tree_editor->absent_file = absent_file; 360251881Speter tree_editor->close_edit = close_edit; 361251881Speter tree_editor->abort_edit = abort_edit; 362251881Speter 363251881Speter eb->wrapped_editor = wrapped_editor; 364251881Speter eb->wrapped_edit_baton = wrapped_edit_baton; 365251881Speter eb->cancel_func = cancel_func; 366251881Speter eb->cancel_baton = cancel_baton; 367251881Speter 368251881Speter *editor = tree_editor; 369251881Speter *edit_baton = eb; 370251881Speter } 371251881Speter else 372251881Speter { 373251881Speter *editor = wrapped_editor; 374251881Speter *edit_baton = wrapped_edit_baton; 375251881Speter } 376251881Speter 377251881Speter return SVN_NO_ERROR; 378251881Speter} 379