history.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:6k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * history.c: vlc_history_t (web-browser-like back/forward history) handling
  3.  *****************************************************************************
  4.  * Copyright (C) 2004 Commonwealth Scientific and Industrial Research
  5.  *                    Organisation (CSIRO) Australia
  6.  * Copyright (C) 2004 VideoLAN
  7.  *
  8.  * $Id: history.c 7397 2004-04-20 17:27:30Z sam $
  9.  *
  10.  * Authors: Andre Pang <Andre.Pang@csiro.au>
  11.  *
  12.  * This program is free software; you can redistribute it and/or modify
  13.  * it under the terms of the GNU General Public License as published by
  14.  * the Free Software Foundation; either version 2 of the License, or
  15.  * (at your option) any later version.
  16.  *
  17.  * This program is distributed in the hope that it will be useful,
  18.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.  * GNU General Public License for more details.
  21.  *
  22.  * You should have received a copy of the GNU General Public License
  23.  * along with this program; if not, write to the Free Software
  24.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  25.  *****************************************************************************/
  26. #include <vlc/vlc.h>
  27. #include "history.h"
  28. #include "xarray.h"
  29. #ifdef HAVE_STDLIB_H
  30. #   include <stdlib.h>                                          /* realloc() */
  31. #endif
  32. #undef HISTORY_DEBUG
  33. /*****************************************************************************
  34.  * Local prototypes
  35.  *****************************************************************************/
  36. static void history_Dump( history_t *p_history );
  37. /*****************************************************************************
  38.  * Local structure lock
  39.  *****************************************************************************/
  40. /*****************************************************************************
  41.  * Actual history code
  42.  *****************************************************************************/
  43. history_t *history_New()
  44. {
  45.    history_t *p_new_history;
  46.    
  47.    p_new_history = calloc( 1, sizeof( struct history_t ) );
  48.    if( p_new_history == NULL ) return NULL;
  49.    p_new_history->p_xarray = xarray_New( 0 );
  50.    if( p_new_history->p_xarray == NULL )
  51.    {
  52.        free( p_new_history );
  53.        return NULL;
  54.    }
  55. #ifndef HISTORY_DEBUG
  56.    /* make dummy reference to history_Dump to avoid compiler warnings */
  57.    while (0)
  58.    {
  59.        void *p_tmp;
  60.        p_tmp = history_Dump;
  61.    }
  62. #endif
  63.    return p_new_history;
  64. }
  65. vlc_bool_t history_GoBackSavingCurrentItem ( history_t *p_history,
  66.                                              history_item_t *p_item )
  67. {
  68.     history_PruneAndInsert( p_history, p_item );
  69.     /* PruneAndInsert will increment the index, so we need to go
  70.      * back one position to reset the index to the place we were at
  71.      * before saving the current state, and then go back one more to
  72.      * actually go back */
  73.     p_history->i_index -= 2;
  74. #ifdef HISTORY_DEBUG
  75.     history_Dump( p_history );
  76. #endif
  77.     return VLC_TRUE;
  78. }
  79. static void history_Dump( history_t *p_history )
  80. {
  81.     unsigned int i_count;
  82.     int i;
  83.     if( xarray_Count( p_history->p_xarray, &i_count ) != XARRAY_SUCCESS )
  84.         return;
  85.     for (i = 0; i < (int) i_count; i++)
  86.     {
  87.         history_item_t *p_item;
  88.         void *pv_item;
  89.         xarray_ObjectAtIndex( p_history->p_xarray, i, &pv_item );
  90.         
  91.         p_item = (history_item_t *) pv_item;
  92.         if( p_item == NULL )
  93.             fprintf( stderr, "HISTORY: [%d] NULLn", i );
  94.         else
  95.             fprintf( stderr, "HISTORY: [%d] %p (%p->%s)n", i, p_item,
  96.                      p_item->psz_uri, p_item->psz_uri );
  97.     }
  98. }
  99. vlc_bool_t history_GoForwardSavingCurrentItem ( history_t *p_history,
  100.                                                 history_item_t *p_item )
  101. {
  102. #ifdef HISTORY_DEBUG
  103.     history_Dump( p_history );
  104. #endif
  105.     if( xarray_ReplaceObject( p_history->p_xarray, p_history->i_index, p_item )
  106.         == XARRAY_SUCCESS )
  107.     {
  108.         p_history->i_index++;
  109.         return VLC_TRUE;
  110.     }
  111.     else
  112.     {
  113.         return VLC_FALSE;
  114.     }
  115. }
  116. vlc_bool_t history_CanGoBack( history_t *p_history )
  117. {
  118.     if( p_history->i_index > 0 )
  119.         return VLC_TRUE;
  120.     else
  121.         return VLC_FALSE;
  122. }
  123. vlc_bool_t history_CanGoForward( history_t *p_history )
  124. {
  125.     unsigned int i_count;
  126.     if( xarray_Count( p_history->p_xarray, &i_count ) != XARRAY_SUCCESS )
  127.         return VLC_FALSE;
  128.     if( p_history->i_index < i_count )
  129.         return VLC_TRUE;
  130.     else
  131.         return VLC_FALSE;
  132. }
  133. history_item_t *history_Item( history_t *p_history )
  134. {
  135.     history_item_t *p_item;
  136.     void *pv_item;
  137.     if( xarray_ObjectAtIndex( p_history->p_xarray, p_history->i_index,
  138.                               &pv_item )
  139.         == XARRAY_SUCCESS )
  140.     {
  141.         p_item = (history_item_t *) pv_item;
  142.         return p_item;
  143.     }
  144.     else
  145.     {
  146.         return NULL;
  147.     }
  148. }
  149. void history_Prune( history_t *p_history )
  150. {
  151.     xarray_RemoveObjectsAfter( p_history->p_xarray, p_history->i_index );
  152.     xarray_RemoveObject( p_history->p_xarray, p_history->i_index );
  153. }
  154. void history_PruneAndInsert( history_t *p_history, history_item_t *p_item )
  155. {
  156.     unsigned int i_count;
  157.     xarray_Count( p_history->p_xarray, &i_count );
  158.     if( i_count == 0 )
  159.     {
  160.         xarray_InsertObject( p_history->p_xarray, p_item, 0 );
  161.         p_history->i_index = 1;
  162.     }
  163.     else
  164.     {
  165.         history_Prune( p_history );
  166.         xarray_InsertObject( p_history->p_xarray, p_item, p_history->i_index );
  167.         p_history->i_index++;
  168.     }
  169. }
  170. unsigned int history_Count( history_t *p_history )
  171. {
  172.     int i_count;
  173.     xarray_Count( p_history->p_xarray, &i_count );
  174.     return i_count;
  175. }
  176. unsigned int history_Index( history_t *p_history )
  177. {
  178.     return p_history->i_index;
  179. }
  180. history_item_t * historyItem_New( char *psz_name, char *psz_uri )
  181. {
  182.     history_item_t *p_history_item = NULL;
  183.     p_history_item = (history_item_t *) malloc( sizeof(history_item_t) );
  184.     if( !p_history_item ) return NULL;
  185.     p_history_item->psz_uri = strdup( psz_uri );
  186.     p_history_item->psz_name = strdup( psz_name );
  187.     return p_history_item;
  188. }