773 snprintf(prefix, 8, "x%d", pfxnum++); |
773 snprintf(prefix, 8, "x%d", pfxnum++); |
774 ucx_map_cstr_put(namespaces, p->ns->name, strdup(prefix)); |
774 ucx_map_cstr_put(namespaces, p->ns->name, strdup(prefix)); |
775 } |
775 } |
776 } |
776 } |
777 |
777 |
778 s = S("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"); |
778 s = SC("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"); |
779 ucx_buffer_write(s.ptr, 1, s.length, buf); |
779 ucx_buffer_write(s.ptr, 1, s.length, buf); |
780 |
780 |
781 // write root element and namespaces |
781 // write root element and namespaces |
782 s = S("<D:propertyupdate xmlns:D=\"DAV:\""); |
782 s = SC("<D:propertyupdate xmlns:D=\"DAV:\""); |
783 ucx_buffer_write(s.ptr, 1, s.length, buf); |
783 ucx_buffer_write(s.ptr, 1, s.length, buf); |
784 UcxMapIterator mapi = ucx_map_iterator(namespaces); |
784 UcxMapIterator mapi = ucx_map_iterator(namespaces); |
785 UcxKey key; |
785 UcxKey key; |
786 char *pfxval; |
786 char *pfxval; |
787 UCX_MAP_FOREACH(key, pfxval, mapi) { |
787 UCX_MAP_FOREACH(key, pfxval, mapi) { |
788 s = S(" xmlns:"); |
788 s = SC(" xmlns:"); |
789 ucx_buffer_write(s.ptr, 1, s.length, buf); |
789 ucx_buffer_write(s.ptr, 1, s.length, buf); |
790 s = sstr(pfxval); |
790 s = scstr(pfxval); |
791 ucx_buffer_write(s.ptr, 1, s.length, buf); |
791 ucx_buffer_write(s.ptr, 1, s.length, buf); |
792 s = S("=\""); |
792 s = SC("=\""); |
793 ucx_buffer_write(s.ptr, 1, s.length, buf); |
793 ucx_buffer_write(s.ptr, 1, s.length, buf); |
794 s = sstrn(key.data, key.len); |
794 s = scstrn(key.data, key.len); |
795 ucx_buffer_write(s.ptr, 1, s.length, buf); |
795 ucx_buffer_write(s.ptr, 1, s.length, buf); |
796 s = S("\""); |
796 s = SC("\""); |
797 ucx_buffer_write(s.ptr, 1, s.length, buf); |
797 ucx_buffer_write(s.ptr, 1, s.length, buf); |
798 } |
798 } |
799 s = S(">\n"); |
799 s = SC(">\n"); |
800 ucx_buffer_write(s.ptr, 1, s.length, buf); |
800 ucx_buffer_write(s.ptr, 1, s.length, buf); |
801 |
801 |
802 if(data->set) { |
802 if(data->set) { |
803 s = S("<D:set>\n<D:prop>\n"); |
803 s = SC("<D:set>\n<D:prop>\n"); |
804 ucx_buffer_write(s.ptr, 1, s.length, buf); |
804 ucx_buffer_write(s.ptr, 1, s.length, buf); |
805 UCX_FOREACH(elm, data->set) { |
805 UCX_FOREACH(elm, data->set) { |
806 DavProperty *property = elm->data; |
806 DavProperty *property = elm->data; |
807 char *prefix = ucx_map_cstr_get(namespaces, property->ns->name); |
807 char *prefix = ucx_map_cstr_get(namespaces, property->ns->name); |
808 if(!prefix) { |
808 if(!prefix) { |
809 prefix = "D"; |
809 prefix = "D"; |
810 } |
810 } |
811 |
811 |
812 // begin tag |
812 // begin tag |
813 s = S("<"); |
813 s = SC("<"); |
814 ucx_buffer_write(s.ptr, 1, s.length, buf); |
814 ucx_buffer_write(s.ptr, 1, s.length, buf); |
815 s = sstr(prefix); |
815 s = scstr(prefix); |
816 ucx_buffer_write(s.ptr, 1, s.length, buf); |
816 ucx_buffer_write(s.ptr, 1, s.length, buf); |
817 s = S(":"); |
817 s = SC(":"); |
818 ucx_buffer_write(s.ptr, 1, s.length, buf); |
818 ucx_buffer_write(s.ptr, 1, s.length, buf); |
819 s = sstr(property->name); |
819 s = scstr(property->name); |
820 ucx_buffer_write(s.ptr, 1, s.length, buf); |
820 ucx_buffer_write(s.ptr, 1, s.length, buf); |
821 s = S(">"); |
821 s = SC(">"); |
822 ucx_buffer_write(s.ptr, 1, s.length, buf); |
822 ucx_buffer_write(s.ptr, 1, s.length, buf); |
823 |
823 |
824 // content |
824 // content |
825 DavXmlNode *content = property->value; |
825 DavXmlNode *content = property->value; |
826 if(content->type == DAV_XML_TEXT && !content->next) { |
826 if(content->type == DAV_XML_TEXT && !content->next) { |
828 } else { |
828 } else { |
829 dav_print_node(buf, (write_func)ucx_buffer_write, namespaces, content); |
829 dav_print_node(buf, (write_func)ucx_buffer_write, namespaces, content); |
830 } |
830 } |
831 |
831 |
832 // end tag |
832 // end tag |
833 s = S("</"); |
833 s = SC("</"); |
834 ucx_buffer_write(s.ptr, 1, s.length, buf); |
834 ucx_buffer_write(s.ptr, 1, s.length, buf); |
835 s = sstr(prefix); |
835 s = scstr(prefix); |
836 ucx_buffer_write(s.ptr, 1, s.length, buf); |
836 ucx_buffer_write(s.ptr, 1, s.length, buf); |
837 s = S(":"); |
837 s = SC(":"); |
838 ucx_buffer_write(s.ptr, 1, s.length, buf); |
838 ucx_buffer_write(s.ptr, 1, s.length, buf); |
839 s = sstr(property->name); |
839 s = scstr(property->name); |
840 ucx_buffer_write(s.ptr, 1, s.length, buf); |
840 ucx_buffer_write(s.ptr, 1, s.length, buf); |
841 s = S(">\n"); |
841 s = SC(">\n"); |
842 ucx_buffer_write(s.ptr, 1, s.length, buf); |
842 ucx_buffer_write(s.ptr, 1, s.length, buf); |
843 } |
843 } |
844 s = S("</D:prop>\n</D:set>\n"); |
844 s = SC("</D:prop>\n</D:set>\n"); |
845 ucx_buffer_write(s.ptr, 1, s.length, buf); |
845 ucx_buffer_write(s.ptr, 1, s.length, buf); |
846 } |
846 } |
847 if(data->remove) { |
847 if(data->remove) { |
848 s = S("<D:remove>\n<D:prop>\n"); |
848 s = SC("<D:remove>\n<D:prop>\n"); |
849 ucx_buffer_write(s.ptr, 1, s.length, buf); |
849 ucx_buffer_write(s.ptr, 1, s.length, buf); |
850 UCX_FOREACH(elm, data->remove) { |
850 UCX_FOREACH(elm, data->remove) { |
851 DavProperty *property = elm->data; |
851 DavProperty *property = elm->data; |
852 char *prefix = ucx_map_cstr_get(namespaces, property->ns->name); |
852 char *prefix = ucx_map_cstr_get(namespaces, property->ns->name); |
853 |
853 |
854 s = S("<"); |
854 s = SC("<"); |
855 ucx_buffer_write(s.ptr, 1, s.length, buf); |
855 ucx_buffer_write(s.ptr, 1, s.length, buf); |
856 s = sstr(prefix); |
856 s = scstr(prefix); |
857 ucx_buffer_write(s.ptr, 1, s.length, buf); |
857 ucx_buffer_write(s.ptr, 1, s.length, buf); |
858 s = S(":"); |
858 s = SC(":"); |
859 ucx_buffer_write(s.ptr, 1, s.length, buf); |
859 ucx_buffer_write(s.ptr, 1, s.length, buf); |
860 s = sstr(property->name); |
860 s = scstr(property->name); |
861 ucx_buffer_write(s.ptr, 1, s.length, buf); |
861 ucx_buffer_write(s.ptr, 1, s.length, buf); |
862 s = S(" />\n"); |
862 s = SC(" />\n"); |
863 ucx_buffer_write(s.ptr, 1, s.length, buf); |
863 ucx_buffer_write(s.ptr, 1, s.length, buf); |
864 } |
864 } |
865 s = S("</D:prop>\n</D:remove>\n"); |
865 s = SC("</D:prop>\n</D:remove>\n"); |
866 ucx_buffer_write(s.ptr, 1, s.length, buf); |
866 ucx_buffer_write(s.ptr, 1, s.length, buf); |
867 } |
867 } |
868 |
868 |
869 s = S("</D:propertyupdate>\n"); |
869 s = SC("</D:propertyupdate>\n"); |
870 ucx_buffer_write(s.ptr, 1, s.length, buf); |
870 ucx_buffer_write(s.ptr, 1, s.length, buf); |
871 |
871 |
872 // cleanup namespace map |
872 // cleanup namespace map |
873 ucx_map_free_content(namespaces, free); |
873 ucx_map_free_content(namespaces, free); |
874 ucx_map_free(namespaces); |
874 ucx_map_free(namespaces); |
875 |
875 |
876 return buf; |
876 return buf; |
877 } |
877 } |
878 |
878 |
879 UcxBuffer* create_crypto_proppatch_request(DavSession *sn, DavKey *key, char *name, char *hash) { |
879 UcxBuffer* create_crypto_proppatch_request(DavSession *sn, DavKey *key, const char *name, const char *hash) { |
880 UcxBuffer *buf = ucx_buffer_new(NULL, 512, UCX_BUFFER_AUTOEXTEND); |
880 UcxBuffer *buf = ucx_buffer_new(NULL, 512, UCX_BUFFER_AUTOEXTEND); |
881 sstr_t s; |
881 sstr_t s; |
882 |
882 |
883 s = S("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"); |
883 s = S("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"); |
884 ucx_buffer_write(s.ptr, 1, s.length, buf); |
884 ucx_buffer_write(s.ptr, 1, s.length, buf); |