Internal version number to 8.01 for imminent release
[citadel.git] / libcitadel / lib / libcitadel.h
index b15c8c91c1729c8be42f23e28a8c75d16b18b583..3f1e59785c2050b9ea40f39a8600d2a80067d5f9 100644 (file)
@@ -1,6 +1,5 @@
 /*
- * $Id$
- *
+ * Header file for libcitadel
  */
 
 
@@ -15,7 +14,9 @@
 #include <time.h>
 #include <stdlib.h>
 #include <stdarg.h>
-#define LIBCITADEL_VERSION_NUMBER      783
+#include <arpa/inet.h>
+
+#define LIBCITADEL_VERSION_NUMBER      801
 
 /*
  * Here's a bunch of stupid magic to make the MIME parser portable.
 #endif
 
 
-/* Logging levels - correspond to syslog(3) */
-enum LogLevel {
-       /* When about to exit the server for an unrecoverable error */
-        CTDL_EMERG,    /* system is unusable */
-       /* Manual intervention is required to avoid an abnormal exit */
-        CTDL_ALERT,    /* action must be taken immediately */
-       /* The server can continue to run with degraded functionality */
-        CTDL_CRIT,     /* critical conditions */
-       /* An error occurs but the server continues to run normally */
-        CTDL_ERR,      /* error conditions */
-       /* An abnormal condition was detected; server will continue normally */
-        CTDL_WARNING,  /* warning conditions */
-       /* Normal messages (login/out, activity, etc.) */
-        CTDL_NOTICE,   /* normal but significant condition */
-       /* Unimportant progress messages, etc. */
-        CTDL_INFO,     /* informational */
-       /* Debugging messages */
-        CTDL_DEBUG     /* debug-level messages */
-};
-
 typedef enum AXLevel {
        AxDeleted = 0,
        AxNewU = 1,
@@ -68,6 +49,18 @@ enum RoomNetCfg {
        maxRoomNetCfg
 };
 
+enum GNET_POP3_PARTS { /* pop3client splits into these columns: */
+       GNET_POP3_HOST = 1,
+       GNET_POP3_USER = 2,
+       GNET_POP3_PASS = 4,
+       GNET_POP3_DONT_DELETE_REMOTE = 4,
+       GNET_POP3_INTERVAL = 5
+};
+
+enum GNET_PUSH_SHARE { /* ignet_push_share splits into these columns: */
+       GNET_IGNET_NODE = 1,
+       GNET_IGNET_ROOM = 2
+};
 
 typedef enum __GPEXWhichPolicy {
        roompolicy,
@@ -81,17 +74,22 @@ typedef enum __GPEXWhichPolicy {
  * View definitions.
  * Note that not all views are implemented in all clients.
  */
-#define        VIEW_BBS                0       /* Bulletin board view */
-#define VIEW_MAILBOX           1       /* Mailbox summary */
-#define VIEW_ADDRESSBOOK       2       /* Address book view */
-#define VIEW_CALENDAR          3       /* Calendar view */
-#define VIEW_TASKS             4       /* Tasks view */
-#define VIEW_NOTES             5       /* Notes view */
-#define        VIEW_WIKI               6       /* Wiki view */
-#define VIEW_CALBRIEF          7       /* Brief Calendar view */
-#define VIEW_JOURNAL           8       /* Journal view */
-#define VIEW_BLOG              9       /* Blog view (not yet implemented) */
-
+typedef enum _room_views {
+       VIEW_BBS                = 0,    /* Bulletin board view */
+       VIEW_MAILBOX            = 1,    /* Mailbox summary */
+       VIEW_ADDRESSBOOK        = 2,    /* Address book view */
+       VIEW_CALENDAR           = 3,    /* Calendar view */
+       VIEW_TASKS              = 4,    /* Tasks view */
+       VIEW_NOTES              = 5,    /* Notes view */
+       VIEW_WIKI               = 6,    /* Wiki view */
+       VIEW_CALBRIEF           = 7,    /* Brief Calendar view */
+       VIEW_JOURNAL            = 8,    /* Journal view */
+       VIEW_DRAFTS             = 9,    /* Drafts view */
+       VIEW_BLOG               = 10,   /* Blog view */
+       VIEW_MAX
+} ROOM_VIEWS;
+
+#define BLOG_EUIDBUF_SIZE      40
 
 #ifndef IsEmptyStr
 #define IsEmptyStr(a) ((a)[0] == '\0')
@@ -116,7 +114,7 @@ void ShutDownLibCitadel(void);
  * MIME parser declarations
  */
 
-void extract_key(char *target, char *source, long sourcelen, char *key, long keylen, char KeyEnd);
+long extract_key(char *target, char *source, long sourcelen, char *key, long keylen, char KeyEnd);
 
 
 typedef void (*MimeParserCallBackType)(char *cbname,
@@ -152,6 +150,11 @@ void mime_decode(char *partnum,
                 MimeParserCallBackType PostMultiPartCallBack,
                 void *userdata,
                 int dont_decode);
+int mime_decode_now (char *part_start, 
+                    size_t length,
+                    char *encoding,
+                    char **decoded,
+                    size_t *bytes_decoded);
 void the_mime_parser(char *partnum,
                     char *content_start, char *content_end,
                     MimeParserCallBackType CallBack,
@@ -175,6 +178,7 @@ StrBuf* NewStrBufDup(const StrBuf *CopyMe);
 StrBuf* NewStrBufPlain(const char* ptr, int nChars);
 long StrBufShrinkToFit(StrBuf *Buf, int Force);
 void ReAdjustEmptyBuf(StrBuf *Buf, long ThreshHold, long NewSize);
+void NewStrBufDupAppendFlush(StrBuf **CreateRelpaceMe, StrBuf *CopyFlushMe, const char *NoMe, int KeepOriginal);
 
 int StrBufPlain(StrBuf *Buf, const char* ptr, int nChars);
 StrBuf* _NewConstStrBuf(const char* StringConstant, size_t SizeOfStrConstant);
@@ -217,7 +221,28 @@ int StrBufTCP_read_buffered_line_fast(StrBuf *Line,
                                      int selectresolution, 
                                      const char **Error);
 
-int StrBufSipLine(StrBuf *LineBuf, StrBuf *Buf, const char **Ptr);
+typedef enum _eReadState {
+       eReadFail,
+       eReadSuccess,
+       eMustReadMore, 
+       eBufferNotEmpty
+} eReadState;
+
+typedef struct _file_buffer {
+       StrBuf *Buf;
+       const char *ReadWritePointer;
+       int fd;
+       int LineCompleted;
+       int nBlobBytesWanted;
+} IOBuffer;
+
+long StrBuf_read_one_chunk_callback (int fd, short event, IOBuffer *FB);
+int StrBuf_write_one_chunk_callback(int fd, short event, IOBuffer *FB);
+
+eReadState StrBufChunkSipLine(StrBuf *LineBuf, IOBuffer *FB);
+eReadState StrBufCheckBuffer(IOBuffer *FB);
+
+int StrBufSipLine(StrBuf *LineBuf, const StrBuf *Buf, const char **Ptr);
 int StrBufReplaceToken(StrBuf *Buf, long where, long HowLong, const char *Repl, long ReplLen);
 int StrBufExtract_token(StrBuf *dest, const StrBuf *Source, int parmnum, char separator);
 int StrBufSub(StrBuf *dest, const StrBuf *Source, unsigned long Offset, size_t nChars);
@@ -249,6 +274,7 @@ void StrBufCutLeft(StrBuf *Buf, int nChars);
 void StrBufCutRight(StrBuf *Buf, int nChars);
 void StrBufCutAt(StrBuf *Buf, int AfternChars, const char *At);
 void StrBufTrim(StrBuf *Buf);
+void StrBufSpaceToBlank(StrBuf *Buf);
 void StrBufStripAllBut(StrBuf *Buf, char leftboundary, char rightboundary);
 void StrBufUpCase(StrBuf *Buf);
 void StrBufLowerCase(StrBuf *Buf);
@@ -262,7 +288,15 @@ void StrBufReplaceChars(StrBuf *buf, char search, char replace);
 int CompressBuffer(StrBuf *Buf);
 void StrBufConvert(StrBuf *ConvertBuf, StrBuf *TmpBuf, void *pic);
 void ctdl_iconv_open(const char *tocode, const char *fromcode, void *pic);
+void StrBuf_RFC822_2_Utf8(StrBuf *Target, 
+                         const StrBuf *DecodeMe, 
+                         const StrBuf* DefaultCharset, 
+                         StrBuf *FoundCharset, 
+                         StrBuf *ConvertBuf, 
+                         StrBuf *ConvertBuf2);
+/* deprecated old version: */
 void StrBuf_RFC822_to_Utf8(StrBuf *Target, const StrBuf *DecodeMe, const StrBuf* DefaultCharset, StrBuf *FoundCharset);
+
 int StrBufDecodeBase64(StrBuf *Buf);
 int StrBufDecodeHex(StrBuf *Buf);
 int StrBufRFC2047encode(StrBuf **target, const StrBuf *source);
@@ -276,6 +310,7 @@ int StrBufSanitizeAscii(StrBuf *Buf, const char Mute);
 #define QU                     (3)
 void StrBufUrlescAppend(StrBuf *OutBuf, const StrBuf *In, const char *PlainIn);
 void StrBufHexescAppend(StrBuf *OutBuf, const StrBuf *In, const char *PlainIn);
+void StrBufHexEscAppend(StrBuf *OutBuf, const StrBuf *In, const unsigned char *PlainIn, long PlainInLen);
 long StrEscAppend(StrBuf *Target, const StrBuf *Source, const char *PlainIn, int nbsp, int nolinebreaks);
 long StrECMAEscAppend(StrBuf *Target, const StrBuf *Source, const char *PlainIn);
 long StrHtmlEcmaEscAppend(StrBuf *Target, const StrBuf *Source, const char *PlainIn, int nbsp, int nolinebreaks);
@@ -298,6 +333,30 @@ int LoadIconDir(const char *DirName);
 const char *GetIconFilename(char *MimeType, size_t len);
 
 
+/* URL parsing & connection data */
+typedef struct ParsedURL ParsedURL;
+struct ParsedURL {
+       StrBuf *URL;
+       StrBuf *UrlWithoutCred;
+       StrBuf *CurlCreds;
+       unsigned Port;
+       const char *Host;
+       const char *User;
+       const char *Pass;
+       const char *LocalPart;
+       const char *PlainUrl;
+       int IsIP;
+       int IPv6;
+       int af;
+       struct hostent *HEnt;
+       struct sockaddr_in6 Addr;
+       ParsedURL *Next;
+};
+
+void FreeURL(ParsedURL** Url);
+int ParseURL(ParsedURL **Url, StrBuf *UrlStr, unsigned short DefaultPort);
+void CurlPrepareURL(ParsedURL *Url);
+
 /* tools */
 
 
@@ -326,7 +385,7 @@ const char *cmemreadlinelen(const char *start, char *buf, int maxlen, int *retle
 #define IsEmptyStr(a) ((a)[0] == '\0')
 #define num_parms(source)              num_tokens(source,(char)'|')
 int stripout(char *str, char leftboundary, char rightboundary);
-void stripallbut(char *str, char leftboundary, char rightboundary);
+long stripallbut(char *str, char leftboundary, char rightboundary);
 char *myfgets(char *s, int size, FILE *stream);
 void urlesc(char *outbuf, size_t oblen, char *strbuf);
 char *CtdlTempFileName(char *prefix1, int prefix2);
@@ -341,7 +400,7 @@ char *rfc2047encode(char *line, long length);
 int is_msg_in_mset(const char *mset, long msgnum);
 int pattern2(char *search, char *patn);
 void stripltlen(char *, int *);
-char *html_to_ascii(char *inputmsg, int msglen, int screenwidth, int do_citaformat);
+char *html_to_ascii(const char *inputmsg, int msglen, int screenwidth, int do_citaformat);
 void LoadEntityList(char *FileName);
 
 
@@ -389,15 +448,20 @@ typedef struct HashPos HashPos;
 typedef void (*DeleteHashDataFunc)(void * Data);
 typedef const char *(*PrintHashContent)(void * Data);
 typedef int (*CompareFunc)(const void* Item1, const void*Item2);
-typedef int (*HashFunc)(const char *Str, long Len);
+typedef long (*HashFunc)(const char *Str, long Len);
 typedef void (*TransitionFunc) (void *Item1, void *Item2, int Odd);
 typedef void (*PrintHashDataFunc) (const char *Key, void *Item, int Odd);
 
-int Flathash(const char *str, long len);
+long Flathash(const char *str, long len);
+long lFlathash(const char *str, long len);
 #define IKEY(a) (const char*) &a, sizeof(a)
+#define LKEY(a) (const char*) &a, sizeof(a)
+
+int TestValidateHash(HashList *TestHash);
 
 HashList *NewHash(int Uniq, HashFunc F);
 void DeleteHash(HashList **Hash);
+void DeleteHashContent(HashList **Hash);
 void HDeleteHash(void *vHash);
 int GetHash(HashList *Hash, const char *HKey, long HKLen, void **Data);
 void Put(HashList *Hash, const char *HKey, long HKLen, void *Data, DeleteHashDataFunc DeleteIt);
@@ -422,6 +486,10 @@ void SortByPayload(HashList *Hash, CompareFunc SortBy);
 void reference_free_handler(void *ptr);
 int HashLittle(const void *key, size_t length);
 
+typedef struct MSet MSet;
+int ParseMSet(MSet **MsetList, StrBuf *MSetStr);
+int IsInMSetList(MSet *MSetList, long MsgNo);
+void DeleteMSet(MSet **FreeMe);
 
 void convert_spaces_to_underscores(char *str);
 int CheckEncode(const char *pch, long len, const char *pche);
@@ -536,5 +604,13 @@ void WildFireSerializePayload(StrBuf *JsonBuffer, StrBuf *OutBuf, int *MsgCount,
 #define WF_STRUCTINDEX "1"
 #define WF_SUB "1"
 
+extern ConstStr RoomNetCfgStrs[maxRoomNetCfg];
+
+/* Convenience function to "perform a function and cut a log record if result != 0" */
+#define CtdlLogResult(x) if (x) syslog(LOG_CRIT, "%s:%d %s", __FILE__, __LINE__, strerror(errno))
+
+/* a nice consistent place to define how we turn a message id into a thread id hash */
+#define ThreadIdHash(Buf) abs(HashLittle(ChrPtr(Buf), StrLength(Buf)))
+
 
 #endif // LIBCITADEL_H