gecko-dev/network/protocol/callback/mkcburl.c

126 строки
3.0 KiB
C

/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "xp.h"
#include "mkgeturl.h"
#include "netcburl.h"
#include "secrng.h" /* For RNG_GenerateGlobalRandomBytes */
typedef struct _NET_CallbackURLData {
int id;
char* match;
NET_CallbackURLFunc func;
void* closure;
struct _NET_CallbackURLData* next;
} NET_CallbackURLData;
static NET_CallbackURLData* First = NULL;
static int Counter = 1;
char*
NET_CallbackURLCreate(NET_CallbackURLFunc func, void* closure) {
unsigned char rand_buf[13];
char* result = NULL;
NET_CallbackURLData* tmp;
NET_CallbackURLFree(func, closure);
tmp = XP_NEW(NET_CallbackURLData);
if (!tmp) return NULL;
tmp->id = Counter++;
RNG_GenerateGlobalRandomBytes((void *) rand_buf, 12);
tmp->match =
PR_smprintf("%02X%02X%02X%02X"
"%02X%02X%02X%02X"
"%02X%02X%02X%02X",
rand_buf[0], rand_buf[1], rand_buf[2], rand_buf[3],
rand_buf[4], rand_buf[5], rand_buf[6], rand_buf[7],
rand_buf[8], rand_buf[9], rand_buf[10], rand_buf[11]);
if (tmp->match) {
result = PR_smprintf("internal-callback-handler:%d/%s",
tmp->id, tmp->match);
}
if (result == NULL) {
if (tmp->match) XP_FREE(tmp->match);
XP_FREE(tmp);
return NULL;
}
tmp->next = First;
First = tmp;
tmp->func = func;
tmp->closure = closure;
return result;
}
int
NET_CallbackURLFree(NET_CallbackURLFunc func, void* closure) {
NET_CallbackURLData** tmp;
NET_CallbackURLData* t;
for (tmp = &First ; *tmp ; tmp = &((*tmp)->next)) {
t = *tmp;
if (t->func == func && t->closure == closure) {
*tmp = t->next;
XP_FREE(t->match);
XP_FREE(t);
return 0;
}
}
return -1;
}
int NET_LoadCallbackURL (ActiveEntry* ce)
{
char* url = ce->URL_s->address;
char* path;
char* match;
int id;
NET_CallbackURLData* tmp;
path = NET_ParseURL(url, GET_PATH_PART);
if (path == NULL) return -1;
id = XP_ATOI(path);
match = XP_STRCHR(path, '/');
if (match) match++;
else match = "";
for (tmp = First ; tmp ; tmp = tmp->next) {
if (id == tmp->id && XP_STRCMP(match, tmp->match) == 0) {
(*tmp->func)(tmp->closure, url);
break;
}
}
XP_FREE(path);
return -1;
}
int NET_ProcessCallbackURL(ActiveEntry* ce)
{
return -1; /* Should never get here */
}
int NET_InterruptCallbackURL(ActiveEntry* ce)
{
return -1; /* Should never get here */
}