2019-11-21 14:24:02 -06:00
|
|
|
/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This file is part of The Croco Library
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of version 2.1 of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
|
|
|
* USA
|
|
|
|
*
|
|
|
|
* See COPRYRIGHTS file for copyright information.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <string.h>
|
|
|
|
#include "cr-doc-handler.h"
|
|
|
|
#include "cr-parser.h"
|
|
|
|
|
|
|
|
/**
|
|
|
|
*@CRDocHandler:
|
|
|
|
*
|
|
|
|
*The definition of the CRDocHandler class.
|
|
|
|
*Contains methods to instantiate, destroy,
|
2020-08-19 11:26:11 +02:00
|
|
|
*and initialize instances of #CRDocHandler
|
2019-11-21 14:24:02 -06:00
|
|
|
*to custom values.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define PRIVATE(obj) (obj)->priv
|
|
|
|
|
|
|
|
struct _CRDocHandlerPriv {
|
|
|
|
/**
|
|
|
|
*This pointer is to hold an application parsing context.
|
|
|
|
*For example, it used by the Object Model parser to
|
|
|
|
*store it parsing context. #CRParser does not touch it, but
|
|
|
|
*#CROMParser does. #CROMParser allocates this pointer at
|
|
|
|
*the beginning of the css document, and frees it at the end
|
|
|
|
*of the document.
|
|
|
|
*/
|
|
|
|
gpointer context;
|
|
|
|
|
|
|
|
/**
|
|
|
|
*The place where #CROMParser puts the result of its parsing, if
|
|
|
|
*any.
|
|
|
|
*/
|
|
|
|
gpointer result;
|
|
|
|
/**
|
|
|
|
*a pointer to the parser used to parse
|
|
|
|
*the current document.
|
|
|
|
*/
|
|
|
|
CRParser *parser ;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* cr_doc_handler_new:
|
|
|
|
*Constructor of #CRDocHandler.
|
|
|
|
*
|
|
|
|
*Returns the newly built instance of
|
|
|
|
*#CRDocHandler
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
CRDocHandler *
|
|
|
|
cr_doc_handler_new (void)
|
|
|
|
{
|
|
|
|
CRDocHandler *result = NULL;
|
|
|
|
|
|
|
|
result = g_try_malloc (sizeof (CRDocHandler));
|
|
|
|
|
|
|
|
g_return_val_if_fail (result, NULL);
|
|
|
|
|
|
|
|
memset (result, 0, sizeof (CRDocHandler));
|
|
|
|
result->ref_count++;
|
|
|
|
|
|
|
|
result->priv = g_try_malloc (sizeof (CRDocHandlerPriv));
|
|
|
|
if (!result->priv) {
|
|
|
|
cr_utils_trace_info ("Out of memory exception");
|
|
|
|
g_free (result);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
cr_doc_handler_set_default_sac_handler (result);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* cr_doc_handler_get_ctxt:
|
|
|
|
*@a_this: the current instance of #CRDocHandler.
|
|
|
|
*@a_ctxt: out parameter. The new parsing context.
|
|
|
|
*
|
|
|
|
*Gets the private parsing context associated to the document handler
|
|
|
|
*The private parsing context is used by libcroco only.
|
|
|
|
*
|
2020-08-19 11:26:11 +02:00
|
|
|
*Returns CR_OK upon successful completion, an error code otherwise.
|
2019-11-21 14:24:02 -06:00
|
|
|
*/
|
|
|
|
enum CRStatus
|
|
|
|
cr_doc_handler_get_ctxt (CRDocHandler const * a_this, gpointer * a_ctxt)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (a_this && a_this->priv, CR_BAD_PARAM_ERROR);
|
|
|
|
|
|
|
|
*a_ctxt = a_this->priv->context;
|
|
|
|
|
|
|
|
return CR_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* cr_doc_handler_set_ctxt:
|
|
|
|
*@a_this: the current instance of #CRDocHandler
|
|
|
|
*@a_ctxt: a pointer to the parsing context.
|
|
|
|
*
|
|
|
|
*Sets the private parsing context.
|
|
|
|
*This is used by libcroco only.
|
2020-08-19 11:26:11 +02:00
|
|
|
*Returns CR_OK upon successful completion, an error code otherwise.
|
2019-11-21 14:24:02 -06:00
|
|
|
*/
|
|
|
|
enum CRStatus
|
|
|
|
cr_doc_handler_set_ctxt (CRDocHandler * a_this, gpointer a_ctxt)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (a_this && a_this->priv, CR_BAD_PARAM_ERROR);
|
|
|
|
a_this->priv->context = a_ctxt;
|
|
|
|
return CR_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* cr_doc_handler_get_result:
|
|
|
|
*@a_this: the current instance of #CRDocHandler
|
|
|
|
*@a_result: out parameter. The returned result.
|
|
|
|
*
|
|
|
|
*Gets the private parsing result.
|
|
|
|
*The private parsing result is used by libcroco only.
|
|
|
|
*
|
2020-08-19 11:26:11 +02:00
|
|
|
*Returns CR_OK upon successful completion, an error code otherwise.
|
2019-11-21 14:24:02 -06:00
|
|
|
*/
|
|
|
|
enum CRStatus
|
|
|
|
cr_doc_handler_get_result (CRDocHandler const * a_this, gpointer * a_result)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (a_this && a_this->priv, CR_BAD_PARAM_ERROR);
|
|
|
|
|
|
|
|
*a_result = a_this->priv->result;
|
|
|
|
|
|
|
|
return CR_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* cr_doc_handler_set_result:
|
|
|
|
*@a_this: the current instance of #CRDocHandler
|
|
|
|
*@a_result: the new result.
|
|
|
|
*
|
|
|
|
*Sets the private parsing context.
|
|
|
|
*This is used by libcroco only.
|
|
|
|
*
|
2020-08-19 11:26:11 +02:00
|
|
|
*Returns CR_OK upon successful completion, an error code otherwise.
|
2019-11-21 14:24:02 -06:00
|
|
|
*/
|
|
|
|
enum CRStatus
|
|
|
|
cr_doc_handler_set_result (CRDocHandler * a_this, gpointer a_result)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (a_this && a_this->priv, CR_BAD_PARAM_ERROR);
|
|
|
|
a_this->priv->result = a_result;
|
|
|
|
return CR_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*cr_doc_handler_set_default_sac_handler:
|
|
|
|
*@a_this: a pointer to the current instance of #CRDocHandler.
|
|
|
|
*
|
|
|
|
*Sets the sac handlers contained in the current
|
|
|
|
*instance of DocHandler to the default handlers.
|
|
|
|
*For the time being the default handlers are
|
|
|
|
*test handlers. This is expected to change in a
|
|
|
|
*near future, when the libcroco gets a bit debugged.
|
|
|
|
*
|
2020-08-19 11:26:11 +02:00
|
|
|
*Returns CR_OK upon successful completion, an error code otherwise.
|
2019-11-21 14:24:02 -06:00
|
|
|
*/
|
|
|
|
enum CRStatus
|
|
|
|
cr_doc_handler_set_default_sac_handler (CRDocHandler * a_this)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR);
|
|
|
|
|
|
|
|
a_this->start_document = NULL;
|
|
|
|
a_this->end_document = NULL;
|
|
|
|
a_this->import_style = NULL;
|
|
|
|
a_this->namespace_declaration = NULL;
|
|
|
|
a_this->comment = NULL;
|
|
|
|
a_this->start_selector = NULL;
|
|
|
|
a_this->end_selector = NULL;
|
|
|
|
a_this->property = NULL;
|
|
|
|
a_this->start_font_face = NULL;
|
|
|
|
a_this->end_font_face = NULL;
|
|
|
|
a_this->start_media = NULL;
|
|
|
|
a_this->end_media = NULL;
|
|
|
|
a_this->start_page = NULL;
|
|
|
|
a_this->end_page = NULL;
|
|
|
|
a_this->ignorable_at_rule = NULL;
|
|
|
|
a_this->error = NULL;
|
|
|
|
a_this->unrecoverable_error = NULL;
|
|
|
|
return CR_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* cr_doc_handler_ref:
|
|
|
|
*@a_this: the current instance of #CRDocHandler.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
cr_doc_handler_ref (CRDocHandler * a_this)
|
|
|
|
{
|
|
|
|
g_return_if_fail (a_this);
|
|
|
|
|
|
|
|
a_this->ref_count++;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* cr_doc_handler_unref:
|
2020-08-19 11:26:11 +02:00
|
|
|
*@a_this: the current instance of #CRDocHandler.
|
2019-11-21 14:24:02 -06:00
|
|
|
*
|
|
|
|
*Decreases the ref count of the current instance of #CRDocHandler.
|
|
|
|
*If the ref count reaches '0' then, destroys the instance.
|
|
|
|
*
|
|
|
|
*Returns TRUE if the instance as been destroyed, FALSE otherwise.
|
|
|
|
*/
|
|
|
|
gboolean
|
|
|
|
cr_doc_handler_unref (CRDocHandler * a_this)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (a_this, FALSE);
|
|
|
|
|
|
|
|
if (a_this->ref_count > 0) {
|
|
|
|
a_this->ref_count--;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (a_this->ref_count == 0) {
|
|
|
|
cr_doc_handler_destroy (a_this);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
return FALSE ;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* cr_doc_handler_destroy:
|
|
|
|
*@a_this: the instance of #CRDocHandler to
|
|
|
|
*destroy.
|
|
|
|
*
|
|
|
|
*The destructor of the #CRDocHandler class.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
cr_doc_handler_destroy (CRDocHandler * a_this)
|
|
|
|
{
|
|
|
|
g_return_if_fail (a_this);
|
|
|
|
|
|
|
|
if (a_this->priv) {
|
|
|
|
g_free (a_this->priv);
|
|
|
|
a_this->priv = NULL;
|
|
|
|
}
|
|
|
|
g_free (a_this);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* cr_doc_handler_associate_a_parser:
|
|
|
|
*Associates a parser to the current document handler
|
|
|
|
*
|
|
|
|
*@a_this: the current instance of document handler.
|
|
|
|
*@a_parser: the parser to associate.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
cr_doc_handler_associate_a_parser (CRDocHandler *a_this,
|
|
|
|
gpointer a_parser)
|
|
|
|
{
|
|
|
|
g_return_if_fail (a_this && PRIVATE (a_this)
|
|
|
|
&& a_parser) ;
|
|
|
|
|
|
|
|
PRIVATE (a_this)->parser = a_parser ;
|
|
|
|
}
|