Changeset 3455

Show
Ignore:
Timestamp:
07/16/08 18:07:06 (1 month ago)
Author:
dgollub
Message:

Implemeted OSyncPluginAdvancedOption to set advanced plugin
configuration which don't fit in OSyncPluginConfig.

Implemented parsing/assembling of <AdvancedOptions?>.

Added testcases plugin_config_advancedoption and
plugin_config_advancedoption_param.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/opensync/CMakeLists.txt

    r3427 r3455  
    4545   merger/opensync_merger.c 
    4646   module/opensync_module.c 
     47   plugin/opensync_plugin_advancedoptions.c 
    4748   plugin/opensync_plugin_authentication.c 
    4849   plugin/opensync_plugin.c 
  • trunk/opensync/opensync-plugin.h

    r3312 r3455  
    2828#include "plugin/opensync_plugin_info.h" 
    2929#include "plugin/opensync_plugin_config.h" 
     30#include "plugin/opensync_plugin_advancedoptions.h" 
    3031#include "plugin/opensync_plugin_authentication.h" 
    3132#include "plugin/opensync_plugin_connection.h" 
  • trunk/opensync/opensync.h

    r3427 r3455  
    149149typedef struct OSyncPluginConfig OSyncPluginConfig; 
    150150typedef struct OSyncPluginAuthentication OSyncPluginAuthentication; 
     151typedef struct OSyncPluginAdvancedOption OSyncPluginAdvancedOption; 
     152typedef struct OSyncPluginAdvancedOptionParameter OSyncPluginAdvancedOptionParameter; 
    151153typedef struct OSyncPluginConnection OSyncPluginConnection; 
    152154typedef struct OSyncPluginLocalization OSyncPluginLocalization; 
  • trunk/opensync/plugin/opensync_plugin_config.c

    r3406 r3455  
    2525#include "opensync-format.h" 
    2626#include "opensync_plugin_config_internals.h" 
     27#include "opensync_plugin_advancedoptions_internals.h" 
    2728 
    2829#include "opensync_xml.h" 
     30 
     31static OSyncPluginAdvancedOptionParameter *_osync_plugin_config_parse_advancedoption_param(OSyncPluginAdvancedOption *option, xmlNode *cur, OSyncError **error) 
     32{ 
     33        osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, option, cur, error); 
     34 
     35        OSyncPluginAdvancedOptionParameter *param = osync_plugin_advancedoption_param_new(error); 
     36        if (!param) 
     37                goto error; 
     38 
     39        for (; cur != NULL; cur = cur->next) { 
     40 
     41                if (cur->type != XML_ELEMENT_NODE) 
     42                        continue; 
     43 
     44                char *str = (char*)xmlNodeGetContent(cur); 
     45                if (!str) 
     46                        continue; 
     47 
     48                if (!xmlStrcmp(cur->name, BAD_CAST "DisplayName")) 
     49                        osync_plugin_advancedoption_param_set_displayname(param, str); 
     50                else if (!xmlStrcmp(cur->name, BAD_CAST "Name")) 
     51                        osync_plugin_advancedoption_param_set_name(param, str); 
     52                else if (!xmlStrcmp(cur->name, BAD_CAST "Type")) 
     53                        osync_plugin_advancedoption_param_set_type(param,  
     54                                        osync_plugin_advancedoption_type_string_to_val(str)); 
     55                else if (!xmlStrcmp(cur->name, BAD_CAST "ValEnum")) 
     56                        osync_plugin_advancedoption_param_add_valenum(param, str); 
     57 
     58                xmlFree(str); 
     59        } 
     60 
     61        osync_trace(TRACE_EXIT, "%s", __func__); 
     62        return param; 
     63 
     64error: 
     65        osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); 
     66        return NULL; 
     67} 
     68 
     69static OSyncPluginAdvancedOption *_osync_plugin_config_parse_advancedoption(OSyncPluginConfig *config, xmlNode *cur, OSyncError **error) 
     70{ 
     71        osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, config, cur, error); 
     72 
     73        OSyncPluginAdvancedOptionParameter *param; 
     74        OSyncPluginAdvancedOption *option = osync_plugin_advancedoption_new(error); 
     75        if (!option) 
     76                goto error; 
     77 
     78        for (; cur != NULL; cur = cur->next) { 
     79 
     80                if (cur->type != XML_ELEMENT_NODE) 
     81                        continue; 
     82 
     83                char *str = (char*)xmlNodeGetContent(cur); 
     84                if (!str) 
     85                        continue; 
     86 
     87                if (!xmlStrcmp(cur->name, BAD_CAST "DisplayName")) 
     88                        osync_plugin_advancedoption_set_displayname(option, str); 
     89                else if (!xmlStrcmp(cur->name, BAD_CAST "MaxOccurs")) 
     90                        osync_plugin_advancedoption_set_maxoccurs(option, atoi(str)); 
     91                else if (!xmlStrcmp(cur->name, BAD_CAST "MaxSize")) 
     92                        osync_plugin_advancedoption_set_maxsize(option, atoi(str)); 
     93                else if (!xmlStrcmp(cur->name, BAD_CAST "Name")) 
     94                        osync_plugin_advancedoption_set_name(option, str); 
     95                else if (!xmlStrcmp(cur->name, BAD_CAST "Parameter")) { 
     96                        if (!(param = _osync_plugin_config_parse_advancedoption_param(option, cur->xmlChildrenNode, error))) 
     97                                goto error; 
     98 
     99                        option->parameters = osync_list_prepend(option->parameters, param); 
     100 
     101                } else if (!xmlStrcmp(cur->name, BAD_CAST "Type")) { 
     102                        osync_plugin_advancedoption_set_type(option, osync_plugin_advancedoption_type_string_to_val(str)); 
     103                } else if (!xmlStrcmp(cur->name, BAD_CAST "ValEnum")) 
     104                        osync_plugin_advancedoption_add_valenum(option, str); 
     105 
     106                xmlFree(str); 
     107        } 
     108 
     109        option->parameters = osync_list_reverse(option->parameters); 
     110 
     111        osync_trace(TRACE_EXIT, "%s: %p", __func__, option); 
     112        return option; 
     113 
     114error: 
     115        osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); 
     116        return NULL; 
     117} 
     118 
     119static osync_bool _osync_plugin_config_parse_advancedoptions(OSyncPluginConfig *config, xmlNode *cur, OSyncError **error) 
     120{ 
     121        OSyncPluginAdvancedOption *option; 
     122 
     123        for (; cur != NULL; cur = cur->next) { 
     124 
     125                if (cur->type != XML_ELEMENT_NODE) 
     126                        continue; 
     127 
     128                if (!xmlStrcmp(cur->name, (const xmlChar *)"AdvancedOption")) { 
     129                        if (!(option = _osync_plugin_config_parse_advancedoption(config, cur->xmlChildrenNode, error))) 
     130                                goto error; 
     131 
     132                        config->advancedoptions = osync_list_prepend(config->advancedoptions, option); 
     133                } 
     134        } 
     135 
     136        config->advancedoptions = osync_list_reverse(config->advancedoptions); 
     137 
     138        return TRUE; 
     139 
     140error: 
     141        return FALSE;  
     142} 
    29143 
    30144static osync_bool _osync_plugin_config_parse_authentication(OSyncPluginConfig *config, xmlNode *cur, OSyncError **error) 
     
    522636                        continue; 
    523637 
    524                 if (!xmlStrcmp(cur->name, (const xmlChar *)"Authentication")) { 
     638                if (!xmlStrcmp(cur->name, (const xmlChar *)"AdvancedOptions")) { 
     639                        ret = _osync_plugin_config_parse_advancedoptions(config, cur->xmlChildrenNode, error); 
     640                } else if (!xmlStrcmp(cur->name, (const xmlChar *)"Authentication")) { 
    525641                        ret = _osync_plugin_config_parse_authentication(config, cur->xmlChildrenNode, error); 
    526642                } else if (!xmlStrcmp(cur->name, (const xmlChar *)"Connection")) { 
     
    871987} 
    872988 
     989static osync_bool _osync_plugin_config_assemble_advancedoption_param(xmlNode *cur, OSyncPluginAdvancedOptionParameter *param, OSyncError **error) 
     990{ 
     991        osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, cur, param, error); 
     992 
     993        xmlNode *node = xmlNewChild(cur, NULL, (xmlChar*)"Parameter", NULL); 
     994        if (!node) { 
     995                osync_error_set(error, OSYNC_ERROR_GENERIC, "No memory left to assemble configuration."); 
     996                goto error; 
     997        } 
     998 
     999        /* DisplayName */ 
     1000        if (osync_plugin_advancedoption_param_get_displayname(param)) 
     1001                xmlNewChild(node, NULL, BAD_CAST "DisplayName",  
     1002                                BAD_CAST osync_plugin_advancedoption_param_get_displayname(param)); 
     1003 
     1004        /* Name */ 
     1005        if (!osync_plugin_advancedoption_param_get_name(param)) { 
     1006                osync_error_set(error, OSYNC_ERROR_MISCONFIGURATION, "Name for advanced option not set."); 
     1007                goto error; 
     1008        } 
     1009 
     1010        xmlNewChild(node, NULL, BAD_CAST "Name", BAD_CAST osync_plugin_advancedoption_param_get_name(param)); 
     1011 
     1012        /* Type */ 
     1013        if (!osync_plugin_advancedoption_param_get_type(param)) { 
     1014                osync_error_set(error, OSYNC_ERROR_MISCONFIGURATION, "Type for advanced option not set."); 
     1015                goto error; 
     1016        } 
     1017 
     1018        xmlNewChild(node, NULL, BAD_CAST "Type", BAD_CAST osync_plugin_advancedoption_param_get_type_string(param)); 
     1019 
     1020        /* ValEnum */ 
     1021        OSyncList *v; 
     1022        for (v = osync_plugin_advancedoption_param_get_valenums(param); v; v = v->next) { 
     1023                char *valenum = v->data; 
     1024                xmlNewChild(node, NULL, BAD_CAST "ValEnum", BAD_CAST valenum); 
     1025        } 
     1026 
     1027 
     1028        osync_trace(TRACE_EXIT, "%s", __func__); 
     1029        return TRUE; 
     1030error: 
     1031        osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); 
     1032        return FALSE; 
     1033 
     1034} 
     1035 
     1036static osync_bool _osync_plugin_config_assemble_advancedoption(xmlNode *cur, OSyncPluginAdvancedOption *option, OSyncError **error) 
     1037{ 
     1038        osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, cur, option, error); 
     1039 
     1040        OSyncList *o; 
     1041        const char *name, *mime, *objtype, *path, *url; 
     1042 
     1043        xmlNode *next, *node = xmlNewChild(cur, NULL, (xmlChar*)"AdvancedOption", NULL); 
     1044        if (!node) { 
     1045                osync_error_set(error, OSYNC_ERROR_GENERIC, "No memory left to assemble configuration."); 
     1046                goto error; 
     1047        } 
     1048 
     1049        /* DisplayName */ 
     1050        if (osync_plugin_advancedoption_get_displayname(option)) 
     1051                xmlNewChild(node, NULL, BAD_CAST "DisplayName",  
     1052                                BAD_CAST osync_plugin_advancedoption_get_displayname(option)); 
     1053 
     1054        /* MaxOccurs */ 
     1055        if (osync_plugin_advancedoption_get_maxoccurs(option)) { 
     1056                char *str = g_strdup_printf("%u", osync_plugin_advancedoption_get_maxoccurs(option)); 
     1057                xmlNewChild(node, NULL, BAD_CAST "MaxOccurs", BAD_CAST str); 
     1058                g_free(str); 
     1059        } 
     1060 
     1061        /* MaxSize */ 
     1062        if (osync_plugin_advancedoption_get_maxsize(option)) { 
     1063                char *str = g_strdup_printf("%u", osync_plugin_advancedoption_get_maxsize(option)); 
     1064                xmlNewChild(node, NULL, BAD_CAST "MaxSize", BAD_CAST str); 
     1065                g_free(str); 
     1066        } 
     1067 
     1068        /* Name */ 
     1069        if (!osync_plugin_advancedoption_get_name(option)) { 
     1070                osync_error_set(error, OSYNC_ERROR_MISCONFIGURATION, "Name for advanced option not set."); 
     1071                goto error; 
     1072        } 
     1073 
     1074        xmlNewChild(node, NULL, BAD_CAST "Name", BAD_CAST osync_plugin_advancedoption_get_name(option)); 
     1075 
     1076        /* Parameters */ 
     1077        OSyncList *p; 
     1078        for (p = osync_plugin_advancedoption_get_parameters(option); p; p = p->next) { 
     1079                OSyncPluginAdvancedOptionParameter *param = p->data; 
     1080                if (!_osync_plugin_config_assemble_advancedoption_param(node, param, error)) 
     1081                        goto error; 
     1082        } 
     1083 
     1084        /* Type */ 
     1085        if (!osync_plugin_advancedoption_get_type(option)) { 
     1086                osync_error_set(error, OSYNC_ERROR_MISCONFIGURATION, "Type for advanced option not set."); 
     1087                goto error; 
     1088        } 
     1089 
     1090        xmlNewChild(node, NULL, BAD_CAST "Type", BAD_CAST osync_plugin_advancedoption_get_type_string(option)); 
     1091 
     1092        /* ValEnum */ 
     1093        OSyncList *v; 
     1094        for (v = osync_plugin_advancedoption_get_valenums(option); v; v = v->next) { 
     1095                char *valenum = v->data; 
     1096                xmlNewChild(node, NULL, BAD_CAST "ValEnum", BAD_CAST valenum); 
     1097        } 
     1098 
     1099        osync_trace(TRACE_EXIT, "%s", __func__); 
     1100        return TRUE; 
     1101error: 
     1102        osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); 
     1103        return FALSE; 
     1104} 
     1105 
     1106static osync_bool _osync_plugin_config_assemble_advancedoptions(xmlNode *cur, OSyncList *options, OSyncError **error) 
     1107{ 
     1108        osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, cur, options, error); 
     1109 
     1110        OSyncList *o; 
     1111 
     1112        xmlNode *node = xmlNewChild(cur, NULL, (xmlChar*)"AdvancedOptions", NULL); 
     1113        if (!node) { 
     1114                osync_error_set(error, OSYNC_ERROR_GENERIC, "No memory left to assemble configuration."); 
     1115                goto error; 
     1116        } 
     1117 
     1118        for (o = options; o; o = o->next) 
     1119                if (!_osync_plugin_config_assemble_advancedoption(node, o->data, error)) 
     1120                        goto error; 
     1121 
     1122 
     1123        osync_trace(TRACE_EXIT, "%s", __func__); 
     1124        return TRUE; 
     1125error: 
     1126        osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); 
     1127        return FALSE; 
     1128} 
    8731129 
    8741130OSyncPluginConfig *osync_plugin_config_new(OSyncError **error) 
     
    9221178        OSyncPluginLocalization *local; 
    9231179        OSyncList *ressources; 
     1180        OSyncList *options; 
    9241181         
    9251182        doc = xmlNewDoc((xmlChar*)"1.0"); 
     
    9401197 
    9411198        /** Assemble... */ 
     1199        /* Advanced Options */ 
     1200        if ((options = osync_plugin_config_get_advancedoptions(config))) 
     1201                if (!_osync_plugin_config_assemble_advancedoptions(doc->children, options, error)) 
     1202                        goto error_and_free; 
     1203 
    9421204        /* Authentication */ 
    9431205        if ((auth = osync_plugin_config_get_authentication(config))) 
     
    9751237 
    9761238 
     1239/* Advanced Options */ 
     1240OSyncList *osync_plugin_config_get_advancedoptions(OSyncPluginConfig *config) 
     1241{ 
     1242        osync_assert(config); 
     1243        return config->advancedoptions; 
     1244 
     1245} 
     1246 
     1247void osync_plugin_config_add_advancedoption(OSyncPluginConfig *config, OSyncPluginAdvancedOption *option) 
     1248{ 
     1249        osync_assert(config); 
     1250        osync_assert(option); 
     1251 
     1252        if (osync_list_find(config->advancedoptions, option)) 
     1253                        return; 
     1254 
     1255        osync_plugin_advancedoption_ref(option); 
     1256        config->advancedoptions = osync_list_prepend(config->advancedoptions, option); 
     1257} 
     1258 
     1259void osync_plugin_config_remove_advancedoption(OSyncPluginConfig *config, OSyncPluginAdvancedOption *option) 
     1260{ 
     1261        osync_assert(config); 
     1262        osync_assert(option); 
     1263 
     1264        config->advancedoptions = osync_list_remove(config->advancedoptions, option); 
     1265        osync_plugin_advancedoption_unref(option); 
     1266} 
     1267 
     1268/* Authentication */ 
    9771269OSyncPluginAuthentication *osync_plugin_config_get_authentication(OSyncPluginConfig *config) 
    9781270{ 
     
    9901282} 
    9911283 
     1284/* Localization */ 
    9921285OSyncPluginLocalization *osync_plugin_config_get_localization(OSyncPluginConfig *config) 
    9931286{ 
  • trunk/opensync/plugin/opensync_plugin_config.h

    r3406 r3455  
    2929OSYNC_EXPORT osync_bool osync_plugin_config_file_save(OSyncPluginConfig *config, const char *path, OSyncError **error); 
    3030 
     31/* Advanced Options */ 
     32OSYNC_EXPORT OSyncList *osync_plugin_config_get_advancedoptions(OSyncPluginConfig *config); 
     33OSYNC_EXPORT void osync_plugin_config_add_advancedoption(OSyncPluginConfig *config, OSyncPluginAdvancedOption *option); 
     34OSYNC_EXPORT void osync_plugin_config_remove_advancedoption(OSyncPluginConfig *config, OSyncPluginAdvancedOption *option); 
     35 
    3136/* Authentication */ 
    3237OSYNC_EXPORT OSyncPluginAuthentication *osync_plugin_config_get_authentication(OSyncPluginConfig *config); 
  • trunk/opensync/plugin/opensync_plugin_config_internals.h

    r3406 r3455  
    2929 **/ 
    3030struct OSyncPluginConfig { 
     31        /** Advanced Options */ 
     32        OSyncList *advancedoptions; 
    3133        /** Connection configuration */ 
    3234        OSyncPluginConnection *connection; 
  • trunk/tests/plugin-tests/check_plugin_config.c

    r3406 r3455  
    168168} 
    169169END_TEST 
     170 
     171START_TEST (plugin_config_advancedoption) 
     172{ 
     173        char *testbed = setup_testbed(NULL); 
     174 
     175        OSyncError *error = NULL; 
     176        OSyncPluginConfig *config = osync_plugin_config_new(&error); 
     177        fail_unless(error == NULL, NULL); 
     178        fail_unless(config != NULL, NULL); 
     179 
     180        /* Advanced Option */ 
     181        OSyncPluginAdvancedOption *option = osync_plugin_advancedoption_new(&error); 
     182        fail_unless(error == NULL, NULL); 
     183        fail_unless(option != NULL, NULL); 
     184 
     185        osync_plugin_advancedoption_set_maxsize(option, 2323); 
     186        fail_unless(osync_plugin_advancedoption_get_maxsize(option) == 2323, NULL); 
     187 
     188        osync_plugin_advancedoption_set_maxoccurs(option, 3232); 
     189        fail_unless(osync_plugin_advancedoption_get_maxoccurs(option) == 3232, NULL); 
     190 
     191        osync_plugin_advancedoption_set_type(option, OSYNC_PLUGIN_ADVANCEDOPTION_TYPE_BOOL); 
     192        fail_unless(osync_plugin_advancedoption_get_type(option) == OSYNC_PLUGIN_ADVANCEDOPTION_TYPE_BOOL, NULL); 
     193 
     194 
     195        /* Check for uniq number of VALENUMs */ 
     196        osync_plugin_advancedoption_add_valenum(option, "bar"); 
     197        osync_plugin_advancedoption_add_valenum(option, "foo"); 
     198        osync_plugin_advancedoption_add_valenum(option, "foo"); 
     199        osync_plugin_advancedoption_add_valenum(option, "foo"); 
     200 
     201        /* Expected result: 2 - 1x foo, 1x bar */ 
     202        fail_unless(osync_list_length(osync_plugin_advancedoption_get_valenums(option)) == 2, NULL); 
     203 
     204        /* Expected resut: 1 - 1x bar */ 
     205        osync_plugin_advancedoption_remove_valenum(option, "bar"); 
     206        fail_unless(osync_list_length(osync_plugin_advancedoption_get_valenums(option)) == 1, NULL); 
     207 
     208        /*****/ 
     209 
     210        osync_plugin_advancedoption_set_displayname(option, "foo"); 
     211        fail_unless(!strcmp(osync_plugin_advancedoption_get_displayname(option), "foo"), NULL); 
     212 
     213        /* Overwrite (leak check) */ 
     214        osync_plugin_advancedoption_set_displayname(option, "bar"); 
     215        fail_unless(!strcmp(osync_plugin_advancedoption_get_displayname(option), "bar"), NULL); 
     216 
     217        osync_plugin_advancedoption_set_name(option, "foo"); 
     218        fail_unless(!strcmp(osync_plugin_advancedoption_get_name(option), "foo"), NULL); 
     219 
     220        /* Overwrite (leak check) */ 
     221        osync_plugin_advancedoption_set_name(option, "bar"); 
     222        fail_unless(!strcmp(osync_plugin_advancedoption_get_name(option), "bar"), NULL); 
     223 
     224        fail_unless(osync_plugin_advancedoption_ref(option) != NULL, NULL); 
     225        osync_plugin_advancedoption_unref(option); 
     226        osync_plugin_advancedoption_unref(option); 
     227 
     228        osync_plugin_config_unref(config); 
     229 
     230        destroy_testbed(testbed); 
     231} 
     232END_TEST 
     233 
     234START_TEST (plugin_config_advancedoption_param) 
     235{ 
     236        char *testbed = setup_testbed(NULL); 
     237 
     238        OSyncError *error = NULL; 
     239        OSyncPluginConfig *config = osync_plugin_config_new(&error); 
     240        fail_unless(error == NULL, NULL); 
     241        fail_unless(config != NULL, NULL); 
     242 
     243        /* Advanced Option */ 
     244        OSyncPluginAdvancedOptionParameter *param = osync_plugin_advancedoption_param_new(&error); 
     245        fail_unless(error == NULL, NULL); 
     246        fail_unless(param != NULL, NULL); 
     247 
     248        osync_plugin_advancedoption_param_set_type(param, OSYNC_PLUGIN_ADVANCEDOPTION_TYPE_BOOL); 
     249        fail_unless(osync_plugin_advancedoption_param_get_type(param) == OSYNC_PLUGIN_ADVANCEDOPTION_TYPE_BOOL, NULL); 
     250 
     251 
     252        /* Check for uniq number of VALENUMs */ 
     253        osync_plugin_advancedoption_param_add_valenum(param, "bar"); 
     254        osync_plugin_advancedoption_param_add_valenum(param, "foo"); 
     255        osync_plugin_advancedoption_param_add_valenum(param, "foo"); 
     256        osync_plugin_advancedoption_param_add_valenum(param, "foo"); 
     257 
     258        /* Expected result: 2 - 1x foo, 1x bar */ 
     259        fail_unless(osync_list_length(osync_plugin_advancedoption_param_get_valenums(param)) == 2, NULL); 
     260 
     261        /* Expected resut: 1 - 1x bar */ 
     262        osync_plugin_advancedoption_param_remove_valenum(param, "bar"); 
     263        fail_unless(osync_list_length(osync_plugin_advancedoption_param_get_valenums(param)) == 1, NULL); 
     264 
     265        /*****/ 
     266 
     267        osync_plugin_advancedoption_param_set_displayname(param, "foo"); 
     268        fail_unless(!strcmp(osync_plugin_advancedoption_param_get_displayname(param), "foo"), NULL); 
     269 
     270        /* Overwrite (leak check) */ 
     271        osync_plugin_advancedoption_param_set_displayname(param, "bar"); 
     272        fail_unless(!strcmp(osync_plugin_advancedoption_param_get_displayname(param), "bar"), NULL); 
     273 
     274        osync_plugin_advancedoption_param_set_name(param, "foo"); 
     275        fail_unless(!strcmp(osync_plugin_advancedoption_param_get_name(param), "foo"), NULL); 
     276 
     277        /* Overwrite (leak check) */ 
     278        osync_plugin_advancedoption_param_set_name(param, "bar"); 
     279        fail_unless(!strcmp(osync_plugin_advancedoption_param_get_name(param), "bar"), NULL); 
     280 
     281        fail_unless(osync_plugin_advancedoption_param_ref(param) != NULL, NULL); 
     282        osync_plugin_advancedoption_param_unref(param); 
     283        osync_plugin_advancedoption_param_unref(param); 
     284 
     285        osync_plugin_config_unref(config); 
     286 
     287        destroy_testbed(testbed); 
     288} 
     289END_TEST 
     290 
    170291 
    171292START_TEST (plugin_config_authentication) 
     
    511632        fail_unless(config != NULL, NULL); 
    512633 
     634        /* Advanced Options */ 
     635        OSyncPluginAdvancedOption *option = osync_plugin_advancedoption_new(&error); 
     636        fail_unless(error == NULL, NULL); 
     637        fail_unless(option != NULL, NULL); 
     638 
     639        osync_plugin_advancedoption_set_maxsize(option, 1); 
     640        osync_plugin_advancedoption_set_maxoccurs(option, 1); 
     641        osync_plugin_advancedoption_set_displayname(option, "foobar1"); 
     642        osync_plugin_advancedoption_set_name(option, "foobar1"); 
     643        osync_plugin_advancedoption_set_type(option, OSYNC_PLUGIN_ADVANCEDOPTION_TYPE_CHAR); 
     644 
     645        osync_plugin_advancedoption_add_valenum(option, "FOOBAR1"); 
     646        osync_plugin_advancedoption_add_valenum(option, "FOOBAR2"); 
     647        fail_unless(osync_list_length(osync_plugin_advancedoption_get_valenums(option)) == 2, NULL); 
     648 
     649        /* Advanced Parameter */ 
     650        OSyncPluginAdvancedOptionParameter *param = osync_plugin_advancedoption_param_new(&error); 
     651        fail_unless(error == NULL, NULL); 
     652        fail_unless(param != NULL, NULL); 
     653 
     654        osync_plugin_advancedoption_param_set_displayname(param, "bar1"); 
     655        osync_plugin_advancedoption_param_set_name(param, "bar1"); 
     656        osync_plugin_advancedoption_param_set_type(param, OSYNC_PLUGIN_ADVANCEDOPTION_TYPE_INT); 
     657 
     658        osync_plugin_advancedoption_param_add_valenum(param, "BAR1"); 
     659        osync_plugin_advancedoption_param_add_valenum(param, "BAR2"); 
     660        fail_unless(osync_list_length(osync_plugin_advancedoption_param_get_valenums(param)) == 2, NULL); 
     661        osync_plugin_advancedoption_add_parameter(option, param); 
     662 
    513663        /* Localization */ 
    514664        OSyncPluginLocalization *local = osync_plugin_localization_new(&error); 
     
    570720 
    571721        /* Set subcomponents */ 
     722        osync_plugin_config_add_advancedoption(config, option); 
     723        osync_plugin_advancedoption_unref(option); 
    572724        osync_plugin_config_set_authentication(config, auth); 
    573725        osync_plugin_authentication_unref(auth); 
     
    589741        OSyncPluginAuthentication *reloaded_auth = osync_plugin_config_get_authentication(reloaded_config); 
    590742        OSyncList *reloaded_ressources = osync_plugin_config_get_ressources(reloaded_config); 
     743        OSyncList *reloaded_advancedoptions = osync_plugin_config_get_advancedoptions(reloaded_config); 
     744        OSyncList *reloaded_advancedoption_parameters = NULL; 
     745        OSyncList *reloaded_advancedoption_valenums = NULL; 
     746        OSyncList *reloaded_advancedoption_param_valenums = NULL; 
    591747 
    592748        fail_unless(reloaded_local != NULL, NULL); 
    593749        fail_unless(reloaded_auth != NULL, NULL); 
    594750        fail_unless(reloaded_ressources != NULL, NULL); 
     751        fail_unless(reloaded_advancedoptions != NULL, NULL); 
    595752 
    596753        fail_unless(!strcmp(osync_plugin_localization_get_language(reloaded_local), "de_DE"), NULL); 
     
    602759        fail_unless(!strcmp(osync_plugin_authentication_get_reference(reloaded_auth), "ref"), NULL); 
    603760 
    604         OSyncList *r
    605         int i
     761        OSyncList *r, *p, *v
     762        int i, j, k
    606763        for (i = 1, r = reloaded_ressources; r; r = r->next, i++) { 
    607764                char *value = g_strdup_printf("foobar%i", i); 
     
    615772                g_free(value); 
    616773        } 
     774 
     775        for (i = 1, r = reloaded_advancedoptions; r; r = r->next, i++) { 
     776                char *value = g_strdup_printf("foobar%i", i); 
     777                fail_unless(!strcmp(osync_plugin_advancedoption_get_name(r->data), value), NULL); 
     778                fail_unless(!strcmp(osync_plugin_advancedoption_get_displayname(r->data), value), NULL); 
     779                fail_unless(osync_plugin_advancedoption_get_maxsize(r->data) == i, NULL); 
     780                fail_unless(osync_plugin_advancedoption_get_maxoccurs(r->data) == i, NULL); 
     781                fail_unless(osync_plugin_advancedoption_get_type(r->data) == OSYNC_PLUGIN_ADVANCEDOPTION_TYPE_CHAR, NULL); 
     782                g_free(value); 
     783 
     784                reloaded_advancedoption_valenums = osync_plugin_advancedoption_get_valenums(r->data); 
     785                for (j = 1, v = reloaded_advancedoption_valenums; v; v = v->next, j++) { 
     786                        char *value = g_strdup_printf("FOOBAR%i", j); 
     787                        fail_unless(!strcmp(v->data, value), NULL); 
     788                        g_free(value); 
     789                } 
     790 
     791                reloaded_advancedoption_parameters = osync_plugin_advancedoption_get_parameters(r->data); 
     792                for (j = 1, p = reloaded_advancedoption_parameters; p; p = p->next, j++) { 
     793                        char *value = g_strdup_printf("bar%i", j); 
     794                        fail_unless(!strcmp(osync_plugin_advancedoption_param_get_name(p->data), value), NULL); 
     795                        fail_unless(!strcmp(osync_plugin_advancedoption_param_get_displayname(p->data), value), NULL); 
     796                        g_free(value); 
     797 
     798                        reloaded_advancedoption_param_valenums = osync_plugin_advancedoption_param_get_valenums(p->data); 
     799                        for (k = 1, v = reloaded_advancedoption_param_valenums; v; v = v->next, k++) { 
     800                                char *value = g_strdup_printf("BAR%i", k); 
     801                                fail_unless(!strcmp(v->data, value), NULL); 
     802                                g_free(value); 
     803 
     804                        } 
     805 
     806                } 
     807 
     808 
     809        } 
     810 
    617811 
    618812        osync_plugin_config_unref(config); 
     
    8721066        create_case(s, "plugin_config_subcomponents", plugin_config_subcomponents); 
    8731067        create_case(s, "plugin_config_subcomponents_nomemory", plugin_config_subcomponents_nomemory); 
     1068        create_case(s, "plugin_config_advancedoption", plugin_config_advancedoption); 
     1069        create_case(s, "plugin_config_advancedoption_param", plugin_config_advancedoption_param); 
    8741070        create_case(s, "plugin_config_authentication", plugin_config_authentication); 
    8751071        create_case(s, "plugin_config_connection", plugin_config_connection);