diff options
| -rw-r--r-- | irc.h | 7 | ||||
| -rw-r--r-- | otr.c | 4 | ||||
| -rw-r--r-- | storage.c | 29 | 
3 files changed, 40 insertions, 0 deletions
| @@ -239,6 +239,13 @@ typedef struct irc_plugin  	/* Called by bee_irc_user_msg(). Return NULL if you swallowed the  	   message and don't want anything to go to the user. */  	char* (*filter_msg_in)( irc_user_t *iu, char *msg, int flags ); +	 +	/* From storage.c functions. Ideally these should not be used +	   and instead data should be stored in settings which will get +	   saved automatically. Consider these deprecated! */ +	void (*storage_load)( irc_t *irc ); +	void (*storage_save)( irc_t *irc ); +	void (*storage_remove)( const char *nick );  } irc_plugin_t;  extern GSList *irc_plugins; /* struct irc_plugin */ @@ -447,6 +447,9 @@ static const struct irc_plugin otr_plugin =  	otr_irc_free,  	otr_filter_msg_out,  	otr_filter_msg_in, +	otr_load, +	otr_save, +	otr_remove,  };  static void cmd_otr(irc_t *irc, char **args) @@ -1662,6 +1665,7 @@ gboolean keygen_finish_handler(gpointer data, gint fd, b_input_condition cond)  		/* okay, the slave is idle now, so kill him */  		fclose(irc->otr->from);  		fclose(irc->otr->to); +		irc->otr->from = irc->otr->to = NULL;  		kill(irc->otr->keygen, SIGTERM);  		waitpid(irc->otr->keygen, NULL, 0);  		irc->otr->keygen = 0; @@ -114,7 +114,16 @@ storage_status_t storage_load (irc_t * irc, const char *password)  		status = st->load(irc, password);  		if (status == STORAGE_OK) +		{ +			GSList *l; +			for( l = irc_plugins; l; l = l->next ) +			{ +				irc_plugin_t *p = l->data; +				if( p->storage_load ) +					p->storage_load( irc ); +			}  			return status; +		}  		if (status != STORAGE_NO_SUCH_USER)   			return status; @@ -126,6 +135,7 @@ storage_status_t storage_load (irc_t * irc, const char *password)  storage_status_t storage_save (irc_t *irc, char *password, int overwrite)  {  	storage_status_t st; +	GSList *l;  	if (password != NULL) {  		/* Should only use this in the "register" command. */ @@ -139,6 +149,13 @@ storage_status_t storage_save (irc_t *irc, char *password, int overwrite)  	st = ((storage_t *)global.storage->data)->save(irc, overwrite); +	for( l = irc_plugins; l; l = l->next ) +	{ +		irc_plugin_t *p = l->data; +		if( p->storage_save ) +			p->storage_save( irc ); +	} +	  	if (password != NULL) {  		irc_setpass(irc, NULL);  	} @@ -150,6 +167,8 @@ storage_status_t storage_remove (const char *nick, const char *password)  {  	GList *gl;  	storage_status_t ret = STORAGE_OK; +	gboolean ok = FALSE; +	GSList *l;  	/* Remove this account from all storage backends. If this isn't   	 * done, the account will still be usable, it'd just be  @@ -159,10 +178,20 @@ storage_status_t storage_remove (const char *nick, const char *password)  		storage_status_t status;  		status = st->remove(nick, password); +		ok |= status == STORAGE_OK;  		if (status != STORAGE_NO_SUCH_USER && status != STORAGE_OK)  			ret = status;  	} +	/* If at least one succeeded, remove plugin data. */ +	if( ok ) +		for( l = irc_plugins; l; l = l->next ) +		{ +			irc_plugin_t *p = l->data; +			if( p->storage_remove ) +				p->storage_remove( nick ); +		} +	  	return ret;  } | 
