Add macro to calculate a hash from a part of the message id
[citadel.git] / libcitadel / lib / libcitadel.h
index 00e84101870f5f2364c429f67d91204cab32c54b..366b8a62c8ce977ce0598403a32061f197867c6f 100644 (file)
@@ -28,7 +28,7 @@
 #include <sys/types.h>
 #include <netinet/in.h>
 
-#define LIBCITADEL_VERSION_NUMBER      829
+#define LIBCITADEL_VERSION_NUMBER      901
 
 /*
  * Here's a bunch of stupid magic to make the MIME parser portable.
@@ -108,7 +108,7 @@ typedef enum _room_views {
 #define BLOG_EUIDBUF_SIZE      40
 
 #ifndef IsEmptyStr
-#define IsEmptyStr(a) ((a)[0] == '\0')
+#define IsEmptyStr(a) ( ( (a) == NULL ) || ((a)[0] == '\0') )
 #endif
 
 
@@ -192,6 +192,7 @@ typedef struct _ConstStr {
 StrBuf* NewStrBuf(void);
 StrBuf* NewStrBufDup(const StrBuf *CopyMe);
 StrBuf* NewStrBufPlain(const char* ptr, int nChars);
+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);
@@ -346,9 +347,10 @@ typedef enum __eStreamType {
        eEmtyCodec
 } eStreamType;
 
-void *StrBufNewStreamContext(eStreamType type, const char **Err);
-int StrBufDestroyStreamContext(eStreamType type, void **Stream, const char **Err);
-int StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, const char* pIn, long pInLen, void *Stream, int LastChunk, const char **Err);
+typedef struct vStreamT vStreamT;
+vStreamT *StrBufNewStreamContext(eStreamType type, const char **Err);
+int StrBufDestroyStreamContext(eStreamType type, vStreamT **Stream, const char **Err);
+int StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, const char* pIn, long pInLen, vStreamT *Stream, int LastChunk, const char **Err);
 
 int StrBufDecodeBase64(StrBuf *Buf);
 int StrBufDecodeBase64To(const StrBuf *BufIn, StrBuf *BufOut);
@@ -444,7 +446,6 @@ char *memreadline(char *start, char *buf, int maxlen);
 char *memreadlinelen(char *start, char *buf, int maxlen, int *retlen);
 const char *cmemreadline(const char *start, char *buf, int maxlen);
 const char *cmemreadlinelen(const char *start, char *buf, int maxlen, int *retlen);
-#define IsEmptyStr(a) ((a)[0] == '\0')
 #define num_parms(source)              num_tokens(source,(char)'|')
 int stripout(char *str, char leftboundary, char rightboundary);
 long stripallbut(char *str, char leftboundary, char rightboundary);
@@ -483,7 +484,7 @@ struct vCard {
 
 
 struct vCard *vcard_new(void);
-void vcard_add_prop(struct vCard *v, char *propname, char *propvalue);
+void vcard_add_prop(struct vCard *v, const char *propname, const char *propvalue);
 struct vCard *vcard_load(char *vtext);
 struct vCard *VCardLoad(StrBuf *vbtext);
 
@@ -512,8 +513,9 @@ typedef const char *(*PrintHashContent)(void * Data);
 typedef int (*CompareFunc)(const void* Item1, const void*Item2);
 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);
+typedef const char* (*PrintHashDataFunc) (const char *Key, void *Item, int Odd);
 
+long FourHash(const char *key, long length);
 long Flathash(const char *str, long len);
 long lFlathash(const char *str, long len);
 #define IKEY(a) (const char*) &a, sizeof(a)
@@ -529,6 +531,7 @@ int GetHash(HashList *Hash, const char *HKey, long HKLen, void **Data);
 void Put(HashList *Hash, const char *HKey, long HKLen, void *Data, DeleteHashDataFunc DeleteIt);
 int GetKey(HashList *Hash, char *HKey, long HKLen, void **Data);
 int GetHashKeys(HashList *Hash, char ***List);
+const char *dbg_PrintStrBufPayload(const char *Key, void *Item, int Odd);
 int dbg_PrintHash(HashList *Hash, PrintHashContent first, PrintHashContent Second);
 int PrintHash(HashList *Hash, TransitionFunc Trans, PrintHashDataFunc PrintEntry);
 HashPos *GetNewHashPos(const HashList *Hash, int StepWidth);
@@ -674,6 +677,7 @@ extern ConstStr RoomNetCfgStrs[maxRoomNetCfg];
 
 /* 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)))
+#define ThreadIdHashOffset(Buf, Offset) abs(HashLittle(ChrPtr(Buf) + Offset, StrLength(Buf)-Offset))
 
 #ifdef __cplusplus
 extern "C" {
@@ -753,6 +757,7 @@ extern "C" {
 #define QR2_SUBJECTREQ 8               /* Subject strongly recommended */
 #define QR2_SMTP_PUBLIC        16              /* Listservice Subscribers may post */
 #define QR2_MODERATED  32              /* Listservice aide has to permit posts  */
+#define QR2_NOUPLMSG   64              /* If a file  is uploaded, no message will be posted.  */
 
 #define US_NEEDVALID   1               /* User needs to be validated       */
 #define US_EXTEDIT     2               /* Always use external editor       */