dmose%mozilla.org 0efb7c174c updated xPL license boilerplate to v1.1, a=chofmann@netscape.com,r=endico@mozilla.org
git-svn-id: svn://10.0.0.236/trunk@52910 18797224-902f-48f8-a5cc-f745e15eee43
1999-11-06 03:43:54 +00:00

312 lines
5.8 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.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
/*
* wfMime.cpp (wfMimeList.cpp)
*
* Implements a list of mime types
*
* dp Suresh <dp@netscape.com>
*/
#include "wfMime.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "ctype.h"
static void free_mime_store(wfList *object, void *item);
wfMimeList::wfMimeList(const char *str) : wfList(free_mime_store)
{
// Parse the mimeString and create mime_store(s)
// The format of the mimeString is
// mime/type:suffix[,suffix]...:Description
// [;mime/type:suffix[,suffix]...:Description]...
if (str && *str)
{
reconstruct(str);
}
}
char *
wfMimeList::describe()
{
char buf[1024]; // XXX this should be dynamic
char *s = buf;
struct wfListElement *tmp = head;
buf[0] = '\0';
for (; tmp; tmp = tmp->next)
{
struct mime_store *ele = (struct mime_store *) tmp->item;
// XXX Need to check for memory overflow
// NO I18N REQUIRED FOR THESE STRINGS
sprintf(s, "%s:%s:%s:%s;", ele->mimetype,
(ele->extensions?ele->extensions:" "),
(ele->description?ele->description:" "),
(ele->isEnabled?"enable":"disable"));
s += strlen(s);
}
return (*buf ? strdup(buf) : 0);
}
int
wfMimeList::reconstruct(const char *str)
{
char buf[512];
char *mimetype, *extensions, *description;
int enabled;
int err = 0;
struct mime_store *ele;
if (!str || !*str)
{
// Error. No string to reconstruct from.
err--;
}
while (err == 0 && *str )
{
mimetype = extensions = description = NULL;
enabled = 1;
str = wf_scanToken(str, buf, sizeof(buf), ":", 0);
if (buf[0] == '\0' || *str != ':')
{
break;
}
str++;
mimetype = CopyString(buf);
str = wf_scanToken(str, buf, sizeof(buf), ";:", 1);
extensions = CopyString(buf);
if (*str == ':')
{
str++;
str = wf_scanToken(str, buf, sizeof(buf), ";:", 0);
description = CopyString(buf);
if (*str == ':')
{
str++;
str = wf_scanToken(str, buf, sizeof(buf), ";", 0);
// NO I18N REQUIRED FOR THESE STRINGS
if (buf[0] != '\0' && !strncmp(buf, "disable", 7))
{
enabled = 0;
}
}
}
ele = new mime_store;
if (!ele)
{
// No memory
err--;
continue;
}
ele->mimetype = mimetype;
ele->description = description;
ele->extensions = extensions;
ele->isEnabled = enabled;
add(ele);
if (*str != ';')
{
break;
}
str++;
}
return err;
}
wfMimeList::~wfMimeList()
{
finalize();
}
int wfMimeList::finalize(void)
{
wfList::removeAll();
return (0);
}
void
/*ARGSUSED*/
free_mime_store(wfList *object, void *item)
{
struct mime_store *ele = (struct mime_store *) item;
if (ele->mimetype)
{
delete ele->mimetype;
ele->mimetype = NULL;
}
if (ele->extensions)
{
delete ele->extensions;
ele->extensions = NULL;
}
if (ele->description)
{
delete ele->description;
ele->description = NULL;
}
delete ele;
}
//
// Implementation of public methods
//
int wfMimeList::setEnabledStatus(const char *mimetype, int enabledStatus)
{
struct mime_store *ele = find(mimetype);
if (!ele)
{
// mimetype not found
return (-1);
}
ele->isEnabled = (enabledStatus?1:0);
return (0);
}
int wfMimeList::isEnabled(const char *mimetype)
{
struct mime_store *ele = find(mimetype);
if (!ele)
{
// mimetype not found
return (-1);
}
return (ele->isEnabled);
}
const char * wfMimeList::getMimetypeFromExtension(const char *ext)
{
const char *mimetype = NULL;
struct wfListElement *tmp = head;
struct mime_store *ele = NULL;
if (!ext || !*ext)
{
return (NULL);
}
for (; tmp; tmp = tmp->next)
{
ele = (struct mime_store *) tmp->item;
if (!ele->extensions || !*(ele->extensions))
{
continue;
}
//
// Check if ele->extensions contains ext
// Extension is a comma separated list. We have normalized it
// before storing it into ele so that it contains no leading '.'
// or spaces.
//
const char *p = ele->extensions;
const char *q = ext;
int found = 0;
while (*p)
{
if (*p == ',')
{
// Move to the next extension
p++;
q = ext;
}
else if (!*q)
{
// maybe Success if *p is either , or NULL
if ((*p == '\0') || (*p == ','))
{
found = 1;
break;
}
else
{
q = ext;
// Nope. Skip to next extension.
while (*p && *p != ',') p++;
}
}
else if ((*p == *q) || (tolower(*p) == tolower(*q)))
{
// keep going.
p++; q++;
}
else
{
// *p != *q
q = ext;
// Nope. Skip to next extension.
while (*p && *p != ',') p++;
}
}
if (!*q)
{
// We came out becasue p is null. If q is also null, then
// we did find a match.
found = 1;
}
if (found)
{
mimetype = ele->mimetype;
break;
}
}
return (mimetype);
}
//
// Implementation of private methods
//
struct mime_store *
wfMimeList::find(const char *mimetype)
{
struct mime_store *ret = NULL;
struct wfListElement *tmp = head;
for (; tmp; tmp = tmp->next)
{
struct mime_store *ele = (struct mime_store *) tmp->item;
if (!wf_strcasecmp(ele->mimetype, mimetype))
{
ret = ele;
}
}
return (ret);
}