X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/ab7d7f3c0cad5145d6e171ff29b8443bd34706cc..965b0358c04c725c8bab582b704a878b4279f6a6:/packages/excorporate/excorporate.el diff --git a/packages/excorporate/excorporate.el b/packages/excorporate/excorporate.el index 69585d69a..34984ef39 100644 --- a/packages/excorporate/excorporate.el +++ b/packages/excorporate/excorporate.el @@ -5,10 +5,10 @@ ;; Author: Thomas Fitzsimmons ;; Maintainer: Thomas Fitzsimmons ;; Created: 2014-09-19 -;; Version: 0.7.1 +;; Version: 0.7.3 ;; Keywords: calendar ;; Homepage: https://www.fitzsim.org/blog/ -;; Package-Requires: ((emacs "24.1") (fsm "0.2") (soap-client "3.0.2") (url-http-ntlm "2.0.2")) +;; Package-Requires: ((emacs "24.1") (fsm "0.2") (soap-client "3.1.1") (url-http-ntlm "2.0.2")) ;; This program is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by @@ -96,6 +96,9 @@ ;; Wilfred Hughes tested on Exchange 2007 and ;; suggested documentation improvements. +;; Erik Hetzner tested on Office 365 and helped debug +;; Office 365 support. + ;;; Code: ;; Implementation-visible functions and variables. @@ -451,8 +454,10 @@ the FSM should transition to on success." (:unrecoverable-error (list :shutting-down-on-error state-data nil)) (:retrieve-xml - (let ((service-url (plist-get state-data :service-url))) - (url-retrieve (concat service-url "?wsdl") + (let* ((service-url (plist-get state-data :service-url)) + (wsdl-url (replace-regexp-in-string "/[^/]*$" "/Services.wsdl" + service-url))) + (url-retrieve wsdl-url (lambda (status) (let ((data-buffer (current-buffer))) (unwind-protect @@ -460,7 +465,7 @@ the FSM should transition to on success." (progn (plist-put state-data :failure-message (format "Failed to retrieve %s" - service-url)) + wsdl-url)) (fsm-send fsm :unrecoverable-error)) (plist-put state-data :service-xml @@ -495,18 +500,27 @@ the FSM should transition to on success." (defun exco--get-server-version (wsdl) "Extract server version from WSDL." - (catch 'found - (dolist (attribute - (soap-xs-type-attributes - (soap-xs-element-type - (soap-wsdl-get - '("http://schemas.microsoft.com/exchange/services/2006/types" - . "RequestServerVersion") - wsdl 'soap-xs-element-p)))) - (when (equal (soap-xs-attribute-name attribute) "Version") - (throw 'found (soap-xs-attribute-default attribute)))) - (warn "Excorporate: Failed to determine server version") - nil)) + (let ((warning-message "Excorporate: Failed to determine server version") + (namespace "http://schemas.microsoft.com/exchange/services/2006/types") + (name "RequestServerVersion") + (found-version nil)) + (unwind-protect + (setq found-version + (catch 'found + (dolist (attribute + (soap-xs-type-attributes + (soap-xs-element-type (soap-wsdl-get + `(,namespace . ,name) + wsdl 'soap-xs-element-p)))) + (when (equal (soap-xs-attribute-name attribute) "Version") + (throw 'found (car (soap-xs-simple-type-enumeration + (soap-xs-attribute-type attribute)))))) + (warn warning-message) + nil)) + (if found-version + found-version + (warn warning-message) + nil)))) (define-enter-state exco--fsm :retrieving-data (_fsm state-data) @@ -649,7 +663,9 @@ OPTIONAL-INVITEES, a list of strings representing optional participants." end 'dateTime))) (location (cdr (assoc 'Location calendar-item))) (to-invitees (cdr (assoc 'DisplayTo calendar-item))) - (main-invitees (mapcar 'org-trim (split-string to-invitees ";"))) + (main-invitees (when to-invitees + (mapcar 'org-trim + (split-string to-invitees ";")))) (cc-invitees (cdr (assoc 'DisplayCc calendar-item))) (optional-invitees (when cc-invitees (mapcar 'org-trim @@ -695,7 +711,12 @@ arguments, IDENTIFIER and the server's response." identifier "FindItem" `(;; Main arguments. - ((Traversal . "Shallow") + (;; RequestVersion is usually overridden by a fixed value in + ;; the WSDL (the RequestServerVersion element); provide the + ;; maximally-compatible Exchange2007 if the fixed value isn't + ;; present. + (RequestVersion (Version . "Exchange2007")) + (Traversal . "Shallow") (ItemShape (BaseShape . "AllProperties")) ;; To aid productivity, excorporate-calfw automatically prunes your @@ -706,16 +727,13 @@ arguments, IDENTIFIER and the server's response." (ParentFolderIds (DistinguishedFolderId (Id . "calendar")))) ;; Empty arguments. - ,@(let ((server-major-version - (string-to-number - (substring (exco-server-version identifier) 8 12)))) - (cond - ((<= server-major-version 2007) - '(nil nil nil nil)) - ((< server-major-version 2013) - '(nil nil nil nil nil)) - (t - '(nil nil nil nil nil nil))))) + ,@(let* ((wsdl (exco--with-fsm identifier + (plist-get (fsm-get-state-data fsm) + :service-wsdl))) + (arity (soap-operation-arity wsdl + "ExchangeServicePort" + "FindItem"))) + (make-list (- arity 1) nil))) callback))) (defun exco-connection-iterate (initialize-function