mirror of
https://forge.fsky.io/lda/Parsee.git
synced 2026-03-13 16:55:10 +00:00
[MOD/ADD] Start element/XMPPwerk
XML gave me an aneurysm. I hate this.
This commit is contained in:
parent
79217d3608
commit
138932d637
4 changed files with 204 additions and 0 deletions
112
src/XML/Elements.c
Normal file
112
src/XML/Elements.c
Normal file
|
|
@ -0,0 +1,112 @@
|
||||||
|
#include <XML.h>
|
||||||
|
|
||||||
|
#include <Cytoplasm/Memory.h>
|
||||||
|
#include <Cytoplasm/Str.h>
|
||||||
|
|
||||||
|
XMLElement *
|
||||||
|
XMLCreateTag(char *name)
|
||||||
|
{
|
||||||
|
XMLElement *elem;
|
||||||
|
if (!name)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
elem = Malloc(sizeof(*elem));
|
||||||
|
|
||||||
|
elem->type = XML_ELEMENT_TAG;
|
||||||
|
elem->name = StrDuplicate(name);
|
||||||
|
elem->attrs = HashMapCreate();
|
||||||
|
elem->children = ArrayCreate();
|
||||||
|
|
||||||
|
elem->data = NULL;
|
||||||
|
|
||||||
|
return elem;
|
||||||
|
}
|
||||||
|
XMLElement *
|
||||||
|
XMLCreateText(char *data)
|
||||||
|
{
|
||||||
|
XMLElement *elem;
|
||||||
|
if (!data)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
elem = Malloc(sizeof(*elem));
|
||||||
|
|
||||||
|
elem->type = XML_ELEMENT_DATA;
|
||||||
|
elem->name = NULL;
|
||||||
|
elem->attrs = NULL;
|
||||||
|
elem->children = NULL;
|
||||||
|
|
||||||
|
elem->data = StrDuplicate(data);
|
||||||
|
|
||||||
|
return elem;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
XMLAddAttr(XMLElement *element, char *key, char *val)
|
||||||
|
{
|
||||||
|
if (!element || !key || !val)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (element->type != XML_ELEMENT_TAG)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
HashMapSet(element->attrs, key, StrDuplicate(val));
|
||||||
|
}
|
||||||
|
void
|
||||||
|
XMLAddChild(XMLElement *element, XMLElement *child)
|
||||||
|
{
|
||||||
|
if (!element || !child)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (element->type != XML_ELEMENT_TAG)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayAdd(element->children, child);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
XMLFreeElement(XMLElement *element)
|
||||||
|
{
|
||||||
|
if (!element)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (element->name)
|
||||||
|
{
|
||||||
|
Free(element->name);
|
||||||
|
}
|
||||||
|
if (element->data)
|
||||||
|
{
|
||||||
|
Free(element->data);
|
||||||
|
}
|
||||||
|
if (element->attrs)
|
||||||
|
{
|
||||||
|
char *key, *val;
|
||||||
|
while (HashMapIterate(element->attrs, &key, (void **) &val))
|
||||||
|
{
|
||||||
|
Free(val);
|
||||||
|
}
|
||||||
|
HashMapFree(element->attrs);
|
||||||
|
}
|
||||||
|
if (element->children)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < ArraySize(element->children); i++)
|
||||||
|
{
|
||||||
|
XMLFreeElement(ArrayGet(element->children, i));
|
||||||
|
}
|
||||||
|
ArrayFree(element->children);
|
||||||
|
}
|
||||||
|
|
||||||
|
Free(element);
|
||||||
|
}
|
||||||
37
src/XMPP/Component.c
Normal file
37
src/XMPP/Component.c
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
#include <XMPP.h>
|
||||||
|
|
||||||
|
#include <XML.h>
|
||||||
|
|
||||||
|
/* TODO: Write the stream system once we have our XML implementation
|
||||||
|
* checked out.
|
||||||
|
*
|
||||||
|
* Did I mention I _hate_ writing XML SAX parsers? Oh, well, they're
|
||||||
|
* easier than making a DOM directly, so eeh. */
|
||||||
|
|
||||||
|
/* The default component port Prosody uses. */
|
||||||
|
#define DEFAULT_PROSODY_PORT 5347
|
||||||
|
|
||||||
|
Stream *
|
||||||
|
XMPPInitialiseCompStream(char *host, int port)
|
||||||
|
{
|
||||||
|
/* TODO */
|
||||||
|
(void) host;
|
||||||
|
(void) port;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
XMPPAuthenticateCompStream(Stream *stream, char *shared)
|
||||||
|
{
|
||||||
|
/* TODO */
|
||||||
|
(void) stream;
|
||||||
|
(void) shared;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
XMPPEndCompStream(Stream *stream)
|
||||||
|
{
|
||||||
|
(void) stream;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include <Cytoplasm/HashMap.h>
|
#include <Cytoplasm/HashMap.h>
|
||||||
#include <Cytoplasm/Stream.h>
|
#include <Cytoplasm/Stream.h>
|
||||||
|
#include <Cytoplasm/Array.h>
|
||||||
|
|
||||||
typedef struct XMLexer XMLexer;
|
typedef struct XMLexer XMLexer;
|
||||||
typedef struct XMLEvent {
|
typedef struct XMLEvent {
|
||||||
|
|
@ -33,4 +34,39 @@ extern XMLexer * XMLCreateLexer(Stream *, bool);
|
||||||
extern XMLEvent * XMLCrank(XMLexer *);
|
extern XMLEvent * XMLCrank(XMLexer *);
|
||||||
extern void XMLFreeEvent(XMLEvent *);
|
extern void XMLFreeEvent(XMLEvent *);
|
||||||
extern void XMLFreeLexer(XMLexer *);
|
extern void XMLFreeLexer(XMLexer *);
|
||||||
|
|
||||||
|
typedef struct XMLElement {
|
||||||
|
enum {
|
||||||
|
XML_ELEMENT_UNKNOWN = 0,
|
||||||
|
XML_ELEMENT_TAG,
|
||||||
|
XML_ELEMENT_DATA,
|
||||||
|
XML_ELEMENT_PI,
|
||||||
|
XML_ELEMENT_CDATA
|
||||||
|
} type;
|
||||||
|
|
||||||
|
|
||||||
|
/* Only set when the type is a TAG. */
|
||||||
|
char *name;
|
||||||
|
HashMap *attrs;
|
||||||
|
Array *children;
|
||||||
|
|
||||||
|
/* Only set when the type is DATA or
|
||||||
|
* CDATA */
|
||||||
|
char *data;
|
||||||
|
} XMLElement;
|
||||||
|
|
||||||
|
/* Decodes 1 element off a stream. */
|
||||||
|
extern XMLElement * XMLDecode(Stream *stream, bool autofree);
|
||||||
|
|
||||||
|
extern XMLElement * XMLCreateTag(char *name);
|
||||||
|
extern XMLElement * XMLCreateText(char *data);
|
||||||
|
extern void XMLAddAttr(XMLElement *element, char *key, char *val);
|
||||||
|
extern void XMLAddChild(XMLElement *element, XMLElement *child);
|
||||||
|
|
||||||
|
|
||||||
|
/* Frees an XML element properly. */
|
||||||
|
extern void XMLFreeElement(XMLElement *element);
|
||||||
|
|
||||||
|
/* Encodes an XML element to a stream */
|
||||||
|
extern void XMLEncode(Stream *stream, XMLElement *element);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
19
src/include/XMPP.h
Normal file
19
src/include/XMPP.h
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
#ifndef PARSEE_XMPP_H
|
||||||
|
#define PARSEE_XMPP_H
|
||||||
|
|
||||||
|
#include <Cytoplasm/Stream.h>
|
||||||
|
|
||||||
|
/* Initialises a raw component stream to host, with an optional port.
|
||||||
|
* If said port is 0, then it is set to the default Prosody port */
|
||||||
|
extern Stream * XMPPInitialiseCompStream(char *host, int port);
|
||||||
|
|
||||||
|
/* Authenticates a component stream with a given shared secret,
|
||||||
|
* with a stream ID from the server. This should be called right
|
||||||
|
* after XMPPInitialiseCompStream. */
|
||||||
|
extern bool XMPPAuthenticateCompStream(Stream *stream, char *shared);
|
||||||
|
|
||||||
|
/* TODO: XMPP stuff, I don't fucking know, I'm not a Jabbernerd. */
|
||||||
|
|
||||||
|
/* Closes a raw component stream. */
|
||||||
|
extern void XMPPEndCompStream(Stream *stream);
|
||||||
|
#endif
|
||||||
Loading…
Add table
Add a link
Reference in a new issue