1
0
Fork 0
mirror of git://git.psyc.eu/libpsyc synced 2024-08-15 03:19:02 +00:00
libpsyc/include/psyc/uniform.h

136 lines
3.6 KiB
C
Raw Normal View History

2013-07-16 14:53:51 +00:00
/*
This file is part of libpsyc.
Copyright (C) 2011,2012 Carlo v. Loesch, Gabor X Toth, Mathias L. Baumann,
and other contributing authors.
libpsyc is free software: you can redistribute it and/or modify it under the
terms of the GNU Affero General Public License as published by the Free
Software Foundation, either version 3 of the License, or (at your option) any
later version. As a special exception, libpsyc is distributed with additional
permissions to link libpsyc libraries with non-AGPL works.
libpsyc 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 Affero General Public License for more
details.
You should have received a copy of the GNU Affero General Public License and
the linking exception along with libpsyc in a COPYING file.
*/
2011-10-13 22:29:32 +00:00
#ifndef PSYC_UNIFORM_H
2011-11-11 21:18:24 +00:00
#define PSYC_UNIFORM_H
2011-10-13 22:29:32 +00:00
/**
* @file uniform.h
* @brief Uniform parsing.
*/
#include <psyc.h>
typedef enum {
2011-11-11 21:18:24 +00:00
PSYC_SCHEME_PSYC = 0,
PSYC_SCHEME_IRC = 1,
PSYC_SCHEME_XMPP = 2,
PSYC_SCHEME_SIP = 3,
2011-10-31 19:26:47 +00:00
} PsycScheme;
2011-10-13 23:16:09 +00:00
typedef struct {
2011-10-13 22:29:32 +00:00
// essential parts
2011-11-11 21:18:24 +00:00
uint8_t valid;
PsycScheme type;
PsycString scheme;
PsycString user;
PsycString pass;
PsycString host;
PsycString port;
PsycString transport;
PsycString resource;
PsycString query;
PsycString channel;
2011-10-13 22:29:32 +00:00
// convenient snippets of the URL
2011-11-11 21:18:24 +00:00
PsycString full; // the URL as such
PsycString body; // the URL without scheme and '//'
PsycString user_host; // mailto and xmpp style
PsycString host_port; // just host:port (and transport)
PsycString root; // root UNI
PsycString entity; // entity UNI, without the channel
PsycString slashes; // the // if the protocol has them
PsycString slash; // first / after host
2012-01-25 17:05:44 +00:00
PsycString path; // path begins at first / after host
2011-11-11 21:18:24 +00:00
PsycString nick; // whatever works as a nickname
2011-10-31 19:26:47 +00:00
} PsycUniform;
2011-10-13 23:16:09 +00:00
typedef enum {
2011-11-11 21:18:24 +00:00
PSYC_UNIFORM_SCHEME = 0,
PSYC_UNIFORM_SLASHES,
PSYC_UNIFORM_USER,
PSYC_UNIFORM_PASS,
PSYC_UNIFORM_HOST,
PSYC_UNIFORM_PORT,
PSYC_UNIFORM_TRANSPORT,
PSYC_UNIFORM_RESOURCE,
PSYC_UNIFORM_QUERY,
PSYC_UNIFORM_CHANNEL,
2011-10-31 19:26:47 +00:00
} PsycUniformPart;
2011-10-13 22:29:32 +00:00
typedef enum {
2011-11-11 21:18:24 +00:00
PSYC_PARSE_UNIFORM_INVALID_SLASHES = -7,
PSYC_PARSE_UNIFORM_INVALID_CHANNEL = -6,
PSYC_PARSE_UNIFORM_INVALID_RESOURCE = -5,
PSYC_PARSE_UNIFORM_INVALID_TRANSPORT = -4,
PSYC_PARSE_UNIFORM_INVALID_PORT = -3,
PSYC_PARSE_UNIFORM_INVALID_HOST = -2,
PSYC_PARSE_UNIFORM_INVALID_SCHEME = -1,
2011-10-31 19:26:47 +00:00
} PsycParseUniformRC;
2011-10-13 22:29:32 +00:00
1984-04-04 00:44:05 +00:00
/**
* Accepted transport flags in PSYC uniforms.
* Appears after the hostname, the colon and the optional port number
*/
2011-10-13 22:29:32 +00:00
typedef enum {
2011-11-11 21:18:24 +00:00
PSYC_TRANSPORT_TCP = 'c',
PSYC_TRANSPORT_UDP = 'd',
PSYC_TRANSPORT_TLS = 's',
PSYC_TRANSPORT_GNUNET = 'g',
2011-10-31 19:26:47 +00:00
} PsycTransport;
2011-10-13 22:29:32 +00:00
1984-04-04 00:44:05 +00:00
/** Characters indicating typical kinds of PSYC entities. */
2011-10-13 22:29:32 +00:00
typedef enum {
2011-11-11 21:18:24 +00:00
PSYC_ENTITY_ROOT = 0,
PSYC_ENTITY_PERSON = '~',
PSYC_ENTITY_PLACE = '@',
PSYC_ENTITY_SERVICE = '$',
2011-10-31 19:26:47 +00:00
} PsycEntityType;
2011-10-13 22:29:32 +00:00
2011-12-03 13:34:29 +00:00
/**
* Parse uniform.
*
* @return PsycScheme on success, PsycParseUniformRC on error.
*/
2011-11-11 21:18:24 +00:00
int
2011-12-01 13:12:41 +00:00
psyc_uniform_parse (PsycUniform *uni, const char *buffer, size_t length);
2011-10-13 22:29:32 +00:00
2011-12-03 13:34:29 +00:00
/**
* Get entity type.
*
* @return PsycEntityType on success, PSYC_ERROR on error.
*/
inline int
2011-12-03 13:34:29 +00:00
psyc_entity_type (char entity)
{
switch (entity) {
case PSYC_ENTITY_PERSON:
return PSYC_ENTITY_PERSON;
case PSYC_ENTITY_PLACE:
return PSYC_ENTITY_PLACE;
case PSYC_ENTITY_SERVICE:
return PSYC_ENTITY_SERVICE;
default:
return PSYC_ERROR;
}
}
2011-10-13 22:29:32 +00:00
#endif