Rename StrBufRFC2047encodeMessage() to StrBufQuotedPrintableEncode()
[citadel.git] / libcitadel / lib / libcitadel.h
index a360adf27ca41755531e491eca5a73bb735b87d5..cb59c485c971b0a14edd2a6fc4e1824dc7f2f764 100644 (file)
@@ -1,23 +1,14 @@
-/*
- * Header file for libcitadel
- *
- * Copyright (c) 1987-2017 by the citadel.org team
- *
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3.
- *
- * 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.
- */
-
-
-/* protect against double includes */
+// Header file for libcitadel
+//
+// Copyright (c) 1987-2022 by the citadel.org team
+//
+// This program is open source software.  Use, duplication, or disclosure
+// is subject to the terms of the GNU General Public License, version 3.
+
+// protect against double includes
 #ifndef LIBCITADEL_H
 #define LIBCITADEL_H
 
-
 /*
  * since we reference time_t...
  */
@@ -28,7 +19,7 @@
 #include <sys/types.h>
 #include <netinet/in.h>
 
-#define LIBCITADEL_VERSION_NUMBER      904
+#define LIBCITADEL_VERSION_NUMBER 972
 
 /*
  * Here's a bunch of stupid magic to make the MIME parser portable.
@@ -37,7 +28,6 @@
 #define SIZ    4096
 #endif
 
-
 typedef enum AXLevel {
        AxDeleted = 0,
        AxNewU = 1,
@@ -100,7 +90,6 @@ typedef enum _room_views {
        VIEW_DRAFTS             = 9,    /* Drafts view */
        VIEW_BLOG               = 10,   /* Blog view */
        VIEW_QUEUE              = 11,   /* SMTP/... QUEUE rooms */
-       VIEW_WIKIMD             = 12,   /* Markdown Wiki view */
        VIEW_MAX,
        VIEW_JSON_LIST,
 } ROOM_VIEWS;
@@ -123,7 +112,6 @@ extern const char *StrBufNOTNULL;
 
 char *libcitadel_version_string(void);
 int libcitadel_version_number(void);
-void StartLibCitadel(size_t basesize);
 void ShutDownLibCitadel(void);
 
 /*
@@ -152,9 +140,8 @@ void mime_parser(char *content_start, char *content_end,
                 void *userdata,
                 int dont_decode);
 
-
-
 char *fixed_partnum(char *);
+
 void mime_decode(char *partnum,
                 char *part_start, size_t length,
                 char *content_type, char *charset, char *encoding,
@@ -166,11 +153,13 @@ 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,
@@ -196,7 +185,6 @@ void SwapBuffers(StrBuf *A, StrBuf *B);
 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);
 #define NewConstStrBuf(a) _NewConstStrBuf(a, sizeof(a))
@@ -205,14 +193,12 @@ char *SmashStrBuf (StrBuf **SmashMe);
 void HFreeStrBuf (void *VFreeMe);
 int FlushStrBuf(StrBuf *buf);
 int FLUSHStrBuf(StrBuf *buf); /* expensive but doesn't leave content behind for others to find in case of errors */
-
 const char *ChrPtr(const StrBuf *Str);
 int StrLength(const StrBuf *Str);
 #define SKEY(a) ChrPtr(a), StrLength(a)
 void StrBufAsciify(StrBuf *Buf, const char repl);
 long StrBufPeek(StrBuf *Buf, const char* ptr, long nThChar, char PeekValue);
 long StrBufPook(StrBuf *Buf, const char* ptr, long nThChar, long nChars, char PookValue);
-
 int StrBufTCP_read_line(StrBuf *buf, int *fd, int append, const char **Error);
 int StrBufReadBLOB(StrBuf *Buf, int *fd, int append, long nBytes, const char **Error);
 #define NNN_TERM 1
@@ -254,28 +240,6 @@ typedef struct _file_buffer {
        int nBlobBytesWanted;
 } IOBuffer;
 
-
-typedef struct __fd_iobuffer {
-       IOBuffer *IOB;
-       int OtherFD;
-       int SplicePipe[2];
-       int PipeSize;
-       long TotalSendSize;
-       loff_t TotalSentAlready;
-       loff_t TotalReadAlready;
-       long ChunkSize;
-       long ChunkSendRemain;
-       StrBuf *ChunkBuffer; /* just used if we don't have sendfile */
-} FDIOBuffer;
-
-
-void FDIOBufferInit(FDIOBuffer *FDB, IOBuffer *IO, int FD, long TotalSendSize);
-void FDIOBufferDelete(FDIOBuffer *FDB);
-int FileSendChunked(FDIOBuffer *FDB, const char **Err);
-int FileRecvChunked(FDIOBuffer *FDB, const char **Err);
-int FileMoveChunked(FDIOBuffer *FDB, const char **Err);
-eReadState WriteIOBAlreadyRead(FDIOBuffer *FDB, const char **Error);
-
 long StrBuf_read_one_chunk_callback (int fd, short event, IOBuffer *FB);
 int StrBuf_write_one_chunk_callback(int fd, short event, IOBuffer *FB);
 
@@ -340,8 +304,8 @@ void StrBuf_RFC822_2_Utf8(StrBuf *Target,
 void StrBuf_RFC822_to_Utf8(StrBuf *Target, const StrBuf *DecodeMe, const StrBuf* DefaultCharset, StrBuf *FoundCharset);
 
 typedef enum __eStreamType {
-       eBase64Encode,
-       eBase64Decode,
+       //eBase64Encode,
+       //eBase64Decode,
        eZLibEncode,
        eZLibDecode,
        eEmtyCodec
@@ -356,7 +320,7 @@ int StrBufDecodeBase64(StrBuf *Buf);
 void StrBufDecodeQP(StrBuf *Buf);
 int StrBufDecodeBase64To(const StrBuf *BufIn, StrBuf *BufOut);
 int StrBufDecodeHex(StrBuf *Buf);
-StrBuf *StrBufRFC2047encodeMessage(const StrBuf *EncodeMe);
+StrBuf *StrBufQuotedPrintableEncode(const StrBuf *EncodeMe);
 int StrBufRFC2047encode(StrBuf **target, const StrBuf *source);
 StrBuf *StrBufSanitizeEmailRecipientVector(const StrBuf *Recp, 
                                           StrBuf *UserName, 
@@ -434,11 +398,15 @@ long extract_long (const char *source, int parmnum);
 unsigned long extract_unsigned_long(const char *source, int parmnum);
 void CtdlInitBase64Table(void);
 size_t CtdlEncodeBase64(char *dest, const char *source, size_t sourcelen, int linebreaks);
-int CtdlDecodeBase64(char *dest, const char *source, size_t length);
+enum {
+       BASE64_NO_LINEBREAKS = 0,
+       BASE64_YES_LINEBREAKS = 1
+};
+size_t CtdlDecodeBase64(char *dest, const char *source, size_t length);
 unsigned int decode_hex(char *Source);
 int CtdlDecodeQuotedPrintable(char *decoded, char *encoded, int sourcelen);
 void StripSlashes(char *Dir, int TrailingSlash);
-size_t striplt(char *);
+size_t string_trim(char *);
 int haschar(const char *st, int ch);
 void remove_token(char *source, int parmnum, char separator);
 int is_msg_in_sequence_set(const char *mset, long msgnum);
@@ -462,10 +430,26 @@ void CtdlMakeTempFileName(char *name, int len);
 char *rfc2047encode(const 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(const char *inputmsg, int msglen, int screenwidth, int do_citaformat);
+void string_trimlen(char *, int *);
+char *html_to_ascii(const char *inputmsg, int msglen, int screenwidth, int ansi);
 void LoadEntityList(char *FileName);
+void utf8ify_rfc822_string(char *buf);
+
 
+typedef struct {
+       void *the_elements;
+       size_t element_size;
+       int num_elements;
+       int num_alloc;
+} Array;
+
+Array *array_new(size_t element_size);
+void array_free(Array *arr);
+void array_append(Array *arr, void *new_element);
+void *array_get_element_at(Array *arr, int index);
+int array_len(Array *arr);
+void array_sort(Array *arr, int (*compar)(const void *, const void *));
+void array_delete_element_at(Array *arr, int index);
 
 
 /* vCard stuff */
@@ -613,7 +597,11 @@ JsonValue *NewJsonNumber(const char *Key, long keylen, long Number);
 
 JsonValue *NewJsonBigNumber(const char *Key, long keylen, double Number);
 
-JsonValue *NewJsonString(const char *Key, long keylen, StrBuf *CopyMe);
+enum {
+       NEWJSONSTRING_COPYBUF,          // make a copy of the StrBuf, source is left alone
+       NEWJSONSTRING_SMASHBUF          // smash the source StrBuf, the json object now owns that memory
+};
+JsonValue *NewJsonString(const char *Key, long keylen, StrBuf *CopyMe, int copy_or_smash);
 
 JsonValue *NewJsonPlainString(const char *Key, long keylen, const char *CopyMe, long len);
 
@@ -628,12 +616,7 @@ void JsonObjectAppend(JsonValue *Array, JsonValue *Val);
 void SerializeJson(StrBuf *Target, JsonValue *Val, int FreeVal);
 
 
-
-/*
- * Citadels Wildfire implementation, see 
- * http://www.firephp.org/Wiki/Reference/Protocol
- * and http://wildfirehq.org/ for details
- */
+/* the following declarations are leftover from the defunct wildfire implementation. can we remove them? */
 typedef void (*AddHeaderFunc)(const char *HdrName, const char *HdrValue);
 
 typedef enum _WF_MessageType {
@@ -687,8 +670,9 @@ extern "C" {
 #define CFG_SMTP_FROM_NOFILTER 1
 #define CFG_SMTP_FROM_CORRECT 2
 #define CFG_SMTP_FROM_REJECT 3
+
 /*
- * MIME types used in Citadel for configuration stuff
+ * object types used in Citadel for configuration stuff (some of these are obsolete)
  */
 #define SPOOLMIME      "application/x-citadel-delivery-list"
 #define        INTERNETCFG     "application/x-citadel-internet-config"
@@ -697,7 +681,7 @@ extern "C" {
 #define FILTERLIST     "application/x-citadel-filter-list"
 #define SIEVECONFIG    "application/x-citadel-sieve-config"
 #define XMPPMORTUARY   "application/x-citadel-xmpp-mortuary"
-#define INTERNETCFG     "application/x-citadel-internet-config"
+#define GLOBAL_ALIASES "global_alias_table"
 
 #define FILE_MAILALIAS       "__MAIL_ALIAS__"