XMPP: add function to generate XML-Stanzas
[citadel.git] / citadel / modules / xmpp / serv_xmpp.c
index 1e0f704b4a7a75f9bf2a30a6ee67172c709aa689..96ffaf4f5b5a4f3847a5796e24186867f4a42681 100644 (file)
@@ -103,6 +103,96 @@ void XPrintf(const char *Format, ...)
 }
 
 
+void XPrint(const char *Token, long tlen,
+           int Flags,
+           ...)
+
+{
+       int BodySeen = 0;
+       int ArgType;
+       int Finished = 0;
+       char *PName;
+       long PLen;
+       char *Val;
+       long VLen;
+        va_list arg_ptr;
+
+       XPUT("<");
+       XPut(Token, tlen);
+
+        va_start(arg_ptr, Flags);
+       while (!Finished)
+       {
+               ArgType = va_arg(arg_ptr, int);
+               switch (ArgType)
+               {
+               case TYPE_STR:
+                       PName = va_arg(arg_ptr, char*);
+                       PLen  = va_arg(arg_ptr, long);
+                       Val   = va_arg(arg_ptr, char*);
+                       VLen  = va_arg(arg_ptr, long);
+                       XPUT(" ");
+                       XPut(PName, PLen);
+                       XPUT("=\"");
+                       XPutProp(Val, VLen);
+                       XPUT("\"");
+                       break;
+               case TYPE_OPTSTR:
+                       PName = va_arg(arg_ptr, char*);
+                       PLen  = va_arg(arg_ptr, long);
+                       Val   = va_arg(arg_ptr, char*);
+                       VLen  = va_arg(arg_ptr, long);
+                       if (VLen > 0)
+                       {
+                               XPUT(" ");
+                               XPut(PName, PLen);
+                               XPUT("=\"");
+                               XPutProp(Val, VLen);
+                               XPUT("\"");
+                       }
+                       break;
+               case TYPE_INT:
+                       PName = va_arg(arg_ptr, char*);
+                       PLen  = va_arg(arg_ptr, long);
+                       VLen  = va_arg(arg_ptr, long);
+                       XPUT(" ");
+                       XPut(PName, PLen);
+                       XPUT("=\"");
+                       XPrintf("%ld", VLen);
+                       XPUT("\"");
+                       break;
+               case TYPE_BODYSTR:
+                       BodySeen = 1;
+                       XPUT(">");
+                       Val   = va_arg(arg_ptr, char*);
+                       VLen  = va_arg(arg_ptr, long);
+                       XPutBody(Val, VLen);
+                       break;
+               case TYPE_ARGEND:
+                       Finished = 1;
+                       break;
+               }
+       }
+       if (Flags == XCLOSED)
+       {
+               if (BodySeen)
+               {
+                       XPUT("</");
+                       XPut(Token, tlen);
+                       XPUT(">");
+               }
+               else
+               {
+                       XPUT("></");
+                       XPut(Token, tlen);
+                       XPUT(">");
+               }
+       }
+       else
+               XPUT(">");
+       va_end(arg_ptr);
+}
+
 #ifdef HAVE_XML_STOPPARSER
 /* Stop the parser if an entity declaration is hit. */
 static void xmpp_entity_declaration(void *userData, const XML_Char *entityName,