view src/evdev-plug/ed_bindings_store.c @ 984:df7b09989aee trunk

[svn] - We got a new plugin, captain! - FileWriter is the ultimate plugin for dumping audio to files. It should be the successor of Disk Writer and Out-Lame, as it supports the same output formats as those (WAVE and MP3). The main advantage of having only one file dumping plugin for many formats is that not every plugin has to think about file handling (where to write files to, how to call them etc.) that much anymore. - FileWriter is also very extensible - adding new output formats should be very easy.
author mf0102
date Mon, 30 Apr 2007 14:16:32 -0700
parents 5e46b57d1eda
children 581a057768c2
line wrap: on
line source

/*
*
* Author: Giacomo Lozito <james@develia.org>, (C) 2005-2007
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
*
*/

#include "ed_bindings_store.h"
#include "ed_common.h"
#include <stdlib.h>


/* currently, the bindings store is implemented as a string-based Hash Table;
   however, a change of implementation would only require to re-write the
   public API defined in this source file;
   the rest of the code in EvDev-Plug doesn't care about the
   implementation at all, and access it in a transparent fashion */


gpointer
ed_bindings_store_new ( void )
{
  GHashTable *hashtable = g_hash_table_new_full( g_str_hash , g_str_equal , g_free , NULL );
  return hashtable;
}


/* associate a triplet ev_type:ev_code:ev_value
   (identifying an input event) to an action code in our bindings store;
   bindings store should keep its own copy of ed_inputevent_t objects! */
gint
ed_bindings_store_insert ( gpointer hashtable_gp ,
                           ed_inputevent_t * inputev ,
                           gint action_code )
{
  gchar *input_str;
  input_str = g_strdup_printf( "%i:%i:%i" , inputev->type , inputev->code , inputev->value );
  g_hash_table_insert( (GHashTable*)hashtable_gp , input_str , GINT_TO_POINTER(action_code) );

  DEBUGMSG( "storing code %i -> event: %i:%i:%i\n" ,
    action_code , inputev->type, inputev->code, inputev->value );
  return 0;
}


typedef struct
{
  ed_bindings_store_foreach_func callback;
  gpointer data1;
  gpointer data2;
}
hashfunc_foreach_container_t;

static void
hashfunc_foreach( gpointer key , gpointer value , gpointer container_gp )
{
  hashfunc_foreach_container_t *container = container_gp;
  ed_inputevent_t inputev;
  gchar **toks;

  /* convert key (it's a string in the "type:code:value" form) back to ed_inputevent_t object */
  toks = g_strsplit( (gchar*)key , ":" , 3 );
  inputev.type = atoi( toks[0] );
  inputev.code = atoi( toks[1] );
  inputev.value = atoi( toks[2] );
  g_strfreev( toks );

  container->callback( &inputev , GPOINTER_TO_INT(value) , container->data1 , container->data2 );
  return;
}

gint
ed_bindings_store_foreach ( gpointer hashtable_gp ,
                            ed_bindings_store_foreach_func callback ,
                            gpointer user_data1 ,
                            gpointer user_data2 )
{
  hashfunc_foreach_container_t *container = g_malloc(sizeof(hashfunc_foreach_container_t));
  container->callback = callback;
  container->data1 = user_data1;
  container->data2 = user_data2;
  g_hash_table_foreach( (GHashTable*)hashtable_gp , hashfunc_foreach , container );
  g_free( container );
}


guint
ed_bindings_store_size ( gpointer hashtable_gp )
{
  return g_hash_table_size( (GHashTable*)hashtable_gp );
}


gboolean
ed_bindings_store_lookup( gpointer hashtable_gp ,
                          ed_inputevent_t * inputev ,
                          gint * action_code )
{
  gpointer p;
  gchar *input_str;

  input_str = g_strdup_printf( "%i:%i:%i" , inputev->type , inputev->code , inputev->value );

  if ( g_hash_table_lookup_extended( (GHashTable*)hashtable_gp , input_str , NULL , &p ) == TRUE )
  {
    *action_code = GPOINTER_TO_INT(p);
    g_free( input_str );
    return TRUE;
  }
  else
  {
    g_free( input_str );
    return FALSE;
  }
}


gint
ed_bindings_store_delete ( gpointer hashtable_gp )
{
  if ( hashtable_gp != NULL )
    g_hash_table_destroy( hashtable_gp );
  return 0;
}