aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJorge Arellano Cid <jcid@dillo.org>2009-08-12 21:35:12 -0400
committerJorge Arellano Cid <jcid@dillo.org>2009-08-12 21:35:12 -0400
commitbf60d0519e5d53c92109bfad733541117e048639 (patch)
treea339183f7c4f4e8ffa65dcfa038addbb7f0c5fc1 /src
parent7d4e5f603f554204ff2d43f3d33fd9213f043d93 (diff)
Switched capi to use dlib's Dlist instead of a_List_* methods
Diffstat (limited to 'src')
-rw-r--r--src/capi.c80
1 files changed, 36 insertions, 44 deletions
diff --git a/src/capi.c b/src/capi.c
index 5e5eadb2..866117b1 100644
--- a/src/capi.c
+++ b/src/capi.c
@@ -22,7 +22,6 @@
#include "IO/IO.h" /* for IORead &friends */
#include "IO/Url.h"
#include "chain.h"
-#include "list.h"
#include "history.h"
#include "nav.h"
#include "dpiapi.h"
@@ -56,9 +55,8 @@ enum {
* Local data
*/
/* Data list for active dpi connections */
-static capi_conn_t **DpiConn = NULL;
-static int DpiConnSize;
-static int DpiConnMax = 4;
+static Dlist *CapiConns; /* Data list for active connections; it holds
+ * pointers to capi_conn_t structures. */
/*
@@ -75,7 +73,9 @@ void a_Capi_ccc(int Op, int Branch, int Dir, ChainLink *Info,
*/
void a_Capi_init(void)
{
- /* nothing to do for capi yet, just for cache */
+ /* create an empty list */
+ CapiConns = dList_new(32);
+ /* init cache */
a_Cache_init();
}
@@ -108,13 +108,7 @@ static capi_conn_t *
*/
static capi_conn_t *Capi_conn_valid(capi_conn_t *conn)
{
- int i;
-
- for (i = 0; i < DpiConnSize; ++i)
- if (conn == DpiConn[i])
- return conn;
-
- return NULL;
+ return dList_find(CapiConns, conn);
}
/*
@@ -124,9 +118,7 @@ static void Capi_conn_ref(capi_conn_t *conn)
{
if (++conn->Ref == 1) {
/* add the connection data to list */
- a_List_add(DpiConn, DpiConnSize, DpiConnMax);
- DpiConn[DpiConnSize] = conn;
- DpiConnSize++;
+ dList_append(CapiConns, (void *)conn);
}
_MSG(" Capi_conn_ref #%d %p\n", conn->Ref, conn);
}
@@ -136,26 +128,30 @@ static void Capi_conn_ref(capi_conn_t *conn)
*/
static void Capi_conn_unref(capi_conn_t *conn)
{
- int i, j;
-
_MSG(" Capi_conn_unref #%d %p\n", conn->Ref - 1, conn);
+ /* We may validate conn here, but it doesn't *seem* necessary */
if (--conn->Ref == 0) {
- for (i = 0; i < DpiConnSize; ++i) {
- if (DpiConn[i] == conn) {
- /* remove conn preserving the list order */
- for (j = i; j + 1 < DpiConnSize; ++j)
- DpiConn[j] = DpiConn[j + 1];
- --DpiConnSize;
- /* free dynamic memory */
- a_Url_free(conn->url);
- dFree(conn->server);
- dFree(conn->datastr);
- dFree(conn);
- break;
- }
- }
+ /* remove conn preserving the list order */
+ dList_remove(CapiConns, (void *)conn);
+ /* free dynamic memory */
+ a_Url_free(conn->url);
+ dFree(conn->server);
+ dFree(conn->datastr);
+ dFree(conn);
}
+ _MSG(" Capi_conn_unref CapiConns=%d\n", dList_length(CapiConns));
+}
+
+/*
+ * Compare function for searching a conn by server string
+ */
+static int Capi_conn_by_server_cmp(const void *v1, const void *v2)
+{
+ const capi_conn_t *node = v1;
+ const char *server = v2;
+ dReturn_val_if_fail(node && node->server && server, 1);
+ return strcmp(node->server, server);
}
/*
@@ -163,13 +159,7 @@ static void Capi_conn_unref(capi_conn_t *conn)
*/
static capi_conn_t *Capi_conn_find(char *server)
{
- int i;
-
- for (i = 0; i < DpiConnSize; ++i)
- if (strcmp(server, DpiConn[i]->server) == 0)
- return DpiConn[i];
-
- return NULL;
+ return dList_find_custom(CapiConns, (void*)server, Capi_conn_by_server_cmp);
}
/*
@@ -179,10 +169,11 @@ static void Capi_conn_resume(void)
{
int i;
DataBuf *dbuf;
+ capi_conn_t *conn;
- for (i = 0; i < DpiConnSize; ++i) {
- if (DpiConn[i]->Flags & PENDING) {
- capi_conn_t *conn = DpiConn[i];
+ for (i = 0; i < dList_length(CapiConns); ++i) {
+ conn = dList_nth_data (CapiConns, i);
+ if (conn->Flags & PENDING) {
dbuf = a_Chain_dbuf_new(conn->datastr,(int)strlen(conn->datastr), 0);
a_Capi_ccc(OpSend, 1, BCK, conn->InfoSend, dbuf, NULL);
dFree(dbuf);
@@ -197,10 +188,11 @@ static void Capi_conn_resume(void)
void a_Capi_conn_abort_by_url(const DilloUrl *url)
{
int i;
+ capi_conn_t *conn;
- for (i = 0; i < DpiConnSize; ++i) {
- if (a_Url_cmp(DpiConn[i]->url, url) == 0) {
- capi_conn_t *conn = DpiConn[i];
+ for (i = 0; i < dList_length(CapiConns); ++i) {
+ conn = dList_nth_data (CapiConns, i);
+ if (a_Url_cmp(conn->url, url) == 0) {
if (conn->InfoSend) {
a_Capi_ccc(OpAbort, 1, BCK, conn->InfoSend, NULL, NULL);
}