162 lines
3.3 KiB
C++
162 lines
3.3 KiB
C++
/*
|
|
* File: history.c
|
|
*
|
|
* Copyright (C) 2001-2007 Jorge Arellano Cid <jcid@dillo.org>
|
|
*
|
|
* 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 3 of the License, or
|
|
* (at your option) any later version.
|
|
*/
|
|
|
|
/** @file
|
|
* Linear history (it also provides indexes for the navigation stack)
|
|
*/
|
|
|
|
#include "msg.hh"
|
|
#include "list.h"
|
|
#include "history.hh"
|
|
|
|
|
|
typedef struct {
|
|
DilloUrl *url;
|
|
char *title;
|
|
} H_Item;
|
|
|
|
|
|
/* Global history list */
|
|
static H_Item *history = NULL;
|
|
static int history_size = 0; /* [1 based] */
|
|
static int history_size_max = 16;
|
|
|
|
|
|
/**
|
|
* Debug procedure.
|
|
*/
|
|
void History_show(void)
|
|
{
|
|
int i;
|
|
|
|
MSG(" {");
|
|
for (i = 0; i < history_size; ++i)
|
|
MSG(" %s", URL_STR(history[i].url));
|
|
MSG(" }\n");
|
|
}
|
|
|
|
/**
|
|
* Add a new H_Item at the end of the history list
|
|
* (taking care of not making a duplicate entry)
|
|
*/
|
|
int a_History_add_url(DilloUrl *url)
|
|
{
|
|
int i, idx;
|
|
|
|
_MSG("a_History_add_url: '%s' ", URL_STR(url));
|
|
for (i = 0; i < history_size; ++i)
|
|
if (!a_Url_cmp(history[i].url, url) &&
|
|
!strcmp(URL_FRAGMENT(history[i].url), URL_FRAGMENT(url)))
|
|
break;
|
|
|
|
if (i < history_size) {
|
|
idx = i;
|
|
_MSG("FOUND at idx=%d\n", idx);
|
|
} else {
|
|
idx = history_size;
|
|
a_List_add(history, history_size, history_size_max, H_Item);
|
|
history[idx].url = a_Url_dup(url).release();
|
|
history[idx].title = NULL;
|
|
++history_size;
|
|
_MSG("ADDED at idx=%d\n", idx);
|
|
}
|
|
|
|
/* History_show(); */
|
|
|
|
return idx;
|
|
}
|
|
|
|
/**
|
|
* Return the DilloUrl field (by index)
|
|
*/
|
|
const DilloUrl *a_History_get_url(int idx)
|
|
{
|
|
_MSG("a_History_get_url: ");
|
|
/* History_show(); */
|
|
|
|
dReturn_val_if_fail(idx >= 0 && idx < history_size, NULL);
|
|
|
|
return history[idx].url;
|
|
}
|
|
|
|
/**
|
|
* Return the title field (by index)
|
|
* ('force' returns URL_STR when there's no title)
|
|
*/
|
|
const char *a_History_get_title(int idx, int force)
|
|
{
|
|
dReturn_val_if_fail(idx >= 0 && idx < history_size, NULL);
|
|
|
|
if (history[idx].title)
|
|
return history[idx].title;
|
|
else if (force)
|
|
return URL_STR(history[idx].url);
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
/**
|
|
* Return the title field (by url)
|
|
* ('force' returns URL_STR when there's no title)
|
|
*/
|
|
const char *a_History_get_title_by_url(const DilloUrl *url, int force)
|
|
{
|
|
int i;
|
|
|
|
dReturn_val_if_fail(url != NULL, NULL);
|
|
|
|
for (i = 0; i < history_size; ++i)
|
|
if (a_Url_cmp(url, history[i].url) == 0)
|
|
break;
|
|
|
|
if (i < history_size && history[i].title)
|
|
return history[i].title;
|
|
else if (force)
|
|
return URL_STR_(url);
|
|
return NULL;
|
|
}
|
|
|
|
/**
|
|
* Set the page-title for a given URL
|
|
*/
|
|
void a_History_set_title_by_url(const DilloUrl *url, const char *title)
|
|
{
|
|
int i;
|
|
|
|
dReturn_if (url == NULL);
|
|
|
|
for (i = history_size - 1; i >= 0; --i)
|
|
if (a_Url_cmp(url, history[i].url) == 0)
|
|
break;
|
|
|
|
if (i >= 0) {
|
|
dFree(history[i].title);
|
|
history[i].title = dStrdup(title);
|
|
} else {
|
|
MSG_ERR("a_History_set_title_by_url: %s not found\n", URL_STR(url));
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Free all the memory used by this module
|
|
*/
|
|
void a_History_freeall(void)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < history_size; ++i) {
|
|
delete history[i].url;
|
|
dFree(history[i].title);
|
|
}
|
|
dFree(history);
|
|
}
|