Ticket #492: customized_entry.diff

File customized_entry.diff, 6.2 kB (added by dgollub, 10 months ago)

Initial patch for customizing entries as conflict resolution.

  • opensync/group/opensync_group.h

    old new  
    3535        OSYNC_CONFLICT_RESOLUTION_DUPLICATE, 
    3636        OSYNC_CONFLICT_RESOLUTION_IGNORE, 
    3737        OSYNC_CONFLICT_RESOLUTION_NEWER, 
    38         OSYNC_CONFLICT_RESOLUTION_SELECT 
     38        OSYNC_CONFLICT_RESOLUTION_SELECT, 
     39        OSYNC_CONFLICT_RESOLUTION_CUSTOM 
    3940} OSyncConflictResolution; 
    4041 
    4142OSYNC_EXPORT OSyncGroup *osync_group_new(OSyncError **error); 
  • opensync/engine/opensync_obj_engine.h

    old new  
    5353osync_bool osync_mapping_engine_solve(OSyncMappingEngine *engine, OSyncChange *change, OSyncError **error); 
    5454osync_bool osync_mapping_engine_ignore(OSyncMappingEngine *engine, OSyncError **error); 
    5555osync_bool osync_mapping_engine_use_latest(OSyncMappingEngine *engine, OSyncError **error); 
     56osync_bool osync_mapping_engine_customized(OSyncMappingEngine *engine, OSyncChange *customized_change, OSyncError **error); 
    5657osync_bool osync_mapping_engine_duplicate(OSyncMappingEngine *existingMapping, OSyncError **error); 
    5758 
    5859#endif /*OPENSYNC_OBJ_ENGINE_H_*/ 
  • opensync/engine/opensync_engine.c

    old new  
    389389        return TRUE; 
    390390} 
    391391 
     392osync_bool osync_engine_mapping_customized(OSyncEngine *engine, OSyncMappingEngine *mapping_engine, OSyncData *data, OSyncError **error) 
     393{ 
     394        osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, mapping_engine, error); 
     395         
     396        OSyncEngineCommand *cmd = osync_try_malloc0(sizeof(OSyncEngineCommand), error); 
     397        if (!cmd) { 
     398                osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); 
     399                return FALSE; 
     400        } 
     401 
     402        OSyncChange *customized_change = osync_change_new(error); 
     403        if (!customized_change) { 
     404                osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); 
     405                return FALSE; 
     406        } 
     407 
     408        osync_change_set_data(customized_change, data); 
     409         
     410        cmd->cmd = OSYNC_ENGINE_COMMAND_SOLVE; 
     411        cmd->mapping_engine = mapping_engine; 
     412        /* We recycle the master struct member which prefectly fits our needs as OSyncChange. */ 
     413        cmd->master = customized_change; 
     414        cmd->solve_type = OSYNC_ENGINE_SOLVE_CUSTOM; 
     415         
     416        g_async_queue_push(engine->command_queue, cmd); 
     417         
     418        osync_trace(TRACE_EXIT, "%s", __func__); 
     419        return TRUE; 
     420} 
     421 
    392422/*! @brief This will create a new engine for the given group 
    393423 *  
    394424 * This will create a new engine for the given group 
     
    12141244                                        if (!osync_mapping_engine_use_latest(command->mapping_engine, &engine->error)) 
    12151245                                                goto error; 
    12161246                                        break; 
     1247                                case OSYNC_ENGINE_SOLVE_CUSTOM: 
     1248                                        if (!osync_mapping_engine_customized(command->mapping_engine, command->master, &engine->error)) 
     1249                                                goto error; 
     1250                                        break; 
    12171251                        } 
    12181252                        break; 
    12191253                case OSYNC_ENGINE_COMMAND_DISCOVER: 
  • opensync/engine/opensync_engine_internals.h

    old new  
    2525        OSYNC_ENGINE_SOLVE_DUPLICATE, 
    2626        OSYNC_ENGINE_SOLVE_CHOOSE, 
    2727        OSYNC_ENGINE_SOLVE_IGNORE, 
    28         OSYNC_ENGINE_SOLVE_USE_LATEST 
     28        OSYNC_ENGINE_SOLVE_USE_LATEST, 
     29        OSYNC_ENGINE_SOLVE_CUSTOM 
    2930} OSyncEngineSolveType; 
    3031 
    3132typedef struct OSyncEngineCommand { 
  • opensync/engine/opensync_engine.h

    old new  
    187187osync_bool osync_engine_mapping_duplicate(OSyncEngine *engine, OSyncMappingEngine *mapping_engine, OSyncError **error); 
    188188osync_bool osync_engine_mapping_ignore_conflict(OSyncEngine *engine, OSyncMappingEngine *mapping_engine, OSyncError **error); 
    189189osync_bool osync_engine_mapping_use_latest(OSyncEngine *engine, OSyncMappingEngine *mapping_engine, OSyncError **error); 
     190osync_bool osync_engine_mapping_customized(OSyncEngine *engine, OSyncMappingEngine *mapping_engine, OSyncData *data, OSyncError **error); 
    190191 
    191192#endif /*OPENSYNC_ENGINE_H_*/ 
  • opensync/engine/opensync_obj_engine.c

    old new  
    768768        return FALSE; 
    769769} 
    770770 
     771osync_bool osync_mapping_engine_customized(OSyncMappingEngine *engine, OSyncChange *customized_change, OSyncError **error) 
     772{ 
     773        osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, engine, error); 
     774         
     775        GList *e = engine->entries; 
     776        for (; e; e = e->next) { 
     777                OSyncMappingEntryEngine *existingEntry = e->data; 
     778                OSyncChange *existingChange = osync_entry_engine_get_change(existingEntry); 
     779                OSyncData *customized_data = osync_change_get_data(customized_change); 
     780 
     781                OSyncData *cloned_data = osync_data_clone(customized_data, error); 
     782                if (!cloned_data) 
     783                        goto error; 
     784 
     785                osync_change_set_data(existingChange, cloned_data); 
     786 
     787                osync_entry_engine_set_dirty(existingEntry, TRUE); 
     788 
     789                /* Set the last entry as the master */ 
     790                osync_mapping_engine_set_master(engine, existingEntry); 
     791 
     792        } 
     793         
     794        engine->conflict = FALSE; 
     795        osync_status_update_mapping(engine->parent->parent, engine, OSYNC_MAPPING_EVENT_SOLVED, NULL); 
     796        engine->parent->conflicts = g_list_remove(engine->parent->conflicts, engine); 
     797         
     798        if (osync_engine_check_get_changes(engine->parent->parent) && BitCount(engine->parent->sink_errors | engine->parent->sink_get_changes) == g_list_length(engine->parent->sink_engines)) { 
     799                OSyncError *error = NULL; 
     800                if (!osync_obj_engine_command(engine->parent, OSYNC_ENGINE_COMMAND_WRITE, &error)) 
     801                        goto error; 
     802        } else 
     803                osync_trace(TRACE_INTERNAL, "Not triggering write. didnt receive all reads yet"); 
     804         
     805        osync_trace(TRACE_EXIT, "%s", __func__); 
     806        return TRUE; 
     807 
     808error: 
     809        osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); 
     810        return FALSE; 
     811} 
     812 
    771813static OSyncMappingEngine *_create_mapping_engine(OSyncObjEngine *engine, OSyncError **error) 
    772814{ 
    773815        /* If there is none, create one */