* --pedantic cleanup.
[citadel.git] / webcit / serv_func.c
index a5604c2257fa1c93bf36b733a68ab3a804720b0c..00b30479893f3de601944921a5d9fbe713f92138 100644 (file)
@@ -6,7 +6,6 @@
 #include "webserver.h"
 
 struct serv_info serv_info; /**< our connection data to the server */
-HashList *ServHash = NULL;//// TODO;
 /*
  * get info about the server we've connected to
  *
@@ -106,16 +105,21 @@ void get_serv_info(char *browser_host, char *user_agent)
 
 
 /**
- * \brief Read Citadel variformat text and spit it out as HTML.
- * \param align html align string
+ *  Read Citadel variformat text and spit it out as HTML.
+ *  align html align string
  */
-void fmout(char *align)
+inline void fmout(char *align)
+{
+       _fmout(WC->WBuf, align);
+}
+
+void _fmout(StrBuf *Target, char *align)
 {
        int intext = 0;
        int bq = 0;
        char buf[SIZ];
 
-       wprintf("<div align=%s>\n", align);
+       StrBufAppendPrintf(Target, "<div align=%s>\n", align);
        while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
 
                if ((intext == 1) && (isspace(buf[0]))) {
@@ -129,10 +133,10 @@ void fmout(char *align)
                 * " >" quotes and will convert to <BLOCKQUOTE> tags.
                 */
                if ((bq == 0) && (!strncmp(buf, " >", 2))) {
-                       wprintf("<BLOCKQUOTE>");
+                       StrBufAppendBufPlain(Target, HKEY("<BLOCKQUOTE>"), 0);
                        bq = 1;
                } else if ((bq == 1) && (strncmp(buf, " >", 2))) {
-                       wprintf("</BLOCKQUOTE>");
+                       StrBufAppendBufPlain(Target, HKEY("</BLOCKQUOTE>"), 0);
                        bq = 0;
                }
                if ((bq == 1) && (!strncmp(buf, " >", 2))) {
@@ -141,8 +145,8 @@ void fmout(char *align)
                /** Activate embedded URL's */
                url(buf, sizeof(buf));
 
-               escputs(buf);
-               wprintf("\n");
+               escputs(buf);/*/ TODO: Target */
+               StrBufAppendBufPlain(Target, HKEY("\n"), 0);
        }
        if (bq == 1) {
                wprintf("</I>");
@@ -150,11 +154,79 @@ void fmout(char *align)
        wprintf("</div><br />\n");
 }
 
+void FmOut(StrBuf *Target, char *align, StrBuf *Source)
+{
+       const char *ptr, *pte;
+       const char *BufPtr = NULL;
+       StrBuf *Line = NewStrBuf();
+       StrBuf *Line1 = NewStrBuf();
+       StrBuf *Line2 = NewStrBuf();
+       int bn = 0;
+       int bq = 0;
+       int i, n, done = 0;
+       long len;
+       int intext = 0;
+
+       StrBufAppendPrintf(Target, "<div align=\"%s\">\n", align);
+       while ((n = StrBufSipLine(Line, Source, &BufPtr), n >= 0) && !done)
+       {
+               done = n == 0;
+               bq = 0;
+               i = 0;
+               ptr = ChrPtr(Line);
+               len = StrLength(Line);
+               pte = ptr + len;
+
+               if ((intext == 1) && (isspace(*ptr))) {
+                       StrBufAppendBufPlain(Target, HKEY("<br />"), 0);
+               }
+               intext = 1;
+               if (isspace(*ptr)) while ((ptr < pte) &&
+                      ((*ptr == '>') ||
+                       isspace(*ptr)))
+               {
+                       if (*ptr == '>')
+                               bq++;
+                       ptr ++;
+                       i++;
+               }
+
+               /**
+                * Quoted text should be displayed in italics and in a
+                * different colour.  This code understands Citadel-style
+                * " >" quotes and will convert to <BLOCKQUOTE> tags.
+                */
+               if (i > 0) StrBufCutLeft(Line, i);
+               
+
+               for (i = bn; i < bq; i++)                               
+                       StrBufAppendBufPlain(Target, HKEY("<blockquote>"), 0);
+               for (i = bq; i < bn; i++)                               
+                       StrBufAppendBufPlain(Target, HKEY("</blockquote>"), 0);
+               bn = bq;
+
+               if (StrLength(Line) == 0)
+                       continue;
+               /** Activate embedded URL's */
+               UrlizeText(Line1, Line, Line2);
+
+               StrEscAppend(Target, Line1, NULL, 0, 0);
+
+               StrBufAppendBufPlain(Target, HKEY("\n"), 0);
+       }
+       for (i = 0; i < bn; i++)                                
+               StrBufAppendBufPlain(Target, HKEY("</blockquote>"), 0);
+       StrBufAppendBufPlain(Target, HKEY("</div><br />\n"), 0);
+       FreeStrBuf(&Line);
+       FreeStrBuf(&Line1);
+       FreeStrBuf(&Line2);
+}
+
 
 
 
 /**
- * \brief Read Citadel variformat text and spit it out as HTML in a form
+ *  Read Citadel variformat text and spit it out as HTML in a form
  * suitable for embedding in another message (forward/quote).
  * (NO LINEBREAKS ALLOWED HERE!)
  */
@@ -197,9 +269,9 @@ void pullquote_fmout(void) {
 
 
 /**
- * \brief Transmit message text (in memory) to the server.
+ *  Transmit message text (in memory) to the server.
  *
- * \param ptr Pointer to the message being transmitted
+ *  ptr Pointer to the message being transmitted
  */
 void text_to_server(char *ptr)
 {
@@ -240,10 +312,10 @@ void text_to_server(char *ptr)
 
 
 /**
- * \brief Transmit message text (in memory) to the server,
+ *  Transmit message text (in memory) to the server,
  *        converting to Quoted-Printable encoding as we go.
  *
- * \param ptr Pointer to the message being transmitted
+ *  ptr Pointer to the message being transmitted
  */
 void text_to_server_qp(char *ptr)
 {
@@ -316,7 +388,7 @@ void text_to_server_qp(char *ptr)
 
 
 /**
- * \brief translate server message output to text
+ *  translate server message output to text
  * (used for editing room info files and such)
  */
 void server_to_text()
@@ -341,24 +413,25 @@ void server_to_text()
  * server READ commands.
  * \return the read content as StrBuf
  */
-StrBuf *read_server_binary(size_t total_len) 
+int read_server_binary(StrBuf *Ret, size_t total_len) 
 {
        char buf[SIZ];
        size_t bytes = 0;
        size_t thisblock = 0;
        StrBuf *Buf;
-       StrBuf *Ret = NULL;
-
-       Buf = NewStrBuf();
        
+       Buf = NewStrBuf();
+       if (Ret == NULL)
+           return -1;
+
        while (bytes < total_len) {
                thisblock = 4095;
                if ((total_len - bytes) < thisblock) {
                        thisblock = total_len - bytes;
                        if (thisblock == 0) {
-                               FreeStrBuf(&Ret); 
+                               FlushStrBuf(Ret); 
                                FreeStrBuf(&Buf);
-                               return NULL
+                               return -1
                        }
                }
                serv_printf("READ %d|%d", (int)bytes, (int)thisblock);
@@ -366,56 +439,173 @@ StrBuf *read_server_binary(size_t total_len)
                {
                    if (ChrPtr(Buf)[0] == '6')
                    {
-                           StrBufCutLeft(Buf, 4); //thisblock = (size_t)atoi(&buf[4]);
+                           StrBufCutLeft(Buf, 4); /*/ TODO : thisblock = (size_t)atoi(&buf[4]); */
                            thisblock = StrTol(Buf);
                            if (!WC->connected) {
-                                   FreeStrBuf(&Ret);
+                                   FlushStrBuf(Ret); 
                                    FreeStrBuf(&Buf); 
-                                   return NULL
+                                   return -1
                            }
-                           if (Ret == NULL) Ret = NewStrBuf();
                            StrBuf_ServGetBLOB(Ret, thisblock);
                            bytes += thisblock;
                    }
                    else {
                            FreeStrBuf(&Buf);
                            lprintf(3, "Error: %s\n", &buf[4]);
-                           return NULL;
+                           return -1;
                    }
                }
        }
-       return Ret;
+       FreeStrBuf(&Buf);
+       return StrLength(Ret);
 }
 
 
 /**
- * \brief Read text from server, appending to a string buffer until the
+ *  Read text from server, appending to a string buffer until the
  * usual 000 terminator is found.  Caller is responsible for freeing
  * the returned pointer.
  */
-StrBuf *read_server_text(long *nLines)
+int read_server_text(StrBuf *Buf, long *nLines)
 {
-       struct wcsession *WCC = WC;
-       StrBuf *Buf;
+       wcsession *WCC = WC;
        long nRead;
+       long nTotal = 0;
        long nlines;
-       const char *buf;
        
-       Buf = NewStrBuf();
-       buf = ChrPtr(Buf);
        nlines = 0;
        while ((WCC->serv_sock!=-1) &&
-              (nRead = StrBuf_ServGetln(Buf)), 
-              (nRead >= 0) && 
-              (buf += nRead), (strcmp(buf, "000") != 0)) {
-               
+              (nRead = StrBuf_ServGetln(Buf), (nRead >= 0) ))
+       {
+               if (strcmp(ChrPtr(Buf) + nTotal, "000") != 0) {
+                       StrBufCutRight(Buf, nRead);
+                       break;
+               }
+               nTotal += nRead;
                nlines ++;
        }
 
        *nLines = nlines;
-       return Buf;
+       return nTotal;
+}
+
+
+
+
+
+
+int GetServerStatus(StrBuf *Line, long* FullState)
+{
+       if (FullState != NULL)
+               *FullState = StrTol(Line);
+       return ChrPtr(Line)[0] - 48;
 }
 
 
+void tmplput_serv_ip(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+       StrBufAppendPrintf(Target, "%d", WC->ctdl_pid);
+}
+
+void tmplput_serv_nodename(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+       StrEscAppend(Target, NULL, serv_info.serv_nodename, 0, 0);
+}
+
+void tmplput_serv_humannode(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+       StrEscAppend(Target, NULL, serv_info.serv_humannode, 0, 0);
+}
+
+void tmplput_serv_fqdn(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+       StrEscAppend(Target, NULL, serv_info.serv_fqdn, 0, 0);
+}
+
+void tmplput_serv_software(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+       StrEscAppend(Target, NULL, serv_info.serv_software, 0, 0);
+}
+
+void tmplput_serv_rev_level(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+       StrBufAppendPrintf(Target, "%d.%02d",
+                           serv_info.serv_rev_level / 100,
+                           serv_info.serv_rev_level % 100);
+}
+int conditional_serv_newuser_disabled(WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+       return serv_info.serv_newuser_disabled != 0;
+}
+int conditional_serv_supports_openid(WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+       return serv_info.serv_supports_openid != 0;
+}
+
+void tmplput_serv_bbs_city(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+       StrEscAppend(Target, NULL, serv_info.serv_bbs_city, 0, 0);
+}
+
+void tmplput_current_user(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+       StrEscAppend(Target, NULL, WC->wc_fullname, 0, 0);
+}
+
+void tmplput_current_room(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+       StrEscAppend(Target, NULL, WC->wc_roomname, 0, 0);
+}
+
+
+void tmplput_mesg(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+       int n = 0;
+       int Done = 0;
+       StrBuf *Line;
+       StrBuf *Buf;
+
+       Buf = NewStrBuf();
+       Line = NewStrBuf();
+       serv_printf("MESG %s", Tokens->Params[0]->Start);
+       StrBuf_ServGetln(Line);
+       while (!Done &&  (StrBuf_ServGetln(Line)>=0)) {
+               if ( (StrLength(Line)==3) && 
+                   !strcmp(ChrPtr(Line), "000")) 
+                       Done = 1;
+               else
+               {
+                       if (n > 0)
+                               StrBufAppendBufPlain(Buf, "\n", 1, 0);
+                       StrBufAppendBuf(Buf, Line, 0);
+               }
+               n++;
+       }
+       FlushStrBuf(Line);
+       FmOut(Line, "center", Buf);
+       StrBufAppendTemplate(Target, nArgs, Tokens, Context, ContextType, Line, 1);
+       FreeStrBuf(&Buf);
+       FreeStrBuf(&Line);
+}
+
+void 
+InitModule_SERVFUNC
+(void)
+{
+
+       RegisterConditional(HKEY("COND:SERV:OPENID"), 2, conditional_serv_supports_openid, CTX_NONE);
+       RegisterConditional(HKEY("COND:SERV:NEWU"), 2, conditional_serv_newuser_disabled, CTX_NONE);
+       RegisterNamespace("CURRENT_USER", 0, 0, tmplput_current_user, CTX_NONE);
+       RegisterNamespace("CURRENT_ROOM", 0, 0, tmplput_current_room, CTX_NONE);
+       RegisterNamespace("SERV:PID", 0, 0, tmplput_serv_ip, CTX_NONE);
+       RegisterNamespace("SERV:NODENAME", 0, 0, tmplput_serv_nodename, CTX_NONE);
+       RegisterNamespace("SERV:HUMANNODE", 0, 0, tmplput_serv_humannode, CTX_NONE);
+       RegisterNamespace("SERV:FQDN", 0, 0, tmplput_serv_fqdn, CTX_NONE);
+       RegisterNamespace("SERV:SOFTWARE", 0, 0, tmplput_serv_software, CTX_NONE);
+       RegisterNamespace("SERV:REV_LEVEL", 0, 0, tmplput_serv_rev_level, CTX_NONE);
+       RegisterNamespace("SERV:BBS_CITY", 0, 0, tmplput_serv_bbs_city, CTX_NONE);
+       RegisterNamespace("SERV:MESG", 1, 2, tmplput_mesg, CTX_NONE);
+/*TODO //      RegisterNamespace("SERV:LDAP_SUPP", 0, 0, tmplput_serv_ldap_enabled, 0); */
+}
 
 /*@}*/