Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • storage_xml.c

    r15d1469 rb84800d  
    5454        char *current_setting;
    5555        account_t *current_account;
     56        struct chat *current_chat;
     57        set_t **current_set_head;
    5658        char *given_nick;
    5759        char *given_pass;
     
    172174               
    173175                if( ( setting = xml_attr( attr_names, attr_values, "name" ) ) )
     176                {
     177                        if( xd->current_chat != NULL )
     178                                xd->current_set_head = &xd->current_chat->set;
     179                        else if( xd->current_account != NULL )
     180                                xd->current_set_head = &xd->current_account->set;
     181                        else
     182                                xd->current_set_head = &xd->irc->set;
     183                       
    174184                        xd->current_setting = g_strdup( setting );
     185                }
    175186                else
    176187                        g_set_error( error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
     
    194205                }
    195206        }
     207        else if( g_strcasecmp( element_name, "chat" ) == 0 )
     208        {
     209                char *handle, *channel;
     210               
     211                handle = xml_attr( attr_names, attr_values, "handle" );
     212                channel = xml_attr( attr_names, attr_values, "channel" );
     213               
     214                if( xd->current_account && handle && channel )
     215                {
     216                        xd->current_chat = chat_add( xd->irc, xd->current_account, handle, channel );
     217                }
     218                else
     219                {
     220                        g_set_error( error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
     221                                     "Missing attributes for %s element", element_name );
     222                }
     223        }
    196224        else
    197225        {
     
    214242                xd->current_account = NULL;
    215243        }
     244        else if( g_strcasecmp( element_name, "chat" ) == 0 )
     245        {
     246                xd->current_chat = NULL;
     247        }
    216248}
    217249
     
    220252        char text[text_len+1];
    221253        struct xml_parsedata *xd = data;
    222         irc_t *irc = xd->irc;
    223254       
    224255        strncpy( text, text_orig, text_len );
     
    233264        else if( g_strcasecmp( g_markup_parse_context_get_element( ctx ), "setting" ) == 0 && xd->current_setting )
    234265        {
    235                 set_setstr( xd->current_account ? &xd->current_account->set : &irc->set,
    236                             xd->current_setting, (char*) text );
     266                set_setstr( xd->current_set_head, xd->current_setting, (char*) text );
    237267                g_free( xd->current_setting );
    238268                xd->current_setting = NULL;
     
    258288}
    259289
    260 static storage_status_t xml_load_real( irc_t *irc, const char *my_nick, const char *password, xml_pass_st action )
     290static storage_status_t xml_load_real( const char *my_nick, const char *password, irc_t *irc, xml_pass_st action )
    261291{
    262292        GMarkupParseContext *ctx;
     
    265295        GError *gerr = NULL;
    266296        int fd, st;
     297       
     298        if( irc && irc->status & USTATUS_IDENTIFIED )
     299                return( 1 );
    267300       
    268301        xd = g_new0( struct xml_parsedata, 1 );
     
    317350                return STORAGE_OK;
    318351       
     352        irc->status |= USTATUS_IDENTIFIED;
     353       
    319354        return STORAGE_OK;
    320355}
    321356
    322 static storage_status_t xml_load( irc_t *irc, const char *password )
    323 {
    324         return xml_load_real( irc, irc->nick, password, XML_PASS_UNKNOWN );
     357static storage_status_t xml_load( const char *my_nick, const char *password, irc_t *irc )
     358{
     359        return xml_load_real( my_nick, password, irc, XML_PASS_UNKNOWN );
    325360}
    326361
     
    329364        /* This is a little bit risky because we have to pass NULL for the
    330365           irc_t argument. This *should* be fine, if I didn't miss anything... */
    331         return xml_load_real( NULL, my_nick, password, XML_PASS_CHECK_ONLY );
     366        return xml_load_real( my_nick, password, NULL, XML_PASS_CHECK_ONLY );
    332367}
    333368
     
    364399        md5_byte_t pass_md5[21];
    365400        md5_state_t md5_state;
     401       
     402        if( irc->password == NULL )
     403        {
     404                irc_usermsg( irc, "Please register yourself if you want to save your settings." );
     405                return STORAGE_OTHER_ERROR;
     406        }
    366407       
    367408        path2 = g_strdup( irc->nick );
     
    397438       
    398439        for( set = irc->set; set; set = set->next )
    399                 if( set->value && set->def )
     440                if( set->value )
    400441                        if( !xml_printf( fd, 1, "<setting name=\"%s\">%s</setting>\n", set->key, set->value ) )
    401442                                goto write_error;
     
    406447                char *pass_b64;
    407448                int pass_len;
     449                struct chat *c;
    408450               
    409451                pass_len = arc_encode( acc->pass, strlen( acc->pass ), (unsigned char**) &pass_cr, irc->password, 12 );
     
    424466               
    425467                for( set = acc->set; set; set = set->next )
    426                         if( set->value && set->def && !( set->flags & ACC_SET_NOSAVE ) )
     468                        if( set->value && !( set->flags & ACC_SET_NOSAVE ) )
    427469                                if( !xml_printf( fd, 2, "<setting name=\"%s\">%s</setting>\n", set->key, set->value ) )
    428470                                        goto write_error;
     
    438480                        goto write_error;
    439481               
     482                for( c = irc->chatrooms; c; c = c->next )
     483                {
     484                        if( c->acc != acc )
     485                                continue;
     486                       
     487                        if( !xml_printf( fd, 2, "<chat handle=\"%s\" channel=\"%s\" type=\"%s\">\n",
     488                                                c->handle, c->channel, "room" ) )
     489                                goto write_error;
     490                       
     491                        for( set = c->set; set; set = set->next )
     492                                if( set->value && !( set->flags & ACC_SET_NOSAVE ) )
     493                                        if( !xml_printf( fd, 3, "<setting name=\"%s\">%s</setting>\n",
     494                                                                set->key, set->value ) )
     495                                                goto write_error;
     496
     497                        if( !xml_printf( fd, 2, "</chat>\n" ) )
     498                                goto write_error;
     499                }
     500               
    440501                if( !xml_printf( fd, 1, "</account>\n" ) )
    441502                        goto write_error;
Note: See TracChangeset for help on using the changeset viewer.