I attach th diff file between th version 3.9.0-4 in Stretch and the version in testing 4.0.0-beta4. -- Mechtilde Stehmann ## Apache OpenOffice.org ## Freie Office Suite für Linux, MacOSX, Windows ## Debian Developer ## Loook, calender-exchange-provider, libreoffice-canzeley-client ## PGP encryption welcome ## Key-ID 0x141AAD7F
diff -Nru calendar-exchange-provider-3.9.0/build.sh calendar-exchange-provider-4.0.0~beta4/build.sh
--- calendar-exchange-provider-3.9.0/build.sh 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/build.sh 2017-07-03 22:10:10.000000000 +0200
@@ -1,28 +1,32 @@
#!/bin/sh
-usage() { echo "Usage: $0 [-u | -d ]" 1>&2;echo "-u:enable update";echo "-d:disable update"; exit 1; }
+usage() {
+ printf "Usage: %s [ -u | -d ]\n" "$0" 1>&2
+ printf " -u enable update\n" 1>&2
+ printf " -d disable update\n" 1>&2
+ exit 1
+}
-if [ $# = 0 ];then
-usage
+if [ $# = 0 ];then
+ usage
fi
-version=`sed -n -e "s/.*<em:version>\(.*\)<\/em:version>/\1/p" install.rdf`
-while getopts ":ud" OPTION
+version=$(sed -n -e "s/.*<em:version>\(.*\)<\/em:version>/\1/p" install.rdf)
+while getopts ":ud" OPTION
do
case ${OPTION} in
u) echo "update"
- cat defaults/preferences/update_enable.txt > defaults/preferences/update.js
- zip -r exchangecalendar-v$version.xpi * -x \*.git \*.xpi \*.sh update\*.txt
- exit
- ;;
+ cat defaults/preferences/update_enable.txt > defaults/preferences/update.js
+ zip -r exchangecalendar-v"$version".xpi ./* -x \*.git \*.xpi \*.sh update\*.txt
+ exit
+ ;;
d) echo "no update"
- cat defaults/preferences/update_disable.txt > defaults/preferences/update.js
- zip -r exchangecalendar-v$version.xpi * -x \*.git \*.xpi \*.sh update\*.txt
- exit
- ;;
+ cat defaults/preferences/update_disable.txt > defaults/preferences/update.js
+ zip -r exchangecalendar-v"$version".xpi ./* -x \*.git \*.xpi \*.sh update\*.txt
+ exit
+ ;;
*) usage ;;
esac
done
-
-usage
+usage
diff -Nru calendar-exchange-provider-3.9.0/CHANGELOG.md calendar-exchange-provider-4.0.0~beta4/CHANGELOG.md
--- calendar-exchange-provider-3.9.0/CHANGELOG.md 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/CHANGELOG.md 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,684 @@
+# Change Log
+All notable changes to this project will be documented in this file.
+
+## [4.0.0-beta4] - 2017-07-03
+### Added
+- Turkish localization #43, #44, #46
+- Missing release notes of 3.9 and 3.8 releases #35
+- Support for shared task list #41
+
+### Changed
+- Clean up and improve compatibility of build scripts #38, #40
+
+### Fixed
+- File permissions #36
+- HTML content editor #28, #29
+- Activate Italian localization #46
+
+## [4.0.0-beta3] - 2017-06-25
+### Added
+- Added Italian translation #22
+
+### Changed
+- Updated README.md #26, master
+
+### Fixed
+- Colorpick on calender creation doesn't work #19
+- Can't update tasks/events descriptions #5
+
+## [4.0.0-beta2] - 2017-06-10
+### Fixed
+- Opening and working with Attachment dialog #12
+
+## [3.9.0] - unknown release date
+- Stable Release
+- Support enabled for TB 50.*
+- Tested on TB 45.5.1 Lightning 4.7.4
+- We don't support TB/Lightning beta.
+- bug: add new calendar or no password prompt
+
+## [3.8.0] - unknown release date
+- Support of Thunderbird 45.0
+- Support to Office365 calendar new calendar. Note: New users has to Create calendar using office365 type.
+- fix auto discovery for new hosted calendar
+- fix cancelled not removed
+- fix forward event
+- d9f170f fix #459 #426 #466 #464 #462 remove extra info
+- 1d4b8b4 fix #459 #426 #466 #464 #462
+- 0d1a78a fix: #459
+- 5e02727 (origin/master, origin/HEAD, master) rename folowup mail window
+- ab836f9 task-fixed
+- eaa1c2d (HEAD -> ec-3.8, tag: v3.8-beta3) bump-version
+- a641199 (master) bump-version-tb-support
+- 98c047c (origin/master, origin/HEAD) status-undefined-for-ipmnote
+- c8af0bd strict-error
+- 78377ee Merge branch 'master' into ec-3.8
+- 8edfea3 js strict error
+- 65f46a5 strict error
+- 4f92738 js strict error
+
+## [3.7.0] - unknown release date
+- d1b2860 (origin/master, origin/HEAD, master) revert calendar-event-dialog
+- df713f4 Merge pull request #458 from enozkan/patch-5
+- 180e91a Update preferences.dtd for Turkish locale
+
+## [3.6.0] - unknown release date
+- a2a50be strict mode error fix
+- 5db3c8d task sync and strict mode error fix
+- 16d56bf translation for preference password fix
+- 22850a8 preference password fix
+- 1fcaf4c Merge pull request #423 from Dominique-2202/patch-2
+- 6b16cad French translation calendar-summary-dialog.dtd
+- ae091d5 Merge pull request #422 from Mechtilde/Translation
+- d716986 German translation for calendar-summary-dialog.dtd
+- 65c222a Merge pull request #415 from enozkan/patch-4
+- 1fd65b1 Merge pull request #416 from Trim/erFindContactsOffset
+- 23ca0b3 Merge pull request #417 from Trim/erFindCalendarItems
+- e537089 Update calendar-summary-dialog.dtd for tr
+- 7b4b9fb erFindContacts: give a copy of arrays to callback
+- 2235634 erFindContacts: Use server offset instead of own computation
+- b7dd3aa erFindContacts: remove trailing blanks and use contact logs instead of main logs
+- 9a5b78d erFindContacts: Requests all contacts of address books
+- 4681316 erFindCalendarItems: use slice method to clone javascript arrays
+- 91ac17f erFindCalendarItems: don't cal too many times possibly big array
+- b45a6f4 erFindCalendarItems: use LOG instead of dump
+- 3f9de40 string not translatable #409
+- 9a82408 its good to have xpi filename with 'v' preceeding the version
+
+## [3.5.0] - unknown release date
+- Fix Thunderbird hangs on startup
+- Fix Be more defensive about terminating the loop: under some circumstances startYearDay (and I presume startYear) can be greater than endYear[Day] on entry to the loop.
+- Fix Reword log, Bug #373 "Incorrect exhortationto MAIL THIS LINE TO ..."
+- Fix Bug #371 "Cannot add custom reminder (alarm) to an event ..."
+- Fix Lightning 4.0.2.1
+
+## [3.4.0] - unknown release date
+- New Support Extended to Lightning 4.0.0.1
+- New Support Extended to Thunderbird 38.*
+- New EWS Tagger - Feature
+- New Task Email Follow Up - Feature
+- New Language Support For exchange address Book
+- New Mail folder Delegation - Feature
+- New Automatically set lightning time zone
+- New Plug in Builder for deb package
+
+- Fix Reminder Problem
+- Fix #190 - Can not add manually add exchange address book
+- Fix Calendar not refreshing during suspend/resume
+- Fix Busy/Free information wasn’t available
+- Fix Ignore domain request for email user names.
+- Fix freezing on start up
+- Fix Restoring cache
+- Fix rtews.dtd typo fixed
+- Fix Cant not add Google calendar
+- Fix Avoid JS exception in auto completion.
+- Fix Also fill out primary email address if local ID is present
+- Fix Treat public DLs the same way as private ones in auto completion
+- Fix Exchange Icon Update in preference
+- Fix Missing Translation English language
+- Fix Israel Timezone fix for Daylight savings time
+- Fix Password Looping fix
+- New Updated French,German Translation
+- New Preference for mail properties syncing
+- New Preference for Email Follow up
+
+- Change Update suggestions only for stable release
+- Change Minimum Refresh time is set to 60
+- Change Enabled Cache by default or No disable option for cache
+- Change Removed all calendar Refresh time
+- Change Optimized syncing method
+- Change Enable NTLM by default in Thunderbird
+- Change Remove old saved password if user doesn’t choose
+- Change Block adding domain entry in autodiscovery window when email used
+- Change Platform based CSS thanks to git-hub user "@mariolorenz"
+- Change Clear Logging.
+
+## [3.3.2] - unknown release date
+- Bug fix release
+
+## [3.3.1] - unknown release date
+- New New Column for invite mail in message list pane
+- New Support for Thunderbird Nightly Aurora 38.0+
+- New Locale improved
+- New Delegating Calendar feature
+- New Auto-update from Git-hub releases
+- New High priority mails with auto tagging - important
+
+- Changed Meetings that are canceled are removed
+- Changed New Event usability issue in lightning
+- Changed Priority column with updated icons,startup preference
+- Changed Cache Clear on Add on Update
+
+- Fixed Dismissing reminder
+- Fixed Accept/Tentative/Reject button appearance
+- Fixed Fix Address Book freeze when attempting to view "Properties"
+- Fixed Tentative status does not get saved
+- Fixed Unable to forward event in Thunderbird
+- Fixed Breaking other add on columns in message list pane
+- Fixed UX error when saving Out of Office
+
+## [3.2.0] - unknown release date
+- changed add-on name to "Exchange EWS Provider" as it is shorter than including all the exchange versions it can connect to.
+- Fixes bug where sometimes the date/time is shifted on Free/busy info in calendar of someone else.
+- Added preference userAgent. User can now specify their own userAgent string to use in communication.
+- Fixes Bug 277 - Cannot extend the time on a calendar event (Exchange2007)
+- Improved Out Of Office text editor so it is fully HTML aware again.
+- Improved memory usage. It shoud use less memory now. Please read bug 279 on https://www.1st-setup.nl/bugzilla
+- Fixed Bug 287 - no folder details anymore in the ews settings of calendar
+- Fixed a bug where it was not possible to create an exception.
+- Update on French locale.
+- Fixed Bug 291 - Modify instance of recurring meeting fails silently
+- Added Access Control List functionality of Lightning to follow user rights and permissions.
+- Russian translation is added.
+- Fixed problem with new exchange versions of Office365 and Exchange2013.
+- User can mark calendar as readonly. This state is preserved between restarts.
+- Rich text editing of description (body) part for calendar items and task items.
+- Fixed problem where offline cache became out of sync.
+- You can click on links in the description text of invitation and read-only events/tasks
+
+## [3.2.0-Beta20] - unknown release date
+- Fixed Bug 276 - Duplicate entries, wrong hours and sometimes missing entries when viewving other calendars
+
+## [3.2.0-Beta16] - unknown release date
+- Fixed Bug 273 - Tmezone in US or Canada triggers XML error and results in HTTP 400 Bad Request.
+
+## [3.2.0-Beta14] - unknown release date
+- Received new German translation from Björn Töpper.
+- Fixed some small outstanding bugs which will get mentioned when I release the final version.
+
+## [3.2.0-Beta11] - unknown release date
+- Bug 267 - Problem with upgrade from 3.1.2-bug175-3 to 3.2.0-Beta10
+
+## [3.2.0-Beta10] - unknown release date
+- Fixed problem where the add-on would not show events and task against an Exchange2013 server.
+- Changed the title of the add-on to "Exchange 2007/2010/2013 Calendar, Tasks, Contacts and GAL Provider"
+- Started work on improving the progress tooltip info.
+- Fixes bug 162 Changing recurring meeting to Wednesdays, moved it to Thursday
+
+## [3.2.0-Beta9] - unknown release date
+- Introduced loading/showing image when one is available for a contact (addressbook). Only works starting from Exchange server 2010_SP2
+- Fixes a bug where creation of new tasks and Event was not possible since Beta8.
+- Finalized autocompletion. Depending on the connetion speed with the exchange server it can take some time to fill the autocomplete list.
+
+## [3.2.0-Beta8] - unknown release date
+- Introduced an icon which shows connection status to the exchange server.
+- Introduced autocompletion. It works but could use some refinement.
+- Improved CPU load when the add-on has problems connecting to the exchange server .
+
+## [3.2.0-Beta6] - unknown release date
+- Improved copying between exchange calendars and non exchange calendars.
+- Fixed snooze/dismiss reminder problems for events and tasks.
+- Improved UI scripts used in XUL.
+- Fixes Bug 264 - Schema failure when dismissing a reminder
+- Fixes Bug 261 - Number of jobs in Status Bar increasing
+- Fixes Bug 255 - Complete state of tasks not working in today pane
+- Fixes Bug 254 - NewEventInterfaces lists calendars twice
+- Fixes Bug 253 - Import Calendar into Exchange Calendar / copy calendar items from one to another
+- Fixes Bug 252 - Internal server error on reminder dismissal
+
+## [3.2.0-Beta5] - unknown release date
+- Fixed working with attachments lists in the different views/dialogs/panes
+- Customized settings reminders on events and tasks according to what is possible in Exchange.
+- Fixes Bug 255 - Complete state of tasks not working in today pane
+- Fixes Bug 256 - Set custom reminder on task created in outlook without due or entry date not possible
+
+## [3.2.0-Beta4] - unknown release date
+- Split mivExchangeEvent object into mivExchangeEvent and mivExchangeBaseItem. As preparation for mivExchangeTodo.
+- Improved the conversion from Exchange Timezone to Lightning timezone and from Lightning timezone to Exchange timezone.
+- Added the Exchange task/todo detail fields. Lightning does not known about the by default.
+- Fixes Bug 63 - Repeating tasks posted to Exchange Server have incorrect due date/time
+- Fixes Bug 107 - Snooze state of tasks gets lost after restart
+- Fixes Bug 194 - Tasks appear at wrong date
+- Fixes Bug 215 - Snoozed task reminders continually pop up, dismissing task reminders takes 2 clicks of Dismiss
+- Fixes Bug 235 - Try to set a task due date aways sets the current date time
+- Fixes Bug 250 - No tasks with current 3.2.0 beta
+
+## [3.2.0-Beta3] - unknown release date
+- Fixes Bug 150 - Dismissing reminders asks to send update for meeting
+- Fixes Bug 180 - NTLM and Kerberos fail
+- Fixes bug 229 - Creating a custom repeating event - creates event on following day
+- Fixes bug 238 - "All day Event" created for day prior to selected date
+- Fixes bug 241 - Autodiscover RedirectAddr not followed
+- Fixes bug 246 - Modifying recurring meeting resulted in "modification failed" errors
+- Moved exchangecalendar object into it's own interface.
+- Create our own recurrenceInfo object/interface.
+
+## [3.2.0-Beta2] - unknown release date
+- Fixes bug 241 - Autodiscover RedirectAddr not followed
+
+## [3.2.0-Beta1] - unknown release date
+- Added own ExchangeEvent Interface. With this creation of items from cache or exchange server should be faster.
+- Converted handling of timezones to own interface.
+- Timezone of Lightning events are set to those of Exchange. As close as possible because the timezone databases between Exchange and Lighting are not the same.
+- Added new SOAP Autodiscovery functionality which is supported since Exchange2010. It will use this when available.
+
+## [3.1.102] - unknown release date
+- Fixes bug 226: No more than 20 contacts are shown.
+
+## [3.1.99] - unknown release date
+- Fixes Bug 212 - version >= 3.x leaks memory
+- Fixes Bug 211 - 3.1.2 breaks login (3.1.1 working)
+- Fixes Bug 188 - Adding a new Exchange 2010 EWS Calendar via add-on goes into an infinite password prompt loop
+- Fixes Bug 173 - Exchange 2007/2010 Calendar and Tasks Provider deletes Outlook Calendar entries
+- Fixes Bug 164 - Can not Connect to server
+- Fixes Bug 159 - Thunderbird freezes
+- Fixes Bug 157 - Infinity Loope for Password/Username
+- Fixes Bug 143 - The adding uses wrong folder and does not fetch contacts
+
+## [3.1.2] - unknown release date
+- Fixed bug 175: After 10 calendars the jobs will hang up
+- Fixed bug 201: Number of Jobs displayed in status bar is negative
+- Added new loadbalancer for request to Exchange servers. You can now control the simultaneous request to the exchange server.
+- Created new interface for the global functions.
+- Added extra info to progress indicator. It now also uses the new loadbalancer for the statistics.
+
+## [3.1.1] - unknown release date
+- Fixed bug 205 Extension overwrites URI for non-exchange calendars
+
+## [3.1.0] - unknown release date
+- Fixed part of bug51. When emailaddress of attendee is empty do not throw an error.
+- Fixed: Bug where removal of last attachment was not possible.
+- Enhancement: Startup of Thunderbird has been improved.
+- Fixed problem when turning off and on offlineCache.
+
+## [3.0.2] - unknown release date
+- Minor bug fix.
+
+## [3.0.1] - unknown release date
+- Fixed bug 196: Version 3.0.0-rc3 seems to interfere with address autocompletion
+- Fixed bug 204: Thunderbird hangs when creating a new item with attachment
+- Added automatic update functionality. This will check the developer website for new versions and give the change to autmoatically install it.
+
+## [3.0.0] - unknown release date
+- Removed all references to e4x
+- Removed some bugs and stabilized the code.
+
+## [3.0.0-rc4] - unknown release date
+- Add Japanese translation.
+- Added fix for new chunked message responses from Exchange server.
+
+## [3.0.0-rc3] - unknown release date
+- Optimized the code to improve speed.
+
+## [3.0.0-rc2] - unknown release date
+- Optimized the xml handling code so startup and other communications are faster.
+
+## [3.0.0-rc1] - unknown release date
+- Converted last part, editing of tasks, from e4x to xml2jxon.
+
+## [3.0.0-beta4] - unknown release date
+- Fixed problem where a reminder change (dismiss or new time) was not saved to exchange.
+
+## [3.0.0-beta3] - unknown release date
+- Fixed bug 182: Reoccuring Events keep popping up in reminder.
+
+## [3.0.0-beta2] - unknown release date
+- Fixed two parts which were not yet converted. Editing of tasks still to do.
+
+## [3.0.0-beta] - unknown release date
+- Complete rewrite of all xml handling stuff from using e4x to the new xmlToJxon object.
+
+## [2.2.3] - unknown release date
+- Fixed: bug 176 - Calendars whose names contains a slash can't be opened
+
+## [2.2.2] - unknown release date
+- Fixed: bug 160 - Meeting invitation received does not get added after accepting
+
+## [2.2.1] - unknown release date
+- Fixed bug when closing TB the offline cache would be emptyed.
+- Fixed: Bug 161 - pb accessing calendars
+
+## [2.2.0] - unknown release date
+- Fixed complaint of ad-on checker.
+- Fixed bug of cloning a calendar showed empty fields.
+
+## [2.1.4] - unknown release date
+- Fixed: "Unresponsive script" bug.
+
+## [2.1.3] - unknown release date
+- Fixed: Bug 52 - Incorrect sync: random calendar events missing, others duplicated
+
+## [2.1.2] - unknown release date
+-Fixed: Bug 118 - Kerberos authentication broken in 1.8.11
+
+## [2.1.1] - unknown release date
+- Fixed: Bug 151 - Email id property of exchange calendar becomes None on updating thunderbird to 13.0
+- Fixed: Bug 153 - "allday" event -> invite someone -> password request -> communication stopped
+- Improved: Disabled calendars are not started on TB startup.
+- Fixed: The way a calendar startup after is has been created newly.
+
+## [2.1.0] - unknown release date
+- Fixed filtering of events
+- Fixed saving of the EWS settings.
+- Fixed calendarReset.
+- Improved getItems function.
+
+## [2.0.5] - unknown release date
+- Added: Processing of getItemsFromOfflineCache into a seperate thread.
+- Fixed: Problem when turning on offline cache this would only start after restarting TB.
+
+## [2.0.4] - unknown release date
+- Fixed: bug with reminders in offline cache.
+- Added: Extra dialog when answering an invitation.
+
+## [2.0.2] - unknown release date
+- Improved: Further improved Offline cache items retrieval.
+- Fixed: Bug when receiving a HTTP 302 relative redirect. Because of a typo in the code it threw an exception. Possibly bug 51.
+
+## [2.0.1] - unknown release date
+- Improved: Offline cache items retrieval.
+
+## [2.0.0] - unknown release date
+- Added: Offline cache functionality. (When not connected or offline it goes into Read-Only mode)
+- Added: Invitation forwarding functionality.
+
+## [1.8.19] - unknown release date
+- Fixes: problem where Out Of Office stopped working int TB12. Fix replaces the WYSIWYG editor into a flat text editor.
+- Fixes: Several small bugs.
+
+## [1.8.18] - unknown release date
+- Addedd access to exchange contacts folders. (Currently READ-ONLY)
+- Fixed: Problem with dismissing and snoozing alarms.
+- Fixed: Problem on autodiscovery where sometimes a EWS URL select list was shown with duplicate entries.
+- Fixed: Other small problems.
+- Fixed: Bug 116 - Authentication fails after Thunderbird-restart
+- Fixed: Bug 24 - Accepting or rejecting of invitations changes owner
+
+## [1.8.16] - unknown release date
+- Fixed: Bug 122 - New: I get "Event Invitation" email for my own meetings when I import them
+- Fixed: Bug 91 - Recurring appointment causes immediate reminders for all future
+- Fixed a lot of smaller bugs.
+
+## [1.8.13] - unknown release date
+- Fixed: Bug 120 - All my calendar appointments are not visible in Thunderbird
+- Fixed: Bug 94 - Credentials (Username, Password) for calendars are not stored
+
+## [1.8.12] - unknown release date
+- Fixed: Bug 117 - tasks calendar shows calendar items
+- Fixed: Problem where only Free/Busy information would be shown for defalt personal calendar.
+
+## [1.8.6] - unknown release date
+- Fixed: Bug 111 - No events are visible when user only has calendar permission to see Free/Busy info
+
+## [1.8.5] - unknown release date
+- Fixed: Bug 91 - Recurring appointment causes immediate reminders for all future occurrences
+- Fixed: Bug 107 - Snooze state of tasks gets lost after restart
+- Updated: Code for setting of alarms and snooze parameters changed completely.
+
+## [1.8.4] - unknown release date
+- Fixed: Bug 103 - aListener not defined in calExchangeCalendar
+- Added: Global minimal memory cache size preferences.
+
+## [1.8.3] - unknown release date
+- fixed: Bug 102 - Extension continually asks for password
+
+## [1.8.1] - unknown release date
+- Fixed: Bug 99 - Tasks do not show up in the tasks pane/tab
+
+## [1.8.0] - unknown release date
+- Added: Full attachment functionality.
+- Fixed: Bug 97 - Last month's events are missing
+
+## [1.7.18] - unknown release date
+- Fixed: Bug it is not possible to accept or decline a meeting invitation
+
+## [1.7.17] - unknown release date
+- Fixed: Bug where a HTTP 302 redirect which was called as an error was not handled correctly.
+- Fixed: Bug 31 - Unable to invite attendees
+- Fixed: Bug 45 - Cannot display users own calendar
+- Fixed: Bug 68 - MenuItems for creating new items are disabled
+- Fixed: Bug 77 - Lightening fails to save Microsoft Live Meeting style events to the Exchange calendar
+- Fixed: Bug 80 - request response HTTP 302 redirect is NOT redirected and communication stops
+- Fixed: Bug 82 - Copying of events from google calendar does not work
+- Fixed: Bug 83 - Can't add a calendar -> HTTP-ERROR 500
+- Fixed: Bug 84 - checks performed on disabled calendars
+- Fixed: Bug 85 - Can't open or save file attachments in a calendar meeting
+- Fixed: Bug 86 - Invalid log path on Windows
+- Added: When you try to access another person's calendar but do not have full read permissions it will switch and only tries to get Free/Busy/Tentative/OOF information.
+- Added: The domainname is no longer a required field
+- Added: German localization
+- Added: Setting logging preferences can now be done from the TB preferences.
+- Added: Exporting to ICS. Currently it only export what is has requested from the Exchange server. Default a period of one month ahead and one month back from currentdate.
+- Changed: Changed default CalendarPollInterval to once every 60 seconds and InboxPollInterval to once every 180 seconds.
+
+## [1.7.15] - unknown release date
+- Fixed: Bug 59 - Exchange sends extra invitations when first one is accepted
+- Fixed: Bug 32 - Unable to add event to calendar using iTIP buttons
+- Fixed: Bug 33 - Accept multiple-day appointment request via iTIP creates single-day event
+- Fixed: Bug 61 - Error: reference to invalid character number when trying to pull in calendar
+- Fixed: Bug 62 - Moving calendar item from one calendar to another fails
+- Added: Functionality to clone an Exchange Calendar.
+- Fixed: Bug 19 - Event stays shown after deletion
+- Fixed: Bug 66 - No workflow (accept, reject, ...) buttons are shown in invitations
+- Fixed: Bug 65 - read only of calendar
+- Added: New debugging preferences and possibility to create a log/debug file.
+- Added: Finer info/error control in communication object.
+
+## [1.7.13] - unknown release date
+- Added: Folder properties visible in EWS Settings dialog.
+- Added: Mouse cursor wait indication when browsing folders.
+- Added: Add a new calendar base on the information in a share calendar invitation from someone.
+- Fixed: BUG 54 Shared Calendar w/notification: error when closing
+- Fixed: BUG 55 Can't set reminder for a task
+- Added: Opening and saving of attachments. (ReadOnly)
+- Added: Check if lightning is installed and active. When not it will show a warning.
+- Added: Functionality to migrate an Exchange Provider add-on calendar to this add-on.
+- Added: User can change poll interval for calendar through EWS Settings.
+- Fixed: Bug 56 - Not possible to acknowledge repeating meeting
+- Fixed: Small bug when importing an invitation send from a Google Calendar. It does not contain timezone information.
+- Fixed: Bug 38 - Invalid security certificate
+- Added: Mouse cursor wait indicatie when checking server and username on creating an calendar or changing the server settings.
+
+
+## [1.7.12] - unknown release date
+- Added: Support for Seamonkey.
+- Added: Access to public/shared folders without a mailbox. Only windows username, domain & password required.
+- Added: You can use now a username consisting of a username part followed by ampersand (@) and full domainname and empty domain field or a username and domain field value.
+- Fixed: BUG37. Alarm info on a master calendar item is not show correctly.
+- Fixed: BUG41. Synching meetings with empty titles fails
+- Added: French localization.
+- Fixed: Bug 44 - Synchronizaton fails when a calendar item has no start date
+- Fixed: Bug 39 - Accepting a meeting does not get updated in Lightning
+- Added: Importing ICS file.
+- Change: Changed namespacing on request of Mozilla.
+
+
+## [1.7.11] - unknown release date
+- Modified: Debug log lines show more usefull information.
+- Fixed: BUG 30: Accept via iTIP button fails for requests sent to distribution lists
+- Improved: The processing of meeting invitations is complete. Even the iTIP buttons work.
+
+## [1.7.10a3] - unknown release date
+- Fixed an Exchange server version problem in function GetMeetingRequestByUID. It did not work correctly on Exchange 2007
+
+## [1.7.10a1] - unknown release date
+- Fixed: BUG 28 "NL -> EN translation string" EN != "Settings voor calendar"
+- Fixed: BUG 24 "Accepting or rejecting of invitations changes owner". Meeting invitations are not yet working as wanted when using iTIP buttons.
+
+## [1.7.9] - unknown release date
+- Fixed: Meeting requests and updates to these requests were not processed in the right way.
+
+## [1.7.8] - unknown release date
+- Fixed: BUG 25 Recuring event with reminder prevents calendar refresh
+- Fixed: BUG 26 Deleting a single occurrence in a sequence has no effect
+- Fixed: BUG 27 Today Pane Tasks fails to show newly created tasks
+
+## [1.7.7] - unknown release date
+- Fixed: BUG 24 "Accepting or rejecting of invitations changes owner"
+- Fixed: Stabilized meeting invitations in global. Now works with distribution lists, other alias name, etc...
+
+## [1.7.7a3] - unknown release date
+- Fixed: BUG 23 "Request sent instead of Confirmation; wrong Timezone"
+- Fixed: Trying to mark a task as completed gives an update error: "CompleteDate cannot be set to a date in the future."
+- Fixed: Removing the completed task status through the checkbox in the task view produces an error.
+
+## [1.7.7a2] - unknown release date
+- Fixed: Could not respond to aa meeting invitation where the mailbox name was different in character Upper/Lowercase than the emailaddress in the invitation.
+
+## [1.7.7a1] - unknown release date
+- Fixed: Chagning/updating of an existing item where you are the organiser but also on the attendee list, created by outlook, gave an error.
+- Added: The add-on now modifies the Exchange nextreminderdate on the Exchange server as the old Exchange provider add-on did. This is part of the merge of the add-ons.
+
+## [1.7.6] - unknown release date
+- Added: Progres indicator with tooltip. (closes BUG report 14)
+- Solved: BUG 16 Cannot create event due to Time Zone error (reported by Sven)
+- solved: BUG 17 Out of office retrieval of incorrect values (reported by Sven)
+- Solved: When you are editing Out Of Office settings and had the externel reply window open and did a save the text for the external reply was changed by the internal reply message.
+- Added: It is not possible anymore to add tasks to a calendar folder and calendaritems in a tasks folder. This would produce an error.
+- Fixed: BUG 18 Changing the end or start date of an allday event produces an error. (reported by Sven)
+
+## [1.7.5] - unknown release date
+- Minor changes to keep the add-on working in version 10.0a2.
+- Fixed: Problem where timezone information downloading did not work for exchange 2007.
+
+## [1.7.4] - unknown release date
+- Added: The snooze and dismiss states are saved on the exchange server so they survive a restart of TB. Was a problem when "show missed alarms" was on. (BUG 12 reported by pazz)
+- Solved: Shut-down is faster.
+
+## [1.7.3] - unknown release date
+- Solved: BUG 11/ During creation of an allday event with a reminder or turning on the reminder on an existing allday event triggers an error and change is not saved. (reported by gislair)
+
+## [1.7.2] - unknown release date
+- Solved: When the windows account got locked the password manager kept asking for a password. Now after tree failed attempts it will stop asking until a restart.
+- Solved: Respong to a meeting request through the iTIP buttons generated an error and did not work.
+
+## [1.7.1] - unknown release date
+- Solved: When an organiser removed a meeting which was confirmed the update in your calendar was performed every 3 seconds.
+
+## [1.7.0] - unknown release date
+- Changed: Folder browser shows different icons for different folderclass property.
+- Solved: Removing a meeting in a public folder did not work an give error.
+- Solved: Buttons Save and cancel in the EWS settings dialog would drop of dialog window.
+- Major version changed into 1 because the add-on is feature complete.
+
+## [0.7.47] - unknown release date
+- New: Selecting the right folder below the folderbase can now be done through a folder browser.
+
+## [0.7.46] - unknown release date
+- Improved: Creation, modification and deletion of repeating events.
+
+## [0.7.45] - unknown release date
+- Solved: Removing a repeating event did not allways work.
+
+## [0.7.44] - unknown release date
+- Solved: Creating an all day event did not work anymore.
+
+## [0.7.42] - unknown release date
+- Solved: Some alarms could not be removed.
+- Solved: For repeating meetings multiple alarms were shown, with same titel and date, when option show missed alarms was on in Lightning settings.
+- Added: Option to automatically remove responses to meetingrequest from your inbox when you are not the organiser.
+- Solved: BUG10 reported by P.Palai.
+
+## [0.7.41] - unknown release date
+- Solved: Checking/searching for certain folderpath locations did not work.
+- Solved: Manipulating occurrences in a repeating meeting did not always work.
+- Solved: Changing the EWS settings did not refresh the calendar and therefore the changes were not visible.
+
+## [0.7.40] - unknown release date
+- Some small changed to make shared funcitonality available to the Exchange Contacts add-on
+- Meetingrequest in a non personal folder we show als invitation request to the use. Now they are not shown anymore as invitation request.
+- Added different job queues for synchronization and modify actions to the EWS server. During startup changes are show earlier.
+
+## [0.7.39] - unknown release date
+- User must choose to whom invitation updates are send.
+- Added a new calender folder poller which will sync by default every 10 seconds.
+
+## [0.7.38] - unknown release date
+- Changes in meetings in personal calendars will be send always to all involved persons.
+- In a later version the extension will ask the user to specify what he wants (send updates or not)
+
+## [0.7.37] - unknown release date
+- Fixed problem where after an autodiscovery and server and mailbox check did not work.
+- Removing a calendar will remove all settings and running processes.
+
+## [0.7.36] - unknown release date
+- Fixed a warning in the Mozilla tests.
+
+## [0.7.35] - unknown release date
+- Fixed bug (reported by Tudor Timisescu). Check for server and mailbox did not work anymore.
+
+## [0.7.34] - unknown release date
+- Added management of Out of Office settings.
+
+## [0.7.33] - unknown release date
+- Added three new options to the EWS preferences for each calendar.
+- Completed list of "base folder" options.
+
+## [0.7.32] - unknown release date
+- EWS Timezome information added for Exchange2007(_SP1) servers
+- Problems with allday event solved (see version 0.7.30)
+- Tasks date and times are working now for different timezones.
+- Version is stable for production use.
+
+## [0.7.31] - unknown release date
+- Fixed upgrade problem between versions 0.7.29 and 0.7.30
+
+## [0.7.30] - unknown release date
+- Timezone is added correctly. There is even a difference between a 2010 or 2007 version of Exchange.
+- Starting mechanism is optimized.
+- A calendar reset is done completely now.
+- Known problem: If you add a alldayevent EWS will add an extra day infront of it. So 1 allday becomes two.
+
+## [0.7.29] - unknown release date
+- Added the posibility to change your reaction to an invitation request in the meetingresponse screen.
+
+## [0.7.28] - unknown release date
+- Addedd extra options to the EWS Settings.
+
+## [0.7.27] - unknown release date
+- Fixed bug 6. TB becomes unresponsive on paging back in week view.
+
+## [0.7.26] - unknown release date
+- Extra settings for each calendar (poll inbox)
+- Inbox poller results are better processed.
+- Settings are now saved in the right location within preferences..
+
+## [0.7.22] - unknown release date
+- Deleting of an occurrence from a string does work now.
+- Alarms can be dismissed or gesnoozed.
+ This status is not saved between TB restarts.
+ This is an in memory status maintained by TB.
+
+## [0.7.21] - unknown release date
+- iTIP processing improved.
+
+## [0.7.20] - unknown release date
+- Settings and alarm on recurring appointments is better handled.
+
+## [0.7.19] - unknown release date
+- Fixed BUG 4.
+- Fixed BUG 5.
+- So called observers are broken down in the right way.
+
+## [0.7.18] - unknown release date
+- Fixed BUG 3.
+- Alarm changing improved.
+
+## [0.7.17] - unknown release date
+- Fixed BUG 2.
+
+## [0.7.16] - unknown release date
+- Task alarms are being set in the right way.
+- Dismiss or snooze the alarm of a task is working now.
+
+## [0.7.15] - unknown release date
+- Removed all storage of passwords in Memory. All password are only stored by the default Thunderbird Password Manager.
+
+## [0.7.14] - unknown release date
+- Imporved iTIP processing.
+
+## [0.7.13] - unknown release date
+- Source code cleanup.
+- Exception "nsIAuthPrompt2.asyncPromptAuth" solved.
+- Failures during creating connections to server are better handled.
+
+## [0.7.12] - unknown release date
+- Changed text on buttons for MessageRespons screen.
+- Fixed where it was not possible to create an alldayevent.
+- Dismissing an alarm will work.
+
+## [0.7.11] - unknown release date
+- Improved iTIP processing.
+
+## [0.7.10] - unknown release date
+- Fixed problem for date/time conversions. Through this problem some appointments were show on the wrong date or time.
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/attachments-view.js calendar-exchange-provider-4.0.0~beta4/chrome/content/attachments-view.js
--- calendar-exchange-provider-3.9.0/chrome/content/attachments-view.js 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/attachments-view.js 2017-07-03 22:10:10.000000000 +0200
@@ -44,6 +44,7 @@
}
exchAttachments.prototype = {
+ _initialized: false,
addAttachmentDialog: function _addAttachmentDialog()
{
@@ -227,45 +228,75 @@
}
},
+ /**
+ * Receives asynchronous messages from the parent context that contains the iframe.
+ *
+ * @param {MessageEvent} aEvent Contains the message being received
+ */
+ receiveMessage: function _receiveMessage(aEvent) {
+ let validOrigin = gTabmail ? "chrome://messenger" : "chrome://calendar";
+ if (aEvent.origin !== validOrigin) {
+ return;
+ }
+ switch (aEvent.data.command) {
+ case "exchWebService_addAttachmentDialog": this.addAttachmentDialog(); break;
+ }
+ },
+
onLoad: function _onLoad()
{
+ if(this._initialized){
+ return;
+ }
+
+ var self = this;
+
if (this._document.getElementById("calendar-task-tree")) {
this.globalFunctions.LOG(" -- calendar-task-tree --");
- var self = this;
this._document.getElementById("calendar-task-tree").addEventListener("select", function(){ self.onSelectTask();}, true);
return;
- }
+ }
var args = this._window.arguments[0];
var item = args.calendarEvent;
- //this.globalFunctions.LOG(" -- onLoad 2 ("+this.globalFunctions.STACKshort()+")");
this.attachmentListboxVisible = false;
+ // We can't update toolbar from iframe
if ((item.calendar) && (item.calendar.type == "exchangecalendar")) {
this.globalFunctions.LOG(" -- It is an Exchange Calendar event:"+item.title);
-
- try {
- // Hide Lightning URL button
- this._document.getElementById("button-url").hidden = true;
- this._document.getElementById("event-toolbar").setAttribute("currentset", "button-save,button-attendees,button-privacy,button-url,exchWebService-add-attachment-button,button-delete");
- this._document.getElementById("exchWebService-add-attachment-button").hidden = false;
- if(this._document.getElementById("options-attachments-menuitem")){
- this._document.getElementById("options-attachments-menuitem").setAttribute("label", this._document.getElementById("exchWebService-add-attachment-button").getAttribute("label"));
- this._document.getElementById("options-attachments-menuitem").setAttribute("command", "exchWebService_addAttachmentDialog");
- }
+ if (this._document.getElementById("event-grid-attachment-row")) {
+ this._document.getElementById("event-grid-attachment-row").setAttribute("collapsed", true);
}
- catch (ex) {this.globalFunctions.LOG(" -- Could not add exchange attachment buttons:"+ex.toString());}
- // calendar-event-dialog (hide existing attachment view)
- try {
- this._document.getElementById("event-grid-attachment-row").setAttribute("collapsed", "true");
- }
- catch (ex) {}
+ // Modify context menu for the attachment list inside the "Attachment" panel
+ let attachmentListbox = this._document.getElementById("attachment-link");
+
+ attachmentListbox.setAttribute("context", "exchWebService-attachment-popup") ;
+ attachmentListbox.setAttribute("onkeypress", function (aEvent) { self.onKeyPress(aEvent); }) ;
+ attachmentListbox.setAttribute("onclick", function (aEvent) { self.onSelect(aEvent); }) ;
+ attachmentListbox.setAttribute("ondblclick", function (aEvent) { self.onDblClick(aEvent); }) ;
this.addAttachmentsFromItem(item);
+ } else {
+ if (this._document.getElementById("event-grid-attachment-row")) {
+ this._document.getElementById("event-grid-attachment-row").setAttribute("collapsed", false);
+ }
+
+ // Modify context menu for the attachment list inside the "Attachment" panel
+ let attachmentListbox = this._document.getElementById("attachment-link");
+
+ attachmentListbox.setAttribute("context", "attachment-popup") ;
+ attachmentListbox.setAttribute("onkeypress", "attachmentLinkKeyPress(event)") ;
+ attachmentListbox.setAttribute("onclick", "attachmentClick(event);") ;
+ attachmentListbox.setAttribute("ondblclick", "attachmentDblClick(event)") ;
}
+
+ // Add message listener to be able to receive message from parent window or tab
+ window.addEventListener("message", function(aEvent) { self.receiveMessage(aEvent); }, false);
+
+ this._initialized = true;
},
addAttachmentsFromItem: function _addAttachmentsFromItem(aItem)
@@ -584,6 +615,6 @@
}
var tmpAttachment = new exchAttachments(document, window);
-window.addEventListener("load", function _onLoad() { window.removeEventListener("load",arguments.callee,false); tmpAttachment.onLoad(); }, true);
+window.addEventListener("load", function _onLoad() { tmpAttachment.onLoad(); }, false);
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/attachments-view.xul calendar-exchange-provider-4.0.0~beta4/chrome/content/attachments-view.xul
--- calendar-exchange-provider-3.9.0/chrome/content/attachments-view.xul 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/attachments-view.xul 2017-07-03 22:10:10.000000000 +0200
@@ -47,20 +47,19 @@
<overlay id="exchWebService-attachment-view"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
- <script type="application/javascript" src="chrome://exchangecalendar/content/attachments-view.js"/>
+ <script type="application/javascript" src="chrome://exchangecalendar/content/attachments-view.js"/>
<!-- Commands -->
- <commandset id="itemCommands">
+ <commandset>
<command id="exchWebService_openAttachment"
- oncommand="tmpAttachment.openAttachment();"/>
+ oncommand="tmpAttachment.openAttachment();"/>
<command id="exchWebService_saveAttachment"
- oncommand="tmpAttachment.saveAttachment();"/>
+ oncommand="tmpAttachment.saveAttachment();"/>
<command id="exchWebService_deleteAttachment"
- oncommand="tmpAttachment.deleteAttachment();"/>
- <command id="exchWebService_addAttachmentDialog"
- oncommand="tmpAttachment.addAttachmentDialog();"/>
+ oncommand="tmpAttachment.deleteAttachment();"/>
</commandset>
+ <!-- Update context popup-->
<popupset id="event-dialog-popupset">
<menupopup id="exchWebService-attachment-popup">
<menuitem id="exchWebService-attachment-popup-open"
@@ -74,26 +73,9 @@
<menuitem id="exchWebService-attachment-popup-delete"
label="&event.menu.item.delete.label;"
accesskey="&event.menu.item.delete.accesskey;"
- disable-on-readonly="true"
+ disable-on-readonly="true"
command="exchWebService_deleteAttachment"/>
</menupopup>
</popupset>
-
- <toolbarpalette id="event-toolbarpalette">
- <toolbarbutton id="exchWebService-add-attachment-button"
- mode="dialog"
- class="cal-event-toolbarbutton toolbarbutton-1"
- label="&exchWebServie.add.attachment.button.label;"
- disable-on-readonly="true"
- removable="true"
- command="exchWebService_addAttachmentDialog"
- oncommand="tmpAttachment.addAttachmentDialog();"
- hidden="true"/>
- </toolbarpalette>
- <toolbar id="event-toolbar" defaultset="button-save,button-attendees,button-privacy,button-url,exchWebService-add-attachment-button,button-delete">
- </toolbar>
-
</overlay>
-
-
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/calendar-event-dialog-attendees.xml calendar-exchange-provider-4.0.0~beta4/chrome/content/calendar-event-dialog-attendees.xml
--- calendar-exchange-provider-3.9.0/chrome/content/calendar-event-dialog-attendees.xml 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/calendar-event-dialog-attendees.xml 2017-07-03 22:10:10.000000000 +0200
@@ -66,7 +66,7 @@
completedefaultindex="true"
forcecomplete="true"
minresultsforpopup="1"
- onblur="if (this.localName == 'textbox') document.getBindingParent(this).onBlurInput(event);"
+ onblur="if (this.localName === 'textbox') document.getBindingParent(this).onBlurInput(event);"
ignoreblurwhilesearching="true"
oninput="this.setAttribute('dirty', 'true');">
</xul:textbox>
@@ -138,7 +138,7 @@
numRowsAdded++;
}
}
- if (numRowsAdded == 0) {
+ if (numRowsAdded === 0) {
this.appendAttendee(null, listbox, template, false);
}
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/calendar-event-dialog.js calendar-exchange-provider-4.0.0~beta4/chrome/content/calendar-event-dialog.js
--- calendar-exchange-provider-3.9.0/chrome/content/calendar-event-dialog.js 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/calendar-event-dialog.js 2017-07-03 22:10:10.000000000 +0200
@@ -1,40 +1,10 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: GPL 3.0
- *
- * The contents of this file are subject to the General Public License
- * 3.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.gnu.org/licenses/gpl.html
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * -- Exchange 2007/2010 Calendar and Tasks Provider.
- * -- For Thunderbird with the Lightning add-on.
- *
- * Author: Michel Verbraak (info@1st-setup.nl)
- * Website: http://www.1st-setup.nl/wordpress/?page_id=133
- * email: exchangecalendar@extensions.1st-setup.nl
- *
- *
- * This code uses parts of the Microsoft Exchange Calendar Provider code on which the
- * "Exchange Data Provider for Lightning" was based.
- * The Initial Developer of the Microsoft Exchange Calendar Provider Code is
- * Andrea Bittau <a.bittau@cs.ucl.ac.uk>, University College London
- * Portions created by the Initial Developer are Copyright (C) 2009
- * the Initial Developer. All Rights Reserved.
- *
- * ***** BEGIN LICENSE BLOCK *****/
var Cu = Components.utils;
var Ci = Components.interfaces;
var Cc = Components.classes;
-Cu.import("resource://calendar/modules/calUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-function exchEventDialog(aDocument, aWindow)
+function exchCalendarEventDialog(aDocument, aWindow)
{
this._document = aDocument;
this._window = aWindow;
@@ -43,334 +13,47 @@
.getService(Ci.mivFunctions);
}
-exchEventDialog.prototype = {
-
- _initialized: false,
- _oldCallback: null,
-
- onAcceptCallback: function _onAcceptCallback(aItem, aCalendar, aOriginalItem, aIsClosing)
- {
- if ((cal.isEvent(aItem)) && (aCalendar.type == "exchangecalendar")) {
- if (!aItem.className) {
- var newItem = Cc["@1st-setup.nl/exchange/calendarevent;1"]
- .createInstance(Ci.mivExchangeEvent);
- newItem.cloneToCalEvent(aItem);
- aItem = newItem;
- }
- }
-
- if ((!cal.isEvent(aItem)) && (aCalendar.type == "exchangecalendar")) {
- // Save extra exchange fields to item.
- if (!aItem.className) {
- var newItem = Cc["@1st-setup.nl/exchange/calendartodo;1"]
- .createInstance(Ci.mivExchangeTodo);
- newItem.cloneToCalEvent(aItem);
- aItem = newItem;
- }
-
- aItem.totalWork = this._document.getElementById("exchWebService-totalWork-count").value;
- aItem.actualWork = this._document.getElementById("exchWebService-actualWork-count").value;
- aItem.mileage = this._document.getElementById("exchWebService-mileage-count").value;
- aItem.billingInformation = this._document.getElementById("exchWebService-billingInformation-count").value;
- aItem.companies = this._document.getElementById("exchWebService-companies-count").value;
- }
-
-try{
- if (this.newItem) {
- aItem.bodyType = "HTML";
- aItem.body = this._document.getElementById("exchWebService-body-editor").content;
- }
- else {
- if (aItem.bodyType == "HTML") {
- aItem.body = this._document.getElementById("exchWebService-body-editor").content;
- }
- }
-}catch(err){dump("Error saving content\n");}
-
- if (this._oldCallback) {
- this._oldCallback(aItem, aCalendar, aOriginalItem, aIsClosing);
- }
- },
+exchCalendarEventDialog.prototype = {
+ /*
+ * setup menu window and button toolbars when editing an Exchange item
+ */
onLoad: function _onLoad()
{
- //onLoad();
- this._document.getElementById("exchWebService-body-editor").setAttribute("scrollbars","yes");
- if (this._window.arguments[0].calendarEvent.calendar.type != "exchangecalendar") {
- if (this._document.getElementById("item-description")) {
- this._document.getElementById("item-description").hidden = false;
- }
- if (this._document.getElementById("exchWebService-body-editor")) {
- this._document.getElementById("exchWebService-body-editor").hidden = true;
- }
- return;
- }
+ let args = this._window.arguments[0];
+ let item = args.calendarEvent;
- if (this._initialized) return;
- this._oldCallback = this._window.onAcceptCallback;
- var self = this;
- this._window.onAcceptCallback = function(aItem, aCalendar, aOriginalItem, aIsClosing) { self.onAcceptCallback(aItem, aCalendar, aOriginalItem, aIsClosing); };
-
- if (this._document.getElementById("todo-entrydate")) {
- this._initialized = true;
-
- var args = this._window.arguments[0];
- var item = args.calendarEvent;
- this.updateScreen(item, item.calendar);
- //Cc["@mozilla.org/consoleservice;1"]
- // .getService(Ci.nsIConsoleService).logStringMessage(item.exchangeXML);
-
-//dump("event.dialog: item.exchangeXML:"+item.exchangeXML+"\n");
-
- if ((item.bodyType === undefined) || (item.bodyType == "HTML")) {
- if (this._document.getElementById("item-description")) {
- this._document.getElementById("item-description").hidden = true;
- }
- if (this._document.getElementById("exchWebService-body-editor")) {
- this._document.getElementById("exchWebService-body-editor").hidden = false;
- if (item.bodyType !== undefined) {
- this._document.getElementById("exchWebService-body-editor").content = item.body;
- }
- else {
- this.newItem = true;
- if (item.body) {
- if ((item.body.indexOf("<BODY>") > -1) || (item.body.indexOf("<body>") > -1)) {
- this._document.getElementById("exchWebService-body-editor").content = item.body;
- }
- else {
- this._document.getElementById("exchWebService-body-editor").content = this.globalFunctions.fromText2HTML(item.getProperty("DESCRIPTION"));
- }
- }
- else {
- this._document.getElementById("exchWebService-body-editor").content = this.globalFunctions.fromText2HTML(item.getProperty("DESCRIPTION"));
- }
- }
- }
- }
- else {
- if (this._document.getElementById("item-description")) {
- this._document.getElementById("item-description").hidden = false;
- }
- if (this._document.getElementById("exchWebService-body-editor")) {
- this._document.getElementById("exchWebService-body-editor").hidden = true;
- }
- }
- }
- },
-
- updateScreen: function _updateScreen(aItem, aCalendar)
- {
- var item = aItem;
+ // We can't update toolbar from iframe
+ if ((item.calendar) && (item.calendar.type == "exchangecalendar")) {
- if ((!cal.isEvent(item)) && (aCalendar.type == "exchangecalendar")) {
+ let eventToolbar = this._document.getElementById("event-toolbar");
- var ownerLabel = this._document.getElementById("exchWebService-owner-label");
- if (ownerLabel) {
- ownerLabel.value = item.owner;
+ // If the standard add url button was enabled, hidde it and show exchangecalendar attachment
+ let currentSet = eventToolbar.getAttribute("currentset");
+ if (currentSet.indexOf("button-url") === 1
+ && currentSet.indexOf("exchWebService-add-attachment-button") === -1) {
+ currentSet = currentSet.replace("button-url", "exchWebService-add-attachment-button");
}
- try {
- this._document.getElementById("exchWebService-details-row1").removeAttribute("collapsed");
- this._document.getElementById("exchWebService-details-row2").removeAttribute("collapsed");
- this._document.getElementById("exchWebService-details-row3").removeAttribute("collapsed");
- }
- catch (ex) {}
+ // Switch toolbar buttons display
+ this._document.getElementById("button-url").hidden = true;
+ this._document.getElementById("exchWebService-add-attachment-button").hidden = false;
- this._document.getElementById("exchWebService-owner-row").setAttribute("collapsed", "false");
- this._document.getElementById("exchWebService-details-separator").hidden = false;
+ // Switch window menu display
+ this._document.getElementById("options-attachments-menu").collapsed = true;
+ this._document.getElementById("exchWebService-options-attachments").collapsed = false;
- if (item.className) {
- this._document.getElementById("exchWebService-totalWork-count").value = item.totalWork;
- this._document.getElementById("exchWebService-actualWork-count").value = item.actualWork;
- this._document.getElementById("exchWebService-mileage-count").value = item.mileage;
- this._document.getElementById("exchWebService-billingInformation-count").value = item.billingInformation;
- this._document.getElementById("exchWebService-companies-count").value = item.companies;
- }
+ } else {
+ // Switch toolbar buttons display
+ this._document.getElementById("button-url").hidden = false;
+ this._document.getElementById("exchWebService-add-attachment-button").hidden = true;
- this._document.getElementById("event-grid-location-row").hidden = true;
-
- // Clear reminder select list for todo
- this._document.getElementById("reminder-none-separator").hidden = true;
- this._document.getElementById("reminder-0minutes-menuitem").hidden = true;
- this._document.getElementById("reminder-5minutes-menuitem").hidden = true;
- this._document.getElementById("reminder-15minutes-menuitem").hidden = true;
- this._document.getElementById("reminder-30minutes-menuitem").hidden = true;
- this._document.getElementById("reminder-minutes-separator").hidden = true;
- this._document.getElementById("reminder-1hour-menuitem").hidden = true;
- this._document.getElementById("reminder-2hours-menuitem").hidden = true;
- this._document.getElementById("reminder-12hours-menuitem").hidden = true;
- this._document.getElementById("reminder-hours-separator").hidden = true;
- this._document.getElementById("reminder-1day-menuitem").hidden = true;
- this._document.getElementById("reminder-2days-menuitem").hidden = true;
- this._document.getElementById("reminder-1week-menuitem").hidden = true;
-
- this._document.getElementById("timezone-starttime").hidden = true;
- this._document.getElementById("timezone-endtime").hidden = true;
-
- if (this._document.getElementById("item-repeat")) {
- this._document.getElementById("item-repeat").addEventListener("command", function() { self.updateRepeat(); }, false);
- }
- //this.updateTime();
- this.updateRepeat();
- }
- else {
- try {
- this._document.getElementById("exchWebService-details-row1").setAttribute("collapsed", "true");
- this._document.getElementById("exchWebService-details-row2").setAttribute("collapsed", "true");
- this._document.getElementById("exchWebService-details-row3").setAttribute("collapsed", "true");
- }
- catch (ex) {}
-
- this._document.getElementById("exchWebService-owner-row").setAttribute("collapsed", "true");
- this._document.getElementById("exchWebService-details-separator").hidden = true;
-
- this._document.getElementById("event-grid-location-row").hidden = false;
- this._document.getElementById("event-grid-recurrence-row").hidden=false;
-
- // Clear reminder select list for todo
- this._document.getElementById("reminder-none-separator").hidden = false;
- this._document.getElementById("reminder-0minutes-menuitem").hidden = false;
- this._document.getElementById("reminder-5minutes-menuitem").hidden = false;
- this._document.getElementById("reminder-15minutes-menuitem").hidden = false;
- this._document.getElementById("reminder-30minutes-menuitem").hidden = false;
- this._document.getElementById("reminder-minutes-separator").hidden = false;
- this._document.getElementById("reminder-1hour-menuitem").hidden = false;
- this._document.getElementById("reminder-2hours-menuitem").hidden = false;
- this._document.getElementById("reminder-12hours-menuitem").hidden = false;
- this._document.getElementById("reminder-hours-separator").hidden = false;
- this._document.getElementById("reminder-1day-menuitem").hidden = false;
- this._document.getElementById("reminder-2days-menuitem").hidden = false;
- this._document.getElementById("reminder-1week-menuitem").hidden = false;
-
- this._document.getElementById("timezone-starttime").hidden = false;
- this._document.getElementById("timezone-endtime").hidden = false;
-
- }
- },
-
- // This will remove the time value from the repeat part and tooltip.
- updateRepeat: function _updateRepeat()
- {
- var repeatDetails = this._document.getElementById("repeat-details").childNodes;
- if (repeatDetails.length == 3) {
- this._document.getElementById("repeat-details").removeChild(repeatDetails[2]);
- var toolTip = repeatDetails[0].getAttribute("tooltiptext");
- var tmpArray = toolTip.split("\n");
- tmpArray.splice(2,1);
- repeatDetails[0].setAttribute("tooltiptext", tmpArray.join("\n"));
- repeatDetails[1].setAttribute("tooltiptext", tmpArray.join("\n"));
+ // Switch window menu display
+ this._document.getElementById("options-attachments-menu").collapsed = false;
+ this._document.getElementById("exchWebService-options-attachments").collapsed = true;
}
},
-
- selectedCalendarChanged: function _selectedCalendarChanged(aMenuList)
- {
- updateCalendar();
-
- this.updateScreen(this._window.calendarItem, getCurrentCalendar());
- },
-
}
-if (!exchWebService) var exchWebService = {};
-
-exchWebService.eventDialog = {
-
- _initialized: false,
- onLoad: function _onLoad() {
- if (this._initialized) return;
-
- // exchWebService.eventDialog.updateAttendees();
- },
-
- editAttendees: function _editAttendees() {
- let savedWindow = window;
- let calendar = getCurrentCalendar();
-
- var callback = function (attendees, organizer, startTime, endTime) {
- savedWindow.attendees = attendees;
- if (organizer) {
- // In case we didn't have an organizer object before we
- // added attendees to our event we take the one created
- // by the 'invite attendee'-dialog.
- if (savedWindow.organizer) {
- // The other case is that we already had an organizer object
- // before we went throught the 'invite attendee'-dialog. In that
- // case make sure we don't carry over attributes that have been
- // set to their default values by the dialog but don't actually
- // exist in the original organizer object.
- if (!savedWindow.organizer.id) {
- organizer.id = null;
- }
- if (!savedWindow.organizer.role) {
- organizer.role = null;
- }
- if (!savedWindow.organizer.participationStatus) {
- organizer.participationStatus = null;
- }
- if (!savedWindow.organizer.commonName) {
- organizer.commonName = null;
- }
- }
- savedWindow.organizer = organizer;
- }
- var duration = endTime.subtractDate(startTime);
- startTime = startTime.clone();
- endTime = endTime.clone();
- var kDefaultTimezone = calendarDefaultTimezone();
- gStartTimezone = startTime.timezone;
- gEndTimezone = endTime.timezone;
- gStartTime = startTime.getInTimezone(kDefaultTimezone);
- gEndTime = endTime.getInTimezone(kDefaultTimezone);
- gItemDuration = duration;
- // exchWebService.eventDialog.updateAttendees();
- updateDateTime();
- updateAllDay();
- if (isAllDay != gStartTime.isDate) {
- setShowTimeAs(gStartTime.isDate)
- }
- };
-
- var startTime = gStartTime.getInTimezone(gStartTimezone);
- var endTime = gEndTime.getInTimezone(gEndTimezone);
-
- var isAllDay = getElementValue("event-all-day", "checked");
- if (isAllDay) {
- startTime.isDate = true;
- endTime.isDate = true;
- endTime.day += 1;
- } else {
- startTime.isDate = false;
- endTime.isDate = false;
- }
-
- var menuItem = document.getElementById('options-timezone-menuitem');
- var displayTimezone = true;
- if( menuItem != null)
- displayTimezone = menuItem.getAttribute('checked') == 'true';
-
- var args = new Object();
- args.startTime = startTime;
- args.endTime = endTime;
- args.displayTimezone = displayTimezone;
- args.attendees = window.attendees;
- args.organizer = window.organizer && window.organizer.clone();
- args.calendar = calendar;
- args.item = window.calendarItem;
- args.onOk = callback;
- args.fbWrapper = window.fbWrapper;
-
- // open the dialog modally
- openDialog(
- "chrome://calendar/content/calendar-event-dialog-attendees.xul",
- "_blank",
- "chrome,titlebar,modal,resizable",
- args);
- }
-}
-
-window.addEventListener("load", exchWebService.eventDialog.onLoad, false);
-
-
-var tmpEventDialog = new exchEventDialog(document, window);
-window.addEventListener("load", function () { window.removeEventListener("load",arguments.callee,false); tmpEventDialog.onLoad(); }, true);
-
+var ewsCalendarEventDialog = new exchCalendarEventDialog(document, window);
+window.addEventListener("load", function () { ewsCalendarEventDialog.onLoad(); }, false);
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/calendar-event-dialog.xul calendar-exchange-provider-4.0.0~beta4/chrome/content/calendar-event-dialog.xul
--- calendar-exchange-provider-3.9.0/chrome/content/calendar-event-dialog.xul 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/calendar-event-dialog.xul 2017-07-03 22:10:10.000000000 +0200
@@ -1,148 +1,62 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: GPL 3.0
- *
- * The contents of this file are subject to the General Public License
- * 3.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.gnu.org/licenses/gpl.html
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * ## Exchange 2007/2010 Calendar and Tasks Provider.
- * ## For Thunderbird with the Lightning add-on.
- *
- * Author: Michel Verbraak (info@1st-setup.nl)
- * Website: http://www.1st-setup.nl/wordpress/?page_id=133
- * email: exchangecalendar@extensions.1st-setup.nl
- *
- *
- * This code uses parts of the Microsoft Exchange Calendar Provider code on which the
- * "Exchange Data Provider for Lightning" was based.
- * The Initial Developer of the Microsoft Exchange Calendar Provider Code is
- * Andrea Bittau <a.bittau@cs.ucl.ac.uk>, University College London
- * Portions created by the Initial Developer are Copyright (C) 2009
- * the Initial Developer. All Rights Reserved.
- *
- * ***** BEGIN LICENSE BLOCK *****/
--->
-<?xml-stylesheet type="text/css" href="chrome://global/skin/"?>
-<?xml-stylesheet type="text/css" href="chrome://global/skin/xul.css"?>
-<?xml-stylesheet type="text/css" href="chrome://messenger/skin/messengercompose/messengercompose.css"?>
-<?xml-stylesheet type="text/css" href="chrome://exchangecalendar/skin/itemBodyEditor.css"?>
-<?xml-stylesheet type="text/css" href="chrome://exchangecalendar/skin/exchWebServiceEditor.css"?>
+
<!DOCTYPE dialog [
-
-<!ENTITY % eventDialogDTD SYSTEM "chrome://calendar/locale/calendar-event-dialog.dtd">
+ <!ENTITY % eventDialogDTD SYSTEM "chrome://calendar/locale/calendar-event-dialog.dtd">
%eventDialogDTD;
-
-<!ENTITY % dtd1 SYSTEM "chrome://exchangecalendar/locale/calendar-event-dialog.dtd" >
+ <!ENTITY % dtd1 SYSTEM "chrome://exchangecalendar/locale/attachments-view.dtd" >
%dtd1;
]>
-<?xul-overlay href="chrome://exchangecalendar/content/attachments-view.xul"?>
-<overlay id="exchWebService-calendar-event-dialog.xul"
- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+<?xml-stylesheet type="text/css" href="chrome://exchangecalendar/skin/attachments-view.css"?>
+<?xml-stylesheet type="text/css" href="chrome://calendar/skin/calendar-event-dialog.css"?>
+<?xml-stylesheet type="text/css" href="chrome://calendar/content/calendar-event-dialog.css"?>
+
+
+<overlay id="exchWebService-calendar-event-dialog"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
<script type="application/javascript" src="chrome://exchangecalendar/content/calendar-event-dialog.js"/>
- <script type="application/javascript" src="chrome://calendar/content/calendar-event-dialog.js"/>
- <command id="cmd_attendees"
- oncommand="exchWebService.eventDialog.editAttendees();"/>
- <rows id="event-grid-rows" insertbefore = "event-grid-alarmrow">
- <row id="exchWebService-owner-row" collapsed="true" insertafter="event-grid-title-row">
- <label value="&exchWebService.owner.label;"/>
- <label id="exchWebService-owner-label" value=""/>
- </row>
- <row id="event-grid-category-color-row">
- <hbox id="event-grid-category-box">
- <menulist id="item-calendar" oncommand="tmpEventDialog.selectedCalendarChanged(this);"/>
- </hbox>
- </row>
- <separator id="exchWebService-details-separator" hidden="true" class="groove" insertafter="event-grid-todo-status-row"/>
- <row id="exchWebService-details-row1" align="center"
- collapsed="true" insertafter="exchWebService-details-separator">
- <label value="&exchWebService.totalWork.label;"
- disable-on-readonly="true"/>
- <hbox align="center">
- <textbox id="exchWebService-totalWork-count"
- increment="10" min="0" type="number" size="3" value="0" disable-on-readonly="true"/>
- <label value="&exchWebService.mileage.label;"
- disable-on-readonly="true"/>
- <textbox id="exchWebService-mileage-count" value="" disable-on-readonly="true"/>
- </hbox>
- </row>
- <row id="exchWebService-details-row2" align="center"
- collapsed="true" insertafter="exchWebService-details-row1">
- <label value="&exchWebService.actualWork.label;"
- disable-on-readonly="true"/>
- <hbox align="center">
- <textbox id="exchWebService-actualWork-count"
- increment="10" min="0" type="number" size="3" value="0" disable-on-readonly="true"/>
- <label value="&exchWebService.billingInformation.label;"
- disable-on-readonly="true"/>
- <textbox id="exchWebService-billingInformation-count" value="" disable-on-readonly="true"/>
- </hbox>
- </row>
- <row id="exchWebService-details-row3" align="center"
- collapsed="true" insertafter="exchWebService-details-row2">
- <label value="&exchWebService.companies.label;"
- disable-on-readonly="true"/>
- <textbox id="exchWebService-companies-count" value="" disable-on-readonly="true"/>
- </row>
- </rows>
- <rows flex="1" id="event-grid-rows" >
- <row id="exchWebService-owner-row" collapsed="true" insertafter="event-grid-title-row">
- <label value="&exchWebService.owner.label;"/>
- <label id="exchWebService-owner-label" value=""/>
- </row>
- <row id="event-grid-category-color-row">
- <hbox id="event-grid-category-box">
- <menulist id="item-calendar" oncommand="tmpEventDialog.selectedCalendarChanged(this);"/>
- </hbox>
- </row>
- <separator id="exchWebService-details-separator" hidden="true" class="groove" insertafter="event-grid-todo-status-row"/>
- <row id="exchWebService-details-row1" align="center"
- collapsed="true" insertafter="exchWebService-details-separator">
- <label value="&exchWebService.totalWork.label;"
- disable-on-readonly="true"/>
- <hbox align="center">
- <textbox id="exchWebService-totalWork-count"
- increment="10" min="0" type="number" size="3" value="0" disable-on-readonly="true"/>
- <label value="&exchWebService.mileage.label;"
- disable-on-readonly="true"/>
- <textbox id="exchWebService-mileage-count" value="" disable-on-readonly="true"/>
- </hbox>
- </row>
- <row id="exchWebService-details-row2" align="center"
- collapsed="true" insertafter="exchWebService-details-row1">
- <label value="&exchWebService.actualWork.label;"
- disable-on-readonly="true"/>
- <hbox align="center">
- <textbox id="exchWebService-actualWork-count"
- increment="10" min="0" type="number" size="3" value="0" disable-on-readonly="true"/>
- <label value="&exchWebService.billingInformation.label;"
- disable-on-readonly="true"/>
- <textbox id="exchWebService-billingInformation-count" value="" disable-on-readonly="true"/>
- </hbox>
- </row>
- <row id="exchWebService-details-row3" align="center"
- collapsed="true" insertafter="exchWebService-details-row2">
- <label value="&exchWebService.companies.label;"
- disable-on-readonly="true"/>
- <textbox id="exchWebService-companies-count" value="" disable-on-readonly="true"/>
- </row>
- </rows>
- <tabbox
- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" id="event-grid-tabbox" selectedIndex="2" flex="1">
- <tabpanels id="event-grid-tabpanels" flex="1" selectedIndex="2">
- <tabpanel id="event-grid-tabpanel-description">
- <itemBodyEditor id="exchWebService-body-editor"
- flex="1"
- insertafter="item-description"
- disable-on-readonly="true"/>
- </tabpanel>
- </tabpanels>
- </tabbox>
-</overlay>
\ Kein Zeilenumbruch am Dateiende.
+
+ <!-- Commands -->
+ <commandset id="itemCommands">
+ <command id="exchWebService_addAttachmentDialog"
+ oncommand='sendMessage( {command: "exchWebService_addAttachmentDialog"} );'/>
+ </commandset>
+
+ <!-- Update windows menu -->
+ <toolbox id="event-toolbox">
+ <menubar id="event-menubar">
+ <menu id="options-menu">
+ <menupopup id="options-menupopup">
+ <menu id="options-attachments-menu"
+ collapsed="false" />
+
+ <menuitem id="exchWebService-options-attachments"
+ insertafter="options-attendees-menuitem"
+ label="&exchWebServie.add.attachment.button.label;"
+ command="exchWebService_addAttachmentDialog"
+ collapsed="true" />
+ </menupopup>
+ </menu>
+ </menubar>
+ </toolbox>
+
+ <!-- Update toolbar -->
+ <toolbarpalette id="event-toolbarpalette">
+ <toolbarbutton id="exchWebService-add-attachment-button"
+ mode="dialog"
+ class="cal-event-toolbarbutton toolbarbutton-1"
+ label="&exchWebServie.add.attachment.button.label;"
+ disable-on-readonly="true"
+ removable="true"
+ command="exchWebService_addAttachmentDialog"
+ hidden="true"/>
+ </toolbarpalette>
+
+ <!-- Add exchangecalendar attachment button
+ Note: defaultset needs to be synced with common-central/calendar/base/content/dialogs/calendar-event-dialog.xul -->
+ <toolbar id="event-toolbar"
+ defaultset="button-saveandclose,button-attendees,button-privacy,button-url,exchWebService-add-attachment-button,button-delete" >
+ </toolbar>
+
+</overlay>
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/ecCalendarCreation.js calendar-exchange-provider-4.0.0~beta4/chrome/content/ecCalendarCreation.js
--- calendar-exchange-provider-3.9.0/chrome/content/ecCalendarCreation.js 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/ecCalendarCreation.js 2017-07-03 22:10:10.000000000 +0200
@@ -147,50 +147,65 @@
},
+ /*
+ * saveSettings: save calendar settings after calendar wizard completed
+ *
+ * Lightning original code to save calendar can be found in:
+ * comm-central/calendar/resources/content/calendarCreation.js
+ */
saveSettings: function _saveSettings()
{
this.globalFunctions.LOG("saveSettings Going to create the calendar in prefs.js");
- // Calculate the new calendar.id
- var newCalId = this.globalFunctions.getUUID();
+ // Calculate the new calendar.id and properties
+ let newCalId = this.globalFunctions.getUUID();
+ let newCalName = this._document.getElementById("calendar-name").value;
+ let newCalColor = this._document.getElementById("calendar-color").value;
// Save settings in dialog to new cal id.
tmpSettingsOverlay.exchWebServicesSaveExchangeSettingsByCalId(newCalId);
// Need to save the useOfflineCache preference separetly because it is not part of the main.
this.prefs = Cc["@mozilla.org/preferences-service;1"]
- .getService(Ci.nsIPrefService)
- .getBranch("extensions.exchangecalendar@extensions.1st-setup.nl."+newCalId+".");
+ .getService(Ci.nsIPrefService)
+ .getBranch("extensions.exchangecalendar@extensions.1st-setup.nl."+newCalId+".");
this.prefs.setBoolPref("useOfflineCache", this._document.getElementById("exchange-cache").checked);
this.prefs.setIntPref("exchangePrefVersion", 1);
// We create a new URI for this calendar which will contain the calendar.id
- var ioService = Cc["@mozilla.org/network/io-service;1"]
- .getService(Ci.nsIIOService);
- var tmpURI = ioService.newURI("https://auto/"+newCalId, null, null);
+ var ioService = Cc["@mozilla.org/network/io-service;1"]
+ .getService(Ci.nsIIOService);
+ var tmpURI = ioService.newURI("https://auto/"+newCalId, null, null);
+ // Register calendar to global settings
+ var calPrefs = Cc["@mozilla.org/preferences-service;1"]
+ .getService(Ci.nsIPrefService)
+ .getBranch("calendar.registry."+newCalId+".");
+ calPrefs.setCharPref("name", newCalName);
+
+ // Create the new calendar object
+ // Should be synced with Lightning doCreateCalendar() code
var calManager = Cc["@mozilla.org/calendar/manager;1"]
.getService(Ci.calICalendarManager);
+
var newCal = calManager.createCalendar("exchangecalendar", tmpURI);
newCal.id = newCalId;
- newCal.name = this._document.getElementById("calendar-name").value;
+ newCal.name = newCalName;
- var calPrefs = Cc["@mozilla.org/preferences-service;1"]
- .getService(Ci.nsIPrefService)
- .getBranch("calendar.registry."+newCalId+".");
+ newCal.setProperty("color", newCalColor);
- calPrefs.setCharPref("name", this._document.getElementById("calendar-name").value);
+ newCal.setProperty("cache.enabled", false);
- newCal.setProperty("color", this._document.getElementById('calendar-color').color);
if (!this._document.getElementById("fire-alarms").checked) {
newCal.setProperty("suppressAlarms", true);
}
+ // End of sync
+ var emailCalendarIdentity = this._document.getElementById("email-identity-menulist").selectedItem;
- var selItem = this._document.getElementById("email-identity-menulist").selectedItem;
- if (selItem) {
- var identity = selItem.getAttribute("value");
+ if (emailCalendarIdentity) {
+ var identity = emailCalendarIdentity.getAttribute("value");
}
else {
var identity = "";
@@ -199,13 +214,11 @@
newCal.setProperty("imip.identity.key", identity);
- newCal.setProperty("cache.enabled", false);
-
Cc["@mozilla.org/preferences-service;1"]
- .getService(Ci.nsIPrefService).savePrefFile(null);
+ .getService(Ci.nsIPrefService).savePrefFile(null);
+ // Finally register completly the new calendar
calManager.registerCalendar(newCal);
-
},
}
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/exchangeSettingsOverlay.js calendar-exchange-provider-4.0.0~beta4/chrome/content/exchangeSettingsOverlay.js
--- calendar-exchange-provider-3.9.0/chrome/content/exchangeSettingsOverlay.js 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/exchangeSettingsOverlay.js 2017-07-03 22:10:10.000000000 +0200
@@ -431,7 +431,7 @@
{
this.globalFunctions.LOG("exchWebServicesGetFolderOK: aFolderID:"+aFolderID+", aChangeKey:"+aChangeKey+", aFolderClass:"+aFolderClass);
- if (aFolderClass == "IPF.Appointment") {
+ if (aFolderClass == "IPF.Appointment" || aFolderClass == "IPF.Task") {
this.exchWebServicesgFolderID = aFolderID;
this.exchWebServicesgChangeKey = aChangeKey;
this.gexchWebServicesDetailsChecked = true;
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/exchService-followup-event-dialog.xml calendar-exchange-provider-4.0.0~beta4/chrome/content/exchService-followup-event-dialog.xml
--- calendar-exchange-provider-3.9.0/chrome/content/exchService-followup-event-dialog.xml 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/exchService-followup-event-dialog.xml 2017-07-03 22:10:10.000000000 +0200
@@ -445,7 +445,7 @@
accesskey="&event.menu.options.accesskey;">
<menupopup id="options-menupopup"
onpopupshowing="onPopupShowing(this)">
- <menuitem id="options-attendess-menuitem"
+ <menuitem id="options-attendees-menuitem"
label="&event.menu.options.attendees.label;"
accesskey="&event.menu.options.attendees.accesskey;"
command="cmd_attendees"
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/exchWebServiceEditor.xml calendar-exchange-provider-4.0.0~beta4/chrome/content/exchWebServiceEditor.xml
--- calendar-exchange-provider-3.9.0/chrome/content/exchWebServiceEditor.xml 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/exchWebServiceEditor.xml 2017-07-03 22:10:10.000000000 +0200
@@ -36,7 +36,12 @@
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<binding id="exchWebServiceEditor">
- <content>
+ <!-- CSS needed to correctly display color buttons (font and background) -->
+ <resources>
+ <stylesheet src="chrome://messenger/skin/messengercompose/messengercompose.css" />
+ </resources>
+
+ <content>
<xul:vbox flex="1">
<xul:toolbox anonid="FormatToolbox" mode="icons">
@@ -105,7 +110,7 @@
state="state_all"/>
<xul:toolbarseparator class="toolbarseparator-standard"/>
<xul:toolbaritem class="formatting-button">
- <xul:stack align="enter" state="rgb(102,102,102)">
+ <xul:stack align="center" state="rgb(102,102,102)">
<xul:box style="background-color:#FFFFFF"
anonid="cmd_backgroundColor"
class="color-button"
@@ -192,63 +197,72 @@
flex="1"/>
</xul:vbox>
- </content>
+ </content>
<implementation>
<constructor><![CDATA[
- this.editorElement = document.getAnonymousElementByAttribute(this, "anonid", "editor");
var self=this;
+
+ // To be able to set correct HTML content
+ this.globalFunctions = Components.classes["@1st-setup.nl/global/functions;1"]
+ .getService(Components.interfaces.mivFunctions);
+
+ this.editorElement = document.getAnonymousElementByAttribute(this, "anonid", "editor");
if (this.editorElement) {
this.commandManager = this.editorElement.commandManager;
this.editorClickFunction = function(aEvent) { self.onClickEditor(aEvent);};
- this.editorElement.addEventListener("click", this.editorClickFunction, true);
+ this.editorElement.addEventListener("click", this.editorClickFunction, false);
this.editorDblClickFunction = function(aEvent) { self.onDblClickEditor(aEvent);};
- this.editorElement.addEventListener("dblclick", this.editorDblClickFunction, true);
+ this.editorElement.addEventListener("dblclick", this.editorDblClickFunction, false);
this.editorKeyPressFunction = function(aEvent) { self.onKeyPressEditor(aEvent);};
- this.editorElement.addEventListener("keyup", this.editorKeyPressFunction, true);
+ this.editorElement.addEventListener("keyup", this.editorKeyPressFunction, false);
this.editorMouseOver = function(aEvent) { self.onMouseOver(aEvent);};
- this.editorMouseOut = function(aEvent) { self.onMouseOut(aEvent);};
-
this.editorElement.addEventListener("mouseover", this.editorMouseOver , false);
+
+ this.editorMouseOut = function(aEvent) { self.onMouseOut(aEvent);};
this.editorElement.addEventListener("mouseout", this.editorMouseOut, false);
+ // Set default document to empty HTML content
+ this.editorElement.contentDocument.documentElement.innerHTML = this.globalFunctions.fromText2HTML(null);
}
- this.atomService = Components.classes["@mozilla.org/atom-service;1"].getService(Components.interfaces.nsIAtomService);
+ this.atomService = Components.classes["@mozilla.org/atom-service;1"]
+ .getService(Components.interfaces.nsIAtomService);
+
+ this.connectAllCommandListenerToolbar("FormatToolbar");
- this.connectButtons("FormatToolbar");
// Connect color button
this.bgColorFunction = function(){ self.selectColor("cmd_backgroundColor");};
var bgColorElement = document.getAnonymousElementByAttribute(this, "anonid", "cmd_backgroundColor")
- bgColorElement.addEventListener("click", this.bgColorFunction, true);
+ bgColorElement.addEventListener("click", this.bgColorFunction, false);
this.fontColorFunction = function(){ self.selectColor("cmd_fontColor");};
var fontColorElement = document.getAnonymousElementByAttribute(this, "anonid", "cmd_fontColor")
- fontColorElement.addEventListener("click", this.fontColorFunction, true);
+ fontColorElement.addEventListener("click", this.fontColorFunction, false);
this.highlightColor = "#FFFFFF";
this.fontColor = "#000000";
- // Fill fontfac popup menu
+ // Connect FontFace popup menu
this.menuPopupFunction = function(event){ self.selectFont("cmd_fontFace", event.target.value);};
this.menuPopup = document.getAnonymousElementByAttribute(this, "anonid", "fontFaceSelect");
- this.menuPopup.addEventListener("command", this.menuPopupFunction, true);
+ this.menuPopup.addEventListener("command", this.menuPopupFunction, false);
this.fillFontFace();
+ // Connect HyperLink buttons
this.addLinkFunction = function(){ self.addLink();};
var addLinkElement = document.getAnonymousElementByAttribute(this, "anonid", "cmd_add_link")
- addLinkElement.addEventListener("click", this.addLinkFunction, true);
+ addLinkElement.addEventListener("click", this.addLinkFunction, false);
this.removeLinkFunction = function(){ self.removeLink();};
var removeLinkElement = document.getAnonymousElementByAttribute(this, "anonid", "cmd_remove_link")
- removeLinkElement.addEventListener("click", this.removeLinkFunction, true);
+ removeLinkElement.addEventListener("click", this.removeLinkFunction, false);
this.editLinkFunction = function(){ self.editLink();};
var editLinkElement = document.getAnonymousElementByAttribute(this, "anonid", "cmd_edit_link")
- editLinkElement.addEventListener("click", this.editLinkFunction, true);
-
+ editLinkElement.addEventListener("click", this.editLinkFunction, false);
]]></constructor>
<destructor><![CDATA[
@@ -256,40 +270,52 @@
this.editorElement.removeEventListener("click", this.editorClickFunction, false);
this.editorElement.removeEventListener("keyup", this.editorKeyPressFunction, false);
- this.editorElement.removeEventListener("dblclick", this.editorDblClickFunction, true);
+ this.editorElement.removeEventListener("dblclick", this.editorDblClickFunction, false);
this.editorElement.removeEventListener("mouseover", this.editorMouseOver , false);
this.editorElement.removeEventListener("mouseout", this.editorMouseOut, false);
}
- this.disconnectButtons("FormatToolbar");
- document.getAnonymousElementByAttribute(this, "anonid", "cmd_backgroundColor").removeEventListener("click", this.bgColorFunction, false);
- document.getAnonymousElementByAttribute(this, "anonid", "cmd_fontColor").removeEventListener("click", this.fontColorFunction, false);
+
+ this.removeAllCommandListenerToolbar("FormatToolbar");
+
+ // Disconnect color button
+ document.getAnonymousElementByAttribute(this, "anonid", "cmd_backgroundColor")
+ .removeEventListener("click", this.bgColorFunction, false);
+ document.getAnonymousElementByAttribute(this, "anonid", "cmd_fontColor")
+ .removeEventListener("click", this.fontColorFunction, false);
+
+ // Disconnect Font face button
if (this.menuPopupFunction) {
this.menuPopup.removeEventListener("command", this.menuPopupFunction, false);
}
- document.getAnonymousElementByAttribute(this, "anonid", "cmd_add_link").removeEventListener("click", this.addLinkFunction, true);
- document.getAnonymousElementByAttribute(this, "anonid", "cmd_remove_link").removeEventListener("click", this.removeLinkFunction, true);
- document.getAnonymousElementByAttribute(this, "anonid", "cmd_edit_link").removeEventListener("click", this.editLinkFunction, true);
+
+ // Disconnect HyperLink buttons
+ document.getAnonymousElementByAttribute(this, "anonid", "cmd_add_link")
+ .removeEventListener("click", this.addLinkFunction, false);
+ document.getAnonymousElementByAttribute(this, "anonid", "cmd_remove_link")
+ .removeEventListener("click", this.removeLinkFunction, false);
+ document.getAnonymousElementByAttribute(this, "anonid", "cmd_edit_link")
+ .removeEventListener("click", this.editLinkFunction, false);
]]></destructor>
- <property name="content">
- <getter>
- <![CDATA[
- return this.editorElement.contentDocument.documentElement.innerHTML;
- ]]>
- </getter>
- <setter>
- <![CDATA[
- if (this.editorElement) {
- this.editorElement.contentDocument.documentElement.innerHTML = val;
- }
- ]]>
- </setter>
- </property>
+ <property name="content">
+ <getter>
+ <![CDATA[
+ return this.editorElement.contentDocument.documentElement.innerHTML;
+ ]]>
+ </getter>
+ <setter>
+ <![CDATA[
+ if (this.editorElement) {
+ this.editorElement.contentDocument.documentElement.innerHTML = this.globalFunctions.fromText2HTML(val);
+ }
+ ]]>
+ </setter>
+ </property>
<method name="fillFontFace">
<body><![CDATA[
- if (gExchWebServiceLocalFonts == undefined) {
+ if (gExchWebServiceLocalFonts === undefined) {
// Build list of all local fonts once per editor
try {
var enumerator = Components.classes["@mozilla.org/gfx/fontenumerator;1"]
@@ -300,7 +326,7 @@
catch(e) { }
}
- if (gExchWebServiceLocalFonts != undefined) {
+ if (gExchWebServiceLocalFonts !== undefined) {
var itemNode = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "menuitem");
itemNode.setAttribute("label", "Variable width");
@@ -323,7 +349,7 @@
]]></body>
</method>
- <method name="connectButtons">
+ <method name="connectAllCommandListenerToolbar">
<parameter name="aAnonId" />
<body><![CDATA[
var toolbar = document.getAnonymousElementByAttribute(this, "anonid", aAnonId);
@@ -335,15 +361,15 @@
if (toolbar) {
var toolbarButtons = toolbar.getElementsByTagName("xul:toolbarbutton");
for (var i=0; i<toolbarButtons.length;i++) {
- if ((toolbarButtons[i].hasAttribute("connect")) && (toolbarButtons[i].getAttribute("connect") == "true")) {
- this.connectButton(toolbarButtons[i].getAttribute("anonid"), aAnonId);
+ if ((toolbarButtons[i].hasAttribute("connect")) && (toolbarButtons[i].getAttribute("connect") === "true")) {
+ this.addCommandListener(toolbarButtons[i].getAttribute("anonid"), aAnonId);
}
}
}
]]></body>
</method>
- <method name="connectButton">
+ <method name="addCommandListener">
<parameter name="aAnonId" />
<parameter name="aStore" />
<body><![CDATA[
@@ -353,22 +379,22 @@
this.functions[aStore] = {};
}
this.functions[aStore][aAnonId] = function() { self.toggleButton(aAnonId);};
- document.getAnonymousElementByAttribute(this, "anonid", aAnonId).addEventListener("command", this.functions[aStore][aAnonId], true);
+ document.getAnonymousElementByAttribute(this, "anonid", aAnonId).addEventListener("command", this.functions[aStore][aAnonId], false);
]]></body>
</method>
- <method name="disconnectButtons">
+ <method name="removeAllCommandListenerToolbar">
<parameter name="aAnonId" />
<body><![CDATA[
if ((this.functions) && (this.functions[aAnonId])) {
for (var name in this.functions[aAnonId]) {
- this.disconnectButton(name, aAnonId);
+ this.removeCommandListener(name, aAnonId);
}
}
]]></body>
</method>
- <method name="disconnectButton">
+ <method name="removeCommandListener">
<parameter name="aAnonId" />
<parameter name="aStore" />
<body><![CDATA[
@@ -391,10 +417,7 @@
<method name="onKeyPressEditor">
<parameter name="aEvent" />
<body><![CDATA[
-//if (aEvent) {
-//dump("aEvent.keyCode:"+aEvent.keyCode+"\n");
-//}
- if ( ( (aEvent.keyCode > 36) && (aEvent.keyCode < 41) ) || (aEvent.keyCode == 33) || (aEvent.keyCode == 34)) {
+ if ( ( (aEvent.keyCode > 36) && (aEvent.keyCode < 41) ) || (aEvent.keyCode === 33) || (aEvent.keyCode === 34)) {
this.onClickEditor(aEvent);
}
]]></body>
@@ -405,12 +428,9 @@
<body><![CDATA[
{
var href = "";
- var isKeyCommand = (event.type == "command");
+ var isKeyCommand = (event.type === "command");
var linkNode = isKeyCommand ? this.editorElement.commandDispatcher.focusedElement
: event.originalTarget;
-//dump("event.type:"+event.type+"\n");
-//dump("event.originalTarget:"+event.originalTarget+"\n");
-//dump("linkNode:"+linkNode+"\n");
while (linkNode instanceof Element) {
if (linkNode instanceof HTMLAnchorElement ||
linkNode instanceof HTMLAreaElement ||
@@ -434,7 +454,6 @@
}
linkNode = linkNode.parentNode;
}
-//dump("href:"+href+"\n");
return href ? {href: href, linkNode: linkNode} : null;
}
]]></body>
@@ -482,27 +501,27 @@
}
var color = this.getCStringCommandState("cmd_fontColor", this.commandManager, this.editorElement.contentWindow, "state_attribute");
- if (color == "") {
+ if (color === "") {
color = "transparent";
}
else {
color = this.ConvertRGBColorIntoHEXColor(color);
}
document.getAnonymousElementByAttribute(this, "anonid", "cmd_fontColor").setAttribute("style","background-color:"+color);
-
+
var aFirst = { value: false };
var aAny = { value: false };
var aAll = { value: false };
var propAtom = this.atomService.getAtom("font");
var edElement = this.editorElement.getHTMLEditor(this.editorElement.contentWindow);
- color = edElement.getInlinePropertyWithAttrValue(propAtom, "bgcolor", null, aFirst, aAny, aAll);
+ color = edElement.getInlinePropertyWithAttrValue(propAtom, "bgcolor", null, aFirst, aAny, aAll);
document.getAnonymousElementByAttribute(this, "anonid", "cmd_backgroundColor").setAttribute("style","background-color:"+color);
var font = this.getCStringCommandState("cmd_fontFace", this.commandManager, this.editorElement.contentWindow, "state_attribute");
font = font.replace(/"/g, "");
var fontElement;
- if (font.indexOf(",") > -1) {
+ if (font.indexOf(",") !== -1) {
var fonts = font.split(",");
for(var i = 0; ((i<fonts.length) && (!fontElement)); i++) {
fontElement = document.getAnonymousElementByAttribute(this, "label", fonts[i]);
@@ -577,7 +596,7 @@
// Get current color
var color = this.getCStringCommandState(aAnonId, this.commandManager, this.editorElement.contentWindow, "state_attribute");
- if (color == "") {
+ if (color === "") {
color = "transparent";
}
else {
@@ -594,7 +613,7 @@
element.setAttribute("style","background-color:"+colorObj.TextColor);
- if (aAnonId == "cmd_fontColor") {
+ if (aAnonId === "cmd_fontColor") {
var state = Components.classes["@mozilla.org/embedcomp/command-params;1"]
.createInstance(Components.interfaces.nsICommandParams);
state.setCStringValue("state_attribute", colorObj.TextColor);
@@ -614,11 +633,20 @@
<body><![CDATA[
if ( /rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/.test(color) ) {
var r = Number(RegExp.$1).toString(16);
- if (r.length == 1) r = "0"+r;
+ if (r.length === 1){
+ r = "0"+r;
+ }
+
var g = Number(RegExp.$2).toString(16);
- if (g.length == 1) g = "0"+g;
+ if (g.length === 1) {
+ g = "0"+g;
+ }
+
var b = Number(RegExp.$3).toString(16);
- if (b.length == 1) b = "0"+b;
+ if (b.length === 1) {
+ b = "0"+b;
+ }
+
return "#"+r+g+b;
}
else
@@ -662,7 +690,7 @@
if (this.commandManager) {
var button = document.getAnonymousElementByAttribute(this, "anonid", aAnonId);
if (button.hasAttribute("state")) {
- if (aAnonId.indexOf("cmd_align") > -1) {
+ if (aAnonId.indexOf("cmd_align") !== -1) {
button.checked = (aAnonId.indexOf(this.getCStringCommandState("cmd_align", this.commandManager, this.editorElement.contentWindow, "state_attribute")) > 0);
}
else {
@@ -676,7 +704,7 @@
<parameter name="aAnonId" />
<body><![CDATA[
if (this.commandManager) {
- if (aAnonId.indexOf("cmd_align") > -1) {
+ if (aAnonId.indexOf("cmd_align") !== -1) {
var state = Components.classes["@mozilla.org/embedcomp/command-params;1"]
.createInstance(Components.interfaces.nsICommandParams);
state.setCStringValue("state_attribute", aAnonId.substr(10));
@@ -685,7 +713,7 @@
else {
this.commandManager.doCommand(aAnonId, null, null);
}
-// this.setButtonState(aAnonId);
+
this.onClickEditor();
}
]]></body>
@@ -693,35 +721,31 @@
<method name="addLink">
<body><![CDATA[
-//dump("addLink\n");
+
var result = window.prompt("Link URL:", "http://");
if (result) {
var selObj = this.editorElement.contentDocument.getSelection();
-//dump("selObj.rangeCount:"+selObj.rangeCount+"\n");
+
var range = selObj.getRangeAt(0);
var textElement = range.startContainer;
var parent = textElement.parentElement;
-//dump("parent:"+parent+"\n");
+
var startOffset = range.startOffset;
-//dump("1. parent.outerHTML:"+parent.outerHTML+"\n");
-//dump("range.startOffset:"+range.startOffset+"\n");
var newLink = document.createElement("a");
newLink.setAttribute("href", result);
range.surroundContents(newLink);
-//dump("newLink.outerHTML:"+newLink.outerHTML+"\n");
var splitText = textElement.splitText(startOffset);
parent.insertBefore(newLink, splitText);
this.content = this.content;
-//dump("2. parent.outerHTML:"+parent.outerHTML+"\n");
}
]]></body>
</method>
<method name="removeLink">
<body><![CDATA[
-//dump("removeLink\n");
+
if (this.ceParams) {
var parent = this.ceParams.linkNode.parentElement;
while (this.ceParams.linkNode.firstChild) {
@@ -734,7 +758,7 @@
<method name="editLink">
<body><![CDATA[
-//dump("editLink\n");
+
if (this.ceParams) {
var result = window.prompt("Link URL:", this.ceParams.href);
if (result) {
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/lightning-item-iframe.js calendar-exchange-provider-4.0.0~beta4/chrome/content/lightning-item-iframe.js
--- calendar-exchange-provider-3.9.0/chrome/content/lightning-item-iframe.js 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/lightning-item-iframe.js 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,324 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: GPL 3.0
+ *
+ * The contents of this file are subject to the General Public License
+ * 3.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * -- Exchange 2007/2010 Calendar and Tasks Provider.
+ * -- For Thunderbird with the Lightning add-on.
+ *
+ * Author: Michel Verbraak (info@1st-setup.nl)
+ * Website: http://www.1st-setup.nl/wordpress/?page_id=133
+ * email: exchangecalendar@extensions.1st-setup.nl
+ *
+ *
+ * This code uses parts of the Microsoft Exchange Calendar Provider code on which the
+ * "Exchange Data Provider for Lightning" was based.
+ * The Initial Developer of the Microsoft Exchange Calendar Provider Code is
+ * Andrea Bittau <a.bittau@cs.ucl.ac.uk>, University College London
+ * Portions created by the Initial Developer are Copyright (C) 2009
+ * the Initial Developer. All Rights Reserved.
+ *
+ * ***** BEGIN LICENSE BLOCK *****/
+var Cu = Components.utils;
+var Ci = Components.interfaces;
+var Cc = Components.classes;
+
+Cu.import("resource://calendar/modules/calUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+function exchangeEventDialog(aDocument, aWindow)
+{
+ this._document = aDocument;
+ this._window = aWindow;
+
+ this.globalFunctions = Cc["@1st-setup.nl/global/functions;1"]
+ .getService(Ci.mivFunctions);
+}
+
+exchangeEventDialog.prototype = {
+ _initialized: false,
+ _oldCallback: null,
+
+ /*
+ * onAcceptCallback: read caller content to save extra information if caller was exchangecalendar
+ */
+ onAcceptCallback: function _onAcceptCallback(aItem, aCalendar, aOriginalItem, aIsClosing)
+ {
+ if (aCalendar.type === "exchangecalendar") {
+ if (cal.isEvent(aItem)) {
+ if (!aItem.className) {
+ var newItem = Cc["@1st-setup.nl/exchange/calendarevent;1"]
+ .createInstance(Ci.mivExchangeEvent);
+ newItem.cloneToCalEvent(aItem);
+ aItem = newItem;
+ }
+ }
+ else {
+ // Save extra exchange fields to item.
+ if (!aItem.className) {
+ var newItem = Cc["@1st-setup.nl/exchange/calendartodo;1"]
+ .createInstance(Ci.mivExchangeTodo);
+ newItem.cloneToCalEvent(aItem);
+ aItem = newItem;
+ }
+
+ aItem.totalWork = this._document.getElementById("exchWebService-totalWork-count").value;
+ aItem.actualWork = this._document.getElementById("exchWebService-actualWork-count").value;
+ aItem.mileage = this._document.getElementById("exchWebService-mileage-count").value;
+ aItem.billingInformation = this._document.getElementById("exchWebService-billingInformation-count").value;
+ aItem.companies = this._document.getElementById("exchWebService-companies-count").value;
+ }
+
+ // Copy content from HTML editor
+ try{
+ if (this.newItem) {
+ aItem.bodyType = "HTML";
+ aItem.body = this._document.getElementById("exchWebService-body-editor").content;
+ this.newItem = false;
+ }
+ else if (aItem.bodyType === "HTML") {
+ aItem.body = this._document.getElementById("exchWebService-body-editor").content;
+ }
+ } catch(err) {
+ dump("Error saving content\n");
+ }
+ }
+
+ if (this._oldCallback) {
+ this._oldCallback(aItem, aCalendar, aOriginalItem, aIsClosing);
+ }
+ },
+
+ /*
+ * Update repeat informations on Exchange tasks
+ */
+ updateRepeat: function _updateRepeat()
+ {
+ var repeatDetails = this._document.getElementById("repeat-details").childNodes;
+ if (repeatDetails.length === 3) {
+ this._document.getElementById("repeat-details").removeChild(repeatDetails[2]);
+ var toolTip = repeatDetails[0].getAttribute("tooltiptext");
+ var tmpArray = toolTip.split("\n");
+ tmpArray.splice(2,1);
+ repeatDetails[0].setAttribute("tooltiptext", tmpArray.join("\n"));
+ repeatDetails[1].setAttribute("tooltiptext", tmpArray.join("\n"));
+ }
+ },
+
+ /*
+ * Adds HTML editor for exchangecalendar items
+ * Adds extra informations for Exchange tasks
+ *
+ * As the same dialog is used for non-Exchange tasks and for events, this function
+ * removes too these details when necessary.
+ */
+ updateScreen: function _updateScreen(aItem, aCalendar)
+ {
+ var item = aItem;
+
+ if (aCalendar.type === "exchangecalendar") {
+
+ // For all item type, enable HTML editor
+
+ // Set HTML content editor
+ let itemBodyEditor = this._document.getElementById("exchWebService-body-editor");
+
+ // Try to read directly item body, otherwise fallback to item description property
+ if (item.body) {
+ itemBodyEditor.content = item.body;
+
+ // As this dialog set the bodyType, we check it to know if it's a new Item or not
+ this.newItem = item.bodyType.toLowerCase() !== "html";
+ }
+ else {
+ this.newItem = true;
+ itemBodyEditor.content = item.getProperty("DESCRIPTION");
+ }
+
+ // Display HTML content editor
+ if (item.bodyType === undefined // item is not already defined
+ || item.bodyType.toLowerCase() === "html" // current item contains HTML
+ ) {
+ // Hidde original item description editor
+ this._document.getElementById("item-description").hidden = true;
+
+ // Display our own HTML content editor
+ itemBodyEditor.setAttribute("collapsed", "false");;
+
+ itemBodyEditor.setAttribute("scrollbars","yes");
+ }
+
+ // If not an event, add Exchange task extra informations
+ if (!cal.isEvent(item)) {
+
+ // Set and display task owner
+
+ var ownerLabel = this._document.getElementById("exchWebService-owner-label");
+ if (ownerLabel) {
+ ownerLabel.setAttribute("collapsed", "false");
+ ownerLabel.value = item.owner;
+ }
+
+ // Set and display Exchange task details
+
+ this._document.getElementById("exchWebService-details-separator").hidden = false;
+ this._document.getElementById("exchWebService-details-row1").collapsed = false;
+ this._document.getElementById("exchWebService-details-row2").collapsed = false;
+ this._document.getElementById("exchWebService-details-row3").collapsed = false;
+
+ if (item.className) {
+ this._document.getElementById("exchWebService-totalWork-count").value = item.totalWork;
+ this._document.getElementById("exchWebService-actualWork-count").value = item.actualWork;
+ this._document.getElementById("exchWebService-mileage-count").value = item.mileage;
+ this._document.getElementById("exchWebService-billingInformation-count").value = item.billingInformation;
+ this._document.getElementById("exchWebService-companies-count").value = item.companies;
+ }
+
+ // Remove some standard inputs
+
+ this._document.getElementById("event-grid-location-row").hidden = true;
+
+ this._document.getElementById("reminder-none-separator").hidden = true;
+ this._document.getElementById("reminder-0minutes-menuitem").hidden = true;
+ this._document.getElementById("reminder-5minutes-menuitem").hidden = true;
+ this._document.getElementById("reminder-15minutes-menuitem").hidden = true;
+ this._document.getElementById("reminder-30minutes-menuitem").hidden = true;
+ this._document.getElementById("reminder-minutes-separator").hidden = true;
+ this._document.getElementById("reminder-1hour-menuitem").hidden = true;
+ this._document.getElementById("reminder-2hours-menuitem").hidden = true;
+ this._document.getElementById("reminder-12hours-menuitem").hidden = true;
+ this._document.getElementById("reminder-hours-separator").hidden = true;
+ this._document.getElementById("reminder-1day-menuitem").hidden = true;
+ this._document.getElementById("reminder-2days-menuitem").hidden = true;
+ this._document.getElementById("reminder-1week-menuitem").hidden = true;
+
+ this._document.getElementById("timezone-starttime").hidden = true;
+ this._document.getElementById("timezone-endtime").hidden = true;
+
+ // Manage repeat for Exchange tasks
+
+ if (this._document.getElementById("item-repeat")) {
+ this._document.getElementById("item-repeat").addEventListener("command", function() { self.updateRepeat(); }, false);
+ }
+
+ this.updateRepeat();
+ }
+ }
+
+ // For events and other calendar type, hidde back all Exchange task details, display back standard items
+ if (cal.isEvent(item)
+ || cal.type !== "exchangecalendar") {
+
+ // Hide Exchange task details
+
+ // Task owner
+ this._document.getElementById("exchWebService-owner-row").setAttribute("collapsed", "true");
+
+ // Task details
+ this._document.getElementById("exchWebService-details-separator").hidden = true;
+ this._document.getElementById("exchWebService-details-row1").collapsed = true;
+ this._document.getElementById("exchWebService-details-row2").collapsed = true;
+ this._document.getElementById("exchWebService-details-row3").collapsed = true;
+
+ // Reset standard form
+ this._document.getElementById("event-grid-location-row").hidden = false;
+ this._document.getElementById("event-grid-recurrence-row").hidden=false;
+
+ // Reset reminder select list for todo
+ this._document.getElementById("reminder-none-separator").hidden = false;
+ this._document.getElementById("reminder-0minutes-menuitem").hidden = false;
+ this._document.getElementById("reminder-5minutes-menuitem").hidden = false;
+ this._document.getElementById("reminder-15minutes-menuitem").hidden = false;
+ this._document.getElementById("reminder-30minutes-menuitem").hidden = false;
+ this._document.getElementById("reminder-minutes-separator").hidden = false;
+ this._document.getElementById("reminder-1hour-menuitem").hidden = false;
+ this._document.getElementById("reminder-2hours-menuitem").hidden = false;
+ this._document.getElementById("reminder-12hours-menuitem").hidden = false;
+ this._document.getElementById("reminder-hours-separator").hidden = false;
+ this._document.getElementById("reminder-1day-menuitem").hidden = false;
+ this._document.getElementById("reminder-2days-menuitem").hidden = false;
+ this._document.getElementById("reminder-1week-menuitem").hidden = false;
+
+ // Reset timezone start/end time
+ this._document.getElementById("timezone-starttime").hidden = false;
+ this._document.getElementById("timezone-endtime").hidden = false;
+ }
+
+ // Reset content editor when not exchangecalendar items
+ if (aCalendar.type !== "exchangecalendar") {
+ // Hidde HTML content editor
+ this._document.getElementById("item-description").hidden = false;
+ this._document.getElementById("exchWebService-body-editor").setAttribute("collapsed", "true");
+ }
+ },
+
+
+ /**
+ * Receives asynchronous messages from the parent context that contains the iframe.
+ *
+ * @param {MessageEvent} aEvent Contains the message being received
+ */
+ receiveMessage: function _receiveMessage(aEvent) {
+ let validOrigin = gTabmail ? "chrome://messenger" : "chrome://calendar";
+ if (aEvent.origin !== validOrigin) {
+ return;
+ }
+ switch (aEvent.data.command) {
+ //case "exchWebService_addAttachmentDialog": this.addAttachmentDialog(); break;
+ }
+ },
+
+ /*
+ * onLoad: setup event dialog window
+ * - Update screen according to type of item (task / event)
+ * - Add callback (once)
+ **/
+ onLoad: function _onLoad()
+ {
+ // Update screen according to task / event
+ let item = this._window.calendarItem;
+ this.updateScreen(item, item.calendar);
+
+ if (this._initialized) {
+ return;
+ }
+
+ var self = this;
+
+ // Override dialog callback to add extra exchangecalendar information processing
+ this._oldCallback = this._window.onAcceptCallback;
+ this._window.onAcceptCallback = function(aItem, aCalendar, aOriginalItem, aIsClosing) {
+ self.onAcceptCallback(aItem, aCalendar, aOriginalItem, aIsClosing);
+ };
+
+ // Add message listener to be able to receive message from parent window or tab
+ window.addEventListener("message", function(aEvent) { self.receiveMessage(aEvent); }, false);
+
+ this._initialized = true;
+ },
+
+ /*
+ * selectedCalendarChanged: modify event-dialog to add extra exchangecalendar info when an exchange calendar is selected
+ */
+ selectedCalendarChanged: function _selectedCalendarChanged(aMenuList)
+ {
+ updateCalendar();
+
+ this.updateScreen(this._window.calendarItem, getCurrentCalendar());
+ }
+}
+
+
+var exchToolsEventDialog = new exchangeEventDialog(document, window);
+
+// Add our loader to update dialog window with Exchange extra widgets if needed
+window.addEventListener("load", function () { exchToolsEventDialog.onLoad(); }, false);
+
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/lightning-item-iframe.xul calendar-exchange-provider-4.0.0~beta4/chrome/content/lightning-item-iframe.xul
--- calendar-exchange-provider-3.9.0/chrome/content/lightning-item-iframe.xul 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/lightning-item-iframe.xul 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: GPL 3.0
+ *
+ * The contents of this file are subject to the General Public License
+ * 3.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * ## Exchange 2007/2010 Calendar and Tasks Provider.
+ * ## For Thunderbird with the Lightning add-on.
+ *
+ * Author: Michel Verbraak (info@1st-setup.nl)
+ * Website: http://www.1st-setup.nl/wordpress/?page_id=133
+ * email: exchangecalendar@extensions.1st-setup.nl
+ *
+ *
+ * This code uses parts of the Microsoft Exchange Calendar Provider code on which the
+ * "Exchange Data Provider for Lightning" was based.
+ * The Initial Developer of the Microsoft Exchange Calendar Provider Code is
+ * Andrea Bittau <a.bittau@cs.ucl.ac.uk>, University College London
+ * Portions created by the Initial Developer are Copyright (C) 2009
+ * the Initial Developer. All Rights Reserved.
+ *
+ * ***** BEGIN LICENSE BLOCK *****/
+-->
+
+<!-- CSS for the HTML content editor -->
+<?xml-stylesheet type="text/css" href="chrome://exchangecalendar/skin/itemBodyEditor.css"?>
+<?xml-stylesheet type="text/css" href="chrome://exchangecalendar/skin/exchWebServiceEditor.css"?>
+
+<!-- Attachment overlay -->
+<?xul-overlay href="chrome://exchangecalendar/content/attachments-view.xul"?>
+
+<!DOCTYPE dialog [
+
+<!ENTITY % eventDialogDTD SYSTEM "chrome://calendar/locale/calendar-event-dialog.dtd">
+ %eventDialogDTD;
+
+<!ENTITY % dtd1 SYSTEM "chrome://exchangecalendar/locale/lightning-item-iframe.dtd" >
+ %dtd1;
+]>
+
+<overlay id="exchangecalendar-lightning-item-iframe.xul"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+ <!-- Manage special Exchange items and provide attendee speicific dialog -->
+ <script type="application/javascript" src="chrome://exchangecalendar/content/lightning-item-iframe.js"/>
+
+ <!-- These rows correspond to the full form under the toolbar -->
+ <rows id="event-grid-rows">
+ <!-- If the current element is a Task and is an Exchange one, add a label to show the current owner of the task. -->
+ <row id="exchWebService-owner-row"
+ insertafter="event-grid-title-row"
+ align="center"
+ collapsed="true" >
+ <label value="&exchWebService.owner.label;" />
+ <label id="exchWebService-owner-label"
+ value="" />
+ </row>
+
+ <!-- When other calendar is selected, we have to clean the current dialog if the new calendar is not an Exchange one -->
+ <row id="event-grid-category-color-row">
+ <hbox id="event-grid-category-box">
+ <menulist id="item-calendar"
+ oncommand="exchToolsEventDialog.selectedCalendarChanged(this); tmpAttachment.selectedCalendarChanged(this);" />
+ </hbox>
+ </row>
+
+ <!-- Exchange task details (hidden by defaults, displayed only by javascript) -->
+ <separator id="exchWebService-details-separator"
+ insertafter="event-grid-todo-status-row"
+ class="groove"
+ hidden="true" />
+
+ <row id="exchWebService-details-row1"
+ insertafter="exchWebService-details-separator"
+ align="center"
+ collapsed="true" >
+ <label value="&exchWebService.totalWork.label;"
+ disable-on-readonly="true" />
+
+ <hbox align="center">
+ <textbox id="exchWebService-totalWork-count"
+ type="number" increment="10" min="0" size="3"
+ value="0"
+ disable-on-readonly="true" />
+
+ <label value="&exchWebService.mileage.label;"
+ disable-on-readonly="true" />
+ <textbox id="exchWebService-mileage-count" value=""
+ disable-on-readonly="true"/>
+ </hbox>
+ </row>
+
+ <row id="exchWebService-details-row2"
+ insertafter="exchWebService-details-row1"
+ align="center"
+ collapsed="true" >
+ <label value="&exchWebService.actualWork.label;"
+ disable-on-readonly="true" />
+
+ <hbox align="center">
+ <textbox id="exchWebService-actualWork-count"
+ type="number" increment="10" min="0" size="3"
+ value="0"
+ disable-on-readonly="true" />
+
+ <label value="&exchWebService.billingInformation.label;"
+ disable-on-readonly="true"/>
+ <textbox id="exchWebService-billingInformation-count"
+ value=""
+ disable-on-readonly="true"/>
+ </hbox>
+ </row>
+
+ <row id="exchWebService-details-row3"
+ insertafter="exchWebService-details-row2"
+ align="center"
+ collapsed="true" >
+ <label value="&exchWebService.companies.label;"
+ disable-on-readonly="true"/>
+ <textbox id="exchWebService-companies-count"
+ value=""
+ disable-on-readonly="true"/>
+ </row>
+ </rows>
+
+ <tabbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ id="event-grid-tabbox">
+
+ <tabpanels id="event-grid-tabpanels">
+ <!-- Add HTML text editor for Exchange tasks -->
+ <tabpanel id="event-grid-tabpanel-description">
+ <itemBodyEditor id="exchWebService-body-editor"
+ flex="1"
+ insertafter="item-description"
+ disable-on-readonly="true"
+ collapsed="true"/>
+ </tabpanel>
+
+ </tabpanels>
+ </tabbox>
+
+</overlay>
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/msgHdrUtils.js calendar-exchange-provider-4.0.0~beta4/chrome/content/msgHdrUtils.js
--- calendar-exchange-provider-3.9.0/chrome/content/msgHdrUtils.js 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/msgHdrUtils.js 2017-07-03 22:10:10.000000000 +0200
@@ -208,18 +208,16 @@
function msgHdrSetTags (aMsgHdr, aTags) {
let oldTagList = msgHdrGetTags(aMsgHdr);
let oldTags = {}; // hashmap
- for each (let [, tag] in Iterator(oldTagList))
+ for (let tag of oldTagList)
oldTags[tag.key] = null;
let newTags = {};
let newTagList = aTags;
- for each (let [, tag] in Iterator(newTagList))
+ for (let tag of newTagList)
newTags[tag.key] = null;
- let toAdd = [x.key for each ([, x] in Iterator(newTagList))
- if (!(x.key in oldTags))];
- let toRemove = [x.key for each ([, x] in Iterator(oldTagList))
- if (!(x.key in newTags))];
+ let toAdd = newTagList.filter( tag => !(tag.key in oldTags));
+ let toRemove = oldTagList.filter( tag => !(tag.key in newTags));
let folder = aMsgHdr.folder;
let msgHdr = toXPCOMArray([aMsgHdr], Ci.nsIMutableArray);
diff -Nru calendar-exchange-provider-3.9.0/chrome/skins/mac/attachments-view.css calendar-exchange-provider-4.0.0~beta4/chrome/skins/mac/attachments-view.css
--- calendar-exchange-provider-3.9.0/chrome/skins/mac/attachments-view.css 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/skins/mac/attachments-view.css 2017-07-03 22:10:10.000000000 +0200
@@ -1,22 +1,20 @@
-#exchWebService-add-attachment-button {
- -moz-image-region: rect(0px 96px 24px 72px);
-}
-#exchWebService-add-attachment-button[disabled="true"],
-#exchWebService-add-attachment-button[disabled="true"]:hover {
- -moz-image-region: rect(48px 96px 72px 72px);
-}
-#exchWebService-add-attachment-button:hover {
- -moz-image-region: rect(24px 96px 48px 72px);
-}
+/*
+ * Should be synced with chrome://calendar/skin/calendar-event-dialog.css
+ * especially the #button-url rules (as it displays the attachment icon)
+ */
-toolbar[iconsize="small"] #exchWebService-add-attachment-button {
- -moz-image-region: rect(0px 64px 16px 48px);
+@media not all and (-moz-mac-yosemite-theme) {
+ #exchWebService-add-attachment-button {
+ list-style-image: url(chrome://calendar-common/skin/calendar-toolbar-osxlion.svg#attach);
+ }
}
-toolbar[iconsize="small"] #exchWebService-add-attachment-button[disabled="true"],
-toolbar[iconsize="small"] #exchWebService-add-attachment-button[disabled="true"]:hover {
- -moz-image-region: rect(32px 64px 48px 48px);
-}
-toolbar[iconsize="small"] #exchWebService-add-attachment-button:hover {
- -moz-image-region: rect(16px 64px 32px 48px);
+
+@media (-moz-mac-yosemite-theme) {
+ #exchWebService-add-attachment-button {
+ list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach);
+ }
+
+toolbar[brighttext] #exchWebService-add-attachment-button {
+ list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach-inverted);
}
diff -Nru calendar-exchange-provider-3.9.0/chrome/skins/unix/attachments-view.css calendar-exchange-provider-4.0.0~beta4/chrome/skins/unix/attachments-view.css
--- calendar-exchange-provider-3.9.0/chrome/skins/unix/attachments-view.css 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/skins/unix/attachments-view.css 2017-07-03 22:10:10.000000000 +0200
@@ -1,21 +1,13 @@
-#exchWebService-add-attachment-button {
- -moz-image-region: rect(0px 96px 24px 72px);
-}
-#exchWebService-add-attachment-button[disabled="true"],
-#exchWebService-add-attachment-button[disabled="true"]:hover {
- -moz-image-region: rect(48px 96px 72px 72px);
-}
-#exchWebService-add-attachment-button:hover {
- -moz-image-region: rect(24px 96px 48px 72px);
-}
+/*
+ * Should be synced with chrome://calendar/skin/calendar-event-dialog.css
+ * especially the #button-url rules (as it displays the attachment icon)
+ */
-toolbar[iconsize="small"] #exchWebService-add-attachment-button {
- -moz-image-region: rect(0px 64px 16px 48px);
+#exchWebService-add-attachment-button {
+ list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach);
}
-toolbar[iconsize="small"] #exchWebService-add-attachment-button[disabled="true"],
-toolbar[iconsize="small"] #exchWebService-add-attachment-button[disabled="true"]:hover {
- -moz-image-region: rect(32px 64px 48px 48px);
-}
-toolbar[iconsize="small"] #exchWebService-add-attachment-button:hover {
- -moz-image-region: rect(16px 64px 32px 48px);
+
+toolbar[brighttext] #exchWebService-add-attachment-button {
+ list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach-inverted);
}
+
diff -Nru calendar-exchange-provider-3.9.0/chrome/skins/win/attachments-view.css calendar-exchange-provider-4.0.0~beta4/chrome/skins/win/attachments-view.css
--- calendar-exchange-provider-3.9.0/chrome/skins/win/attachments-view.css 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/skins/win/attachments-view.css 2017-07-03 22:10:10.000000000 +0200
@@ -1,21 +1,13 @@
-#exchWebService-add-attachment-button {
- -moz-image-region: rect(0px 96px 24px 72px);
-}
-#exchWebService-add-attachment-button[disabled="true"],
-#exchWebService-add-attachment-button[disabled="true"]:hover {
- -moz-image-region: rect(48px 96px 72px 72px);
-}
-#exchWebService-add-attachment-button:hover {
- -moz-image-region: rect(24px 96px 48px 72px);
-}
+/*
+ * Should be synced with chrome://calendar/skin/calendar-event-dialog.css
+ * especially the #button-url rules (as it displays the attachment icon)
+ */
-toolbar[iconsize="small"] #exchWebService-add-attachment-button {
- -moz-image-region: rect(0px 64px 16px 48px);
+#exchWebService-add-attachment-button {
+ list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach);
}
-toolbar[iconsize="small"] #exchWebService-add-attachment-button[disabled="true"],
-toolbar[iconsize="small"] #exchWebService-add-attachment-button[disabled="true"]:hover {
- -moz-image-region: rect(32px 64px 48px 48px);
+
+toolbar[brighttext] #exchWebService-add-attachment-button {
+ list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach-inverted);
}
-toolbar[iconsize="small"] #exchWebService-add-attachment-button:hover {
- -moz-image-region: rect(16px 64px 32px 48px);
-}
\ Kein Zeilenumbruch am Dateiende.
+
diff -Nru calendar-exchange-provider-3.9.0/chrome/skins/winaero/attachments-view.css calendar-exchange-provider-4.0.0~beta4/chrome/skins/winaero/attachments-view.css
--- calendar-exchange-provider-3.9.0/chrome/skins/winaero/attachments-view.css 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/skins/winaero/attachments-view.css 2017-07-03 22:10:10.000000000 +0200
@@ -1,3 +1,13 @@
-#exchWebService-add-attachment-button {
- -moz-image-region: rect(1px 71px 17px 55px);
+/*
+ * Should be synced with chrome://calendar/skin/calendar-event-dialog.css
+ * especially the #button-url rules (as it displays the attachment icon)
+ */
+
+#exchWebService-add-attachment-button {
+ list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach);
}
+
+toolbar[brighttext] #exchWebService-add-attachment-button {
+ list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach-inverted);
+}
+
diff -Nru calendar-exchange-provider-3.9.0/chrome.manifest calendar-exchange-provider-4.0.0~beta4/chrome.manifest
--- calendar-exchange-provider-3.9.0/chrome.manifest 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome.manifest 2017-07-03 22:10:10.000000000 +0200
@@ -12,10 +12,14 @@
overlay chrome://messenger/content/messenger.xul chrome://exchangecalendar/content/progress_panel.xul
overlay chrome://calendar/content/calendar-task-view.xul chrome://exchangecalendar/content/messenger_task_delegation.xul
overlay chrome://lightning/content/lightning-standalone.xul chrome://exchangecalendar/content/progress_panel.xul
+
overlay chrome://calendar/content/calendar-event-dialog.xul chrome://exchangecalendar/content/calendar-event-dialog.xul
+overlay chrome://lightning/content/lightning-item-iframe.xul chrome://exchangecalendar/content/lightning-item-iframe.xul
+
overlay chrome://calendar/content/calendar-event-dialog-reminder.xul chrome://exchangecalendar/content/calendar-event-dialog-reminder.xul
overlay chrome://calendar/content/calendar-summary-dialog.xul chrome://exchangecalendar/content/calendar-summary-dialog.xul
overlay chrome://calendar/content/calendar-properties-dialog.xul chrome://exchangecalendar/content/calendar-properties-dialog.xul
+
overlay chrome://messenger/content/messenger.xul chrome://exchangecalendar/content/sharedCalendarParser.xul application={3550f703-e582-4d05-9a08-453d09bdfdc6}
overlay chrome://messenger/content/messenger.xul chrome://exchangecalendar/content/check4lightning.xul
overlay chrome://messenger/content/preferences/preferences.xul chrome://exchangecalendar/content/messenger-overlay-preferences.xul
@@ -46,6 +50,8 @@
locale exchangecalendar ja-JP locale/exchangecalendar/ja-JP/
locale exchangecalendar sv locale/exchangecalendar/sv/
locale exchangecalendar ru locale/exchangecalendar/ru/
+locale exchangecalendar it-IT locale/exchangecalendar/it-IT/
+locale exchangecalendar tr locale/exchangecalendar/tr/
manifest interfaces/exchangeCalendar/mivExchangeCalendar.manifest
diff -Nru calendar-exchange-provider-3.9.0/components/accountFunctions.js calendar-exchange-provider-4.0.0~beta4/components/accountFunctions.js
--- calendar-exchange-provider-3.9.0/components/accountFunctions.js 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/components/accountFunctions.js 1970-01-01 01:00:00.000000000 +0100
@@ -1,173 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: GPL 3.0
- *
- * The contents of this file are subject to the General Public License
- * 3.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.gnu.org/licenses/gpl.html
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * -- Global Functions for Exchange Calendar and Exchange Contacts.
- * -- For Thunderbird.
- *
- * Author: Michel Verbraak (info@1st-setup.nl)
- * Website: http://www.1st-setup.nl/wordpress/?page_id=133
- * email: info@1st-setup.nl
- *
- *
- * ***** BEGIN LICENSE BLOCK *****/
-
-var Cc = Components.classes;
-var Ci = Components.interfaces;
-var Cu = Components.utils;
-var Cr = Components.results;
-var components = Components;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource:///modules/Services.jsm");
-Cu.import("resource://exchangecalendar/ecFunctions.js");
-
-var EXPORTED_SYMBOLS = [];
-
-if (! exchWebService) var exchWebService = {};
-
-exchWebService.accountFunctions = {
-
- prefs: Cc["@mozilla.org/preferences-service;1"]
- .getService(Ci.nsIPrefService)
- .getBranch("extensions.exchangeWebServices.accounts."),
-
- logInfo: function _logInfo(message)
- {
- exchWebService.commonFunctions.LOG("[exchWebService.accountFunctions] "+message + " ("+exchWebService.commonFunctions.STACKshort()+")");
- },
-
- getAccountIds: function _getAccountIds()
- {
- var ids = exchWebService.commonFunctions.safeGetCharPref(this.prefs, "ids", "");
- this.logInfo("ids:"+ids);
- return ids.split(",");
- },
-
- getAccounts: function _getAccounts()
- {
- var result = {};
- var ids = this.getAccountIds()
- for (var index in ids) {
-
- if (ids[index] != "") {
- this.logInfo("id:"+ids[index]);
- result[ids[index]] = {};
- this.getAccountById(ids[index], result[ids[index]]);
- }
- }
-
- return result;
- },
-
- getAccountById: function _getAccountById(aId, aAccount)
- {
- var result = false;
-
- this.logInfo("id:"+aId);
- var children = this.prefs.getChildList(aId+".",{});
- if (children.length > 0) {
- result = true;
- aAccount["id"] = aId;
- for (var index in children) {
- var attribute = children[index].substr(children[index].indexOf(".")+1);
- switch (this.prefs.getPrefType(children[index])) {
- case this.prefs.PREF_STRING:
- aAccount[attribute] = this.prefs.getCharPref(children[index]);
- break;
- case this.prefs.PREF_INT:
- aAccount[attribute] = this.prefs.getIntPref(children[index]);
- break;
- case this.prefs.PREF_BOOL:
- aAccount[attribute] = this.prefs.getBoolPref(children[index]);
- break;
- }
- }
- }
-
- return result;
- },
-
- getAccountByServer: function _getAccountByServer(aServer)
- {
- var accounts = this.getAccounts();
- var account = null;
- for (var index in accounts) {
- if ((accounts[index].server) && (accounts[index].server.toLowerCase() == aServer.toLowerCase())) {
- return accounts[index];
- }
- }
- },
-
- saveAccount: function _saveAccount(aAccount)
- {
- for (var index in aAccount) {
- switch (typeof(aAccount[index])) {
- case "string":
- this.prefs.setCharPref(aAccount.id+"."+index, aAccount[index]);
- break;
- case "number":
- this.prefs.setIntPref(aAccount.id+"."+index, aAccount[index]);
- break;
- default:
- this.logInfo("Unknown object index:"+index);
- }
- }
-
- // Check if the ids all ready exists. If not add it.
- var ids = this.getAccountIds();
- var idExists = false;
- for (var index in ids) {
- if (ids[index] == aAccount.id) {
- idExists = true;
- break;
- }
- }
- if (!idExists) {
- ids.push(aAccount.id);
- ids = ids.join(",");
- this.prefs.setCharPref("ids", ids);
- }
- },
-
- removeAccount: function _removeAccount(aAccount)
- {
- if (aAccount.id) {
- this.removeAccountById(aAccount.id);
- }
- },
-
- removeAccountById: function _removeAccountById(aAccountId)
- {
- this.prefs.deleteBranch(aAccountId);
- // Remove from ids list.
- var oldIds = this.getAccountIds();
- var newIds = [];
- for (var index in oldIds) {
- if (oldIds[index] != aAccountId) {
- newIds.push(oldIds[index]);
- }
- }
-
- if (newIds.length > 0) {
- newIds = newIds.join(",");
- }
- else {
- newIds = "";
- }
- this.prefs.setCharPref("ids", newIds);
- },
-
-
-}
-
-
diff -Nru calendar-exchange-provider-3.9.0/components/ecExchangeRequest.js calendar-exchange-provider-4.0.0~beta4/components/ecExchangeRequest.js
--- calendar-exchange-provider-3.9.0/components/ecExchangeRequest.js 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/components/ecExchangeRequest.js 2017-07-03 22:10:10.000000000 +0200
@@ -66,7 +66,9 @@
var gExchangeRequestVersion = "0.1";
-if (! exchWebService) var exchWebService = {};
+if (! exchWebService) {
+ var exchWebService = {};
+}
exchWebService.prePasswords = {};
@@ -87,10 +89,10 @@
this.shutdown = false;
this.badCert = false;
this.badCertCount = 0;
- this._notificationCallbacks = null;
+ this.channelCallbackEcAuthPrompt2 = null;
this.globalFunctions = Cc["@1st-setup.nl/global/functions;1"]
- .getService(Ci.mivFunctions);
+ .getService(Ci.mivFunctions);
this.uuid = this.globalFunctions.getUUID();
@@ -99,22 +101,22 @@
this.kerberos = true;
this.prefB = Cc["@mozilla.org/preferences-service;1"]
- .getService(Ci.nsIPrefBranch);
+ .getService(Ci.nsIPrefBranch);
this.exchangeStatistics = Cc["@1st-setup.nl/exchange/statistics;1"]
- .getService(Ci.mivExchangeStatistics);
+ .getService(Ci.mivExchangeStatistics);
this.exchangeBadCertListener2 = Cc["@1st-setup.nl/exchange/badcertlistener2;1"]
- .getService(Ci.mivExchangeBadCertListener2);
+ .getService(Ci.mivExchangeBadCertListener2);
- this.observerService = Cc["@mozilla.org/observer-service;1"]
- .getService(Ci.nsIObserverService);
+ this.observerService = Cc["@mozilla.org/observer-service;1"]
+ .getService(Ci.nsIObserverService);
+ this.observerService.addObserver(this, "http-on-modify-request", true);
this.timeZones = Cc["@1st-setup.nl/exchange/timezones;1"]
- .getService(Ci.mivExchangeTimeZones);
-
- this.xml2json = false;
+ .getService(Ci.mivExchangeTimeZones);
+ this.xml2json = false;
}
ExchangeRequest.prototype = {
@@ -156,9 +158,42 @@
ERR_PASSWORD_ERROR: -300, // To many password errors.
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver]),
+
+ /*
+ In Mozilla bug 1221320, changes were done to XMLHttpRequest so that the authPrompt dialog only appears
+ if neither username nor password is set in the request URL. So you only asyncPromptAuth called when both
+ are blank. But Exchange calendar sets a username on the first authentication attempt (supporting Basic
+ and Kerberos), expecting a callback to asyncPromptAuth if that fails, which it does for NTLM.
+
+ Further changes to authentication are all controlled through these asyncPromptAuth calls which never occur, hence failure. What we
+ do with the observer is reverse the effect of that bug, adding back the calls to asyncPromptAuth
+ */
+ observe(aSubject, aTopic, aData) {
+ let channel = aSubject.QueryInterface(Components.interfaces.nsIHttpChannel);
+ this.logInfo("ecExchangeRequest observing http-on-modify-request for URI " + channel.URI.spec +
+ " originalURI " + (channel.originalURI ? channel.originalURI.spec : "none"));
+
+ // Only respond to our host
+ let myHost = this.xmlReq && this.xmlReq.channel && this.xmlReq.channel.URI.host;
+ let theirHost = channel.URI.host;
+ if (myHost && (myHost != theirHost)) {
+ this.logInfo("Host does not match, theirs: " + theirHost + " mine: " + myHost);
+ return;
+ }
+
+ let internalChannel = channel.QueryInterface(Ci.nsIHttpChannelInternal);
+ if (internalChannel.blockAuthPrompt) {
+ this.logInfo("unblocking request");
+ internalChannel.blockAuthPrompt = false;
+ }
+ else
+ this.logInfo("Already unblocked");
+ },
+
get debug()
{
- if ((this.debuglevel == 0) || (!this.globalFunctions.shouldLog())) {
+ if ((this.debuglevel === 0) || (!this.globalFunctions.shouldLog())) {
return false;
}
@@ -172,7 +207,9 @@
logInfo: function _logInfo(aMsg, aLevel)
{
- if (!aLevel) aLevel = 1;
+ if (!aLevel) {
+ aLevel = 1;
+ }
if ((this.debug) && (aLevel <= this.debuglevel)) {
this.globalFunctions.LOG(this.uuid+": "+aMsg);
@@ -201,137 +238,176 @@
sendRequest: function(aData, aUrl)
{
+ // Stop process while exchangecalendar is shutted down
if (this.shutdown) {
return;
}
-// this.logInfo(": sendRequest\n");
- this.mData = aData;
- this.currentUrl = "";
-
- while ((!aUrl) && (this.urllist.length > 0 )) {
+ //////////////////////////////////
+ // Looking for URL to send data //
+ //////////////////////////////////
+ this.currentUrl = null;
+
+ // If no URL is given, try cached next known URL
+ // This handle the process of AutoDiscovery while list of URLs to try is not empty
+ if ((!aUrl) && (this.urllist.length > 0 )) {
aUrl = this.urllist[0];
this.urllist.shift();
}
- if ((!aUrl) || (aUrl == "") || (aUrl == undefined)) {
- this.fail(this.ER_ERROR_INVALID_URL, "No url to send request to (sendRequest).");
+ // If no URL is given and we have tried every known URL, stop process
+ if ((!aUrl) || (aUrl === "") || (aUrl === undefined)) {
+ this.fail(this.ER_ERROR_INVALID_URL,
+ "No url to send request to (sendRequest).");
return;
}
- this.currentUrl = aUrl;
-
- if (this.exchangeBadCertListener2.userCanceledCertProblem(this.currentUrl)) {
- this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION, "User canceled adding server certificate for url="+this.currentUrl+". Aborting this request.");
+ // If previously user canceled request on the "Certification issue dialog" for this URL,
+ // we have to not go further with this one
+ if (this.exchangeBadCertListener2.userCanceledCertProblem(aUrl)) {
+ this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION,
+ "User previously canceled adding server certificate for url=" + aUrl + ". Aborting this request.");
return;
}
- // remove domain part in xmlhttprequest.open call
+ // We found an URL to send data, save it to current process
+ this.currentUrl = aUrl;
+
+ /////////////////////////////
+ // Processing data to send //
+ /////////////////////////////
+ this.mData = aData;
+
+ //////////////////////////////////////
+ // Looking for user authentications //
+ ////////////////////////////////////
var openUser = this.mArgument.user;
-/* if (openUser.indexOf("\\") > -1) {
- openUser = openUser.substr(openUser.indexOf("\\")+1);
- }*/
+ var password = null;
+
+ var myAuthPrompt2 = Cc["@1st-setup.nl/exchange/authprompt2;1"].getService(
+ Ci.mivExchangeAuthPrompt2);
- var myAuthPrompt2 = Cc["@1st-setup.nl/exchange/authprompt2;1"].getService(Ci.mivExchangeAuthPrompt2);
if (myAuthPrompt2.getUserCanceled(this.currentUrl)) {
-
- this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION, "User canceled providing a valid password for url="+this.currentUrl+". Aborting this request.");
+ this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION,
+ "User canceled providing a valid password for url="
+ + this.currentUrl + ". Aborting this request.");
return;
}
try {
- var password = myAuthPrompt2.getPassword(null, openUser, this.currentUrl);
-// var password = myAuthPrompt2.getPassword(null, this.mArgument.user, this.currentUrl);
+ password = myAuthPrompt2.getPassword(null, openUser, this.currentUrl);
}
catch(err) {
this.logInfo(err);
- this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION, "User canceled providing a valid password for url="+this.currentUrl+". Aborting this request.");
+ this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION,
+ "User canceled providing a valid password for url="
+ + this.currentUrl + ". Aborting this request.");
myAuthPrompt2 = null;
return;
}
myAuthPrompt2 = null;
- this.xmlReq = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance();
+ ////////////////////////////////////////////////////
+ // Sending data through standard XML HTTP Request //
+ ////////////////////////////////////////////////////
+ // http://dvcs.w3.org/hg/progress/raw-file/tip/Overview.html
+ // https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIXMLHttpRequestEventTarget
+ this.xmlReq = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance();
this.mXmlReq = this.xmlReq;
- var tmp = this;
-
- // http://dvcs.w3.org/hg/progress/raw-file/tip/Overview.html
- // https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIXMLHttpRequestEventTarget
- this.xmlReq.addEventListener("loadstart", function(evt) { tmp.loadstart(evt); }, false);
- this.xmlReq.addEventListener("progress", function(evt) { tmp.progress(evt); }, false);
- this.xmlReq.addEventListener("error", function(evt) { tmp.error(evt); }, false);
- this.xmlReq.addEventListener("abort", function(evt) { tmp.abort(evt); }, false);
- this.xmlReq.addEventListener("load", function(evt) { tmp.onLoad(evt); }, false);
- this.xmlReq.addEventListener("loadend", function(evt) { tmp.loadend(evt); }, false);
+ var currentEcRequest = this;
- if (this.debug) this.logInfo(": 1 ExchangeRequest.sendRequest : user="+this.mArgument.user+", url="+this.currentUrl);
+ // Add listeners to the request so we have more details on the current state
+ this.xmlReq.addEventListener("loadstart",
+ function(evt) { currentEcRequest.loadstart(evt); },
+ false);
+ this.xmlReq.addEventListener("progress",
+ function(evt) { currentEcRequest.progress(evt); },
+ false);
+ this.xmlReq.addEventListener("error",
+ function(evt) { currentEcRequest.error(evt); },
+ false);
+ this.xmlReq.addEventListener("abort",
+ function(evt) { currentEcRequest.abort(evt); },
+ false);
+ this.xmlReq.addEventListener("load",
+ function(evt) { currentEcRequest.onLoad(evt); },
+ false);
+ this.xmlReq.addEventListener("loadend",
+ function(evt) { currentEcRequest.loadend(evt); },
+ false);
- this._notificationCallbacks = new ecnsIAuthPrompt2(this);
+ if (this.debug) {
+ this.logInfo(": 1 ExchangeRequest.sendRequest : user="
+ + this.mArgument.user +", url=" + this.currentUrl);
+ }
+ // Open XML HTTP Request channel we'll use to coummunicate with the server
try {
-
-// this.xmlReq.open("POST", this.currentUrl, true);
+ // If a password is already known, we can try basic authentication diretcly.
if (password) {
if (this.debug) this.logInfo("We have a prePassword: *******");
this.xmlReq.open("POST", this.currentUrl, true, openUser, password);
-
- // If we have full credentials we are going to add a Basic auth header just for the case we support Basic.
- var tok = openUser + ':' + password;
- var basicAuthHash = btoa(tok);
- this.xmlReq.setRequestHeader('Authorization', "Basic " + basicAuthHash);
-
- //this.xmlReq.open("POST", this.currentUrl, true, this.mArgument.user, password);
}
else {
+ // If we don't have a password, we need to reach one time the URL
+ // to get a NTML challenge
+ // TODO: check if this comment is correct
this.xmlReq.open("POST", this.currentUrl, true, openUser);
- //this.xmlReq.open("POST", this.currentUrl, true, this.mArgument.user);
}
-
}
catch(err) {
- dump("\n ERROR sendrequest:"+err+"\n");
- if (this.debug) this.logInfo(": ERROR on ExchangeRequest.sendRequest to URL:"+this.currentUrl+". err:"+err);
+ if (this.debug) {
+ this.logInfo(": ERROR on ExchangeRequest.sendRequest to URL:"
+ + this.currentUrl + ". err:" + err);
+ }
+ // Try another URL if possible
if (this.tryNextURL()) {
return;
}
- this.fail(this.ER_ERROR_OPEN_FAILED,"Could not connect to specified host:"+err);
+ this.fail(this.ER_ERROR_OPEN_FAILED, "Could not connect to specified host:" + err);
return;
}
+ // Update HTTP Headers
this.xmlReq.overrideMimeType('text/xml');
this.xmlReq.setRequestHeader("Content-Type", "text/xml");
-// this.xmlReq.setRequestHeader("User-Agent", "extensions.1st-setup.nl/" + gExchangeRequestVersion+"/username="+this.mArgument.user);
this.xmlReq.setRequestHeader("User-Agent", this.globalFunctions.safeGetCharPref(this.prefB, "extensions.1st-setup.others.userAgent", "exchangecalendar@extensions.1st-setup.nl", true));
// This is required for NTLM authenticated sessions. Which is default for a default EWS install.
this.xmlReq.setRequestHeader("Connection", "keep-alive");
/* set channel notifications for password processing */
- this.xmlReq.channel.notificationCallbacks = this._notificationCallbacks;
+ this.channelCallbackEcAuthPrompt2 = new ecnsIAuthPrompt2(this);
+ this.xmlReq.channel.notificationCallbacks = this.channelCallbackEcAuthPrompt2;
this.xmlReq.channel.loadGroup = null;
var httpChannel = this.xmlReq.channel.QueryInterface(Ci.nsIHttpChannel);
- // XXX we want to preserve POST across 302 redirects TODO: This might go away because header params are copyied right now.
+ // XXX we want to preserve POST across 302 redirects
+ // TODO: This might go away because header params are copyied right now.
httpChannel.redirectionLimit = 0;
-try{
- httpChannel.allowPipelining = false;
-}
-catch(err) {
- this.logInfo("sendRequest: ERROR on httpChannel.allowPipelining to err:"+err);
-}
-
- if (this.debug) this.logInfo(": sendRequest Sending: " + this.mData+"\n", 2);
+ try{
+ httpChannel.allowPipelining = false;
+ }
+ catch(err) {
+ this.logInfo("sendRequest: ERROR on httpChannel.allowPipelining to err:"+err);
+ }
- //this.exchangeStatistics.addDataSend(this.currentUrl, this.mData.length);
+ if (this.debug) {
+ this.logInfo(": sendRequest Sending: " + this.mData+"\n", 2);
+ }
+ // Finally, send data through the channel
this.xmlReq.send(this.mData);
},
+ /*
+ * loadstart: XML HTTP Request callback
+ */
loadstart: function _loadtstart(evt)
{
if (this.debug) this.logInfo(": ExchangeRequest.loadstart");
@@ -339,38 +415,65 @@
this.badCert = false;
},
+ /*
+ * loadend: XML HTTP Request callback
+ */
loadend: function _loadend(evt)
{
- if (this.debug) this.logInfo(": ExchangeRequest.loadend");
-
- let xmlReq = this.mXmlReq;
-
- if (this.debug) this.logInfo(": ExchangeRequest.loadend :"+evt.type+", readyState:"+xmlReq.readyState+", status:"+xmlReq.status);
- if (this.debug) this.logInfo(": ExchangeRequest.loadend :"+xmlReq.responseText,2);
-
+ if (this.debug) {
+ this.logInfo(": ExchangeRequest.loadend :"
+ + evt.type + ", readyState:" + this.mXmlReq.readyState
+ + ", status:" + this.mXmlReq.status);
+ this.logInfo(": ExchangeRequest.loadend :"
+ + this.mXmlReq.responseText,2);
+ }
},
+ /*
+ * progress: XML HTTP Request callback
+ */
progress: function _progress(evt)
{
- if (this.debug) this.logInfo(": ExchangeRequest.progress. loaded:"+evt.loaded+", total:"+evt.total);
+ if (this.debug) {
+ this.logInfo(": ExchangeRequest.progress. loaded:"
+ + evt.loaded + ", total:" + evt.total);
+ }
},
+ /*
+ * error: XML HTTP Request callback
+ * Depending on error received we try to recover if possible
+ */
error: function _error(evt)
{
let xmlReq = this.mXmlReq;
- if (this.debug) this.logInfo(": ExchangeRequest.error :"+evt.type+", readyState:"+xmlReq.readyState+", status:"+xmlReq.status+", lastStatus:"+this._notificationCallbacks.lastStatus);
- if (this.debug) this.logInfo(": ExchangeRequest.error :"+xmlReq.responseText,2);
- if (this.debug) this.logInfo(': xmlReq.getResponseHeader("Location") :'+xmlReq.getResponseHeader("Location"),2);
+ if (this.debug) {
+ this.logInfo(": ExchangeRequest.error :" + evt.type
+ + ", readyState:" + xmlReq.readyState + ", status:" + xmlReq.status
+ + ", lastStatus:" + this.channelCallbackEcAuthPrompt2.lastStatus);
+ this.logInfo(": ExchangeRequest.error :" + xmlReq.responseText, 2);
+ this.logInfo(': xmlReq.getResponseHeader("Location") :'
+ + xmlReq.getResponseHeader("Location"), 2);
+ }
- if ((!this.shutdown) && (xmlReq.readyState == 4) && (xmlReq.status == 0)) {
+ //////////////////////////////////////////////////////////
+ // Check if error is related to TLS certification issue //
+ // Connection is terminated and HTTP status is 0 (none) //
+ //////////////////////////////////////////////////////////
+ if ((!this.shutdown)
+ && (xmlReq.readyState === xmlReq.DONE)
+ && (xmlReq.status === 0)) {
this.logInfo(": ExchangeRequest.error : badCert going to check if it is a cert problem.");
-try {
- var result = this.exchangeBadCertListener2.checkAndSolveCertProblem(this.currentUrl);
-}
-catch(err){
- this.logInfo(": ExchangeRequest.error : this.exchangeBadCertListener2.checkAndSolveCertProblem Error:"+err);
-}
+ var result = null;
+
+ try {
+ result = this.exchangeBadCertListener2.checkAndSolveCertProblem(this.currentUrl);
+ }
+ catch(err) {
+ this.logInfo(": ExchangeRequest.error : this.exchangeBadCertListener2.checkAndSolveCertProblem Error:" + err);
+ }
+
if (result.hadProblem) {
if (result.solved) {
this.logInfo(": ExchangeRequest.error : badCert problem but solved. going to retry url.");
@@ -386,160 +489,235 @@
}
}
- if (this.isHTTPRedirect(evt)) return;
-
- if (this.tryNextURL()) return;
-
- this.observerService.notifyObservers(this._notificationCallbacks, "onExchangeConnectionError", this.currentUrl+"|"+this._notificationCallbacks.lastStatus+"|"+this._notificationCallbacks.lastStatusArg);
-
- switch (this._notificationCallbacks.lastStatus) {
- case 0x804b0003:
- this.fail(this.ER_ERROR_RESOLVING_HOST, "Error resolving hostname '"+this._notificationCallbacks.lastStatusArg+"'. Did you type the right hostname. (STATUS_RESOLVING)");
- xmlReq.abort();
- if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
- return;
- case 0x804b000b:
- this.fail(this.ER_ERROR_RESOLVING_HOST, "Error resolving hostname '"+this._notificationCallbacks.lastStatusArg+"'. Did you type the right hostname. (STATUS_RESOLVED)");
- xmlReq.abort();
- if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
+ // Stop if we are able to resolve the error following redirection or trying next URL
+ if (this.isHTTPRedirect(evt) || this.tryNextURL()) {
return;
- case 0x804b0007:
- this.fail(this.ER_ERROR_CONNECTING_TO, "Error during connecting to hostname '"+this._notificationCallbacks.lastStatusArg+"'. Is the host down?. (STATUS_CONNECTING_TO)");
- xmlReq.abort();
- if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
- return;
- case 0x804b0004:
- this.fail(this.ER_ERROR_CONNECED_TO, "Error during connection to hostname '"+this._notificationCallbacks.lastStatusArg+"'. (STATUS_CONNECTED_TO)");
- if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
- break;
- case 0x804b0005:
- this.fail(this.ER_ERROR_SENDING_TO, "Error during sending data to hostname '"+this._notificationCallbacks.lastStatusArg+"'. (STATUS_SENDING_TO)");
- if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
- break;
- case 0x804b000a:
- this.fail(this.ER_ERROR_WAITING_FOR, "Error during waiting for data of hostname '"+this._notificationCallbacks.lastStatusArg+"'. (STATUS_WAITING_FOR)");
- if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
- break;
- case 0x804b0006:
- this.fail(this.ER_ERROR_RECEIVING_FROM, "Error during receiving of data from hostname '"+this._notificationCallbacks.lastStatusArg+"'. (STATUS_RECEIVING_FROM)");
- if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
- break;
- default:
- this.fail(this.ER_ERROR_UNKNOWN_CONNECTION, "Unknown error during communication with hostname '"+this._notificationCallbacks.lastStatusArg+"'. ("+this._notificationCallbacks.lastStatus+")");
+ }
+
+ this.observerService.notifyObservers(this.channelCallbackEcAuthPrompt2,
+ "onExchangeConnectionError",
+ this.currentUrl + "|" + this.channelCallbackEcAuthPrompt2.lastStatus
+ + "|" + this.channelCallbackEcAuthPrompt2.lastStatusArg);
+
+ switch (this.channelCallbackEcAuthPrompt2.lastStatus) {
+ // On these status, we abort current connection, reset try counter and return
+ case 0x804b0003:
+ case 0x804b000b:
+ this.fail(this.ER_ERROR_RESOLVING_HOST,
+ "Error resolving hostname '"
+ + this.channelCallbackEcAuthPrompt2.lastStatusArg
+ + "'. Did you type the right hostname. (STATUS_RESOLVED)");
+ xmlReq.abort();
+ if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) {
+ exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
+ }
+ return;
+ case 0x804b0007:
+ this.fail(this.ER_ERROR_CONNECTING_TO, "Error during connecting to hostname '"
+ + this.channelCallbackEcAuthPrompt2.lastStatusArg
+ + "'. Is the host down?. (STATUS_CONNECTING_TO)");
+ xmlReq.abort();
+ if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) {
+ exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
+ }
+ return;
+ // On these status we just reset try counter and continue
+ case 0x804b0004:
+ this.fail(this.ER_ERROR_CONNECED_TO, "Error during connection to hostname '"
+ + this.channelCallbackEcAuthPrompt2.lastStatusArg + "'. (STATUS_CONNECTED_TO)");
+ if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) {
+ exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
+ }
+ break;
+ case 0x804b0005:
+ this.fail(this.ER_ERROR_SENDING_TO, "Error during sending data to hostname '"
+ + this.channelCallbackEcAuthPrompt2.lastStatusArg + "'. (STATUS_SENDING_TO)");
+ if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) {
+ exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
+ }
+ break;
+ case 0x804b000a:
+ this.fail(this.ER_ERROR_WAITING_FOR, "Error during waiting for data of hostname '"
+ + this.channelCallbackEcAuthPrompt2.lastStatusArg + "'. (STATUS_WAITING_FOR)");
+ if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) {
+ exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
+ }
+ break;
+ case 0x804b0006:
+ this.fail(this.ER_ERROR_RECEIVING_FROM, "Error during receiving of data from hostname '"
+ + this.channelCallbackEcAuthPrompt2.lastStatusArg + "'. (STATUS_RECEIVING_FROM)");
+ if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) {
+ exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
+ }
+ break;
+ // Unknown status
+ default:
+ this.fail(this.ER_ERROR_UNKNOWN_CONNECTION, "Unknown error during communication with hostname '"
+ + this.channelCallbackEcAuthPrompt2.lastStatusArg
+ + "'. (" + this.channelCallbackEcAuthPrompt2.lastStatus + ")");
}
},
+ /*
+ * abort: XML HTTP Request callback
+ */
abort: function _abort(evt)
{
- if (this.debug) this.logInfo("ExchangeRequest.abort: type:"+evt.type);
- if (evt.type != "abort") {
- if (this.debug) this.logInfo("ecExchangeRequest.abort: "+evt.type);
+ if (this.debug) {
+ this.logInfo("ExchangeRequest.abort: type:" + evt.type);
}
- dump("Abort!\n");
-// this.fail(-3, "User aborted data transfer.");
},
onUserStop: function _onUserStop(aCode, aMsg)
{
- if (this.debug) this.logInfo("ecExchangeRequest.onUserStop: aCode:"+aCode+", aMsg:"+aMsg);
+ if (this.debug) {
+ this.logInfo("ecExchangeRequest.onUserStop: aCode:"+aCode+", aMsg:"+aMsg);
+ }
+
this.mXmlReq.abort();
this.fail(aCode, aMsg);
},
+ /*
+ * isHTTPRedirect: check if URL has bee redirected and try to go through redirection
+ */
isHTTPRedirect: function(evt)
{
let xmlReq = this.mXmlReq;
- if (this.debug) this.logInfo("exchangeRequest.isHTTPRedirect.xmlReq. xmlReq.readyState:"+xmlReq.readyState+", xmlReq.status:"+xmlReq.status);
- if (xmlReq.readyState != 4)
+ if (this.debug) {
+ this.logInfo("exchangeRequest.isHTTPRedirect.xmlReq. xmlReq.readyState:"
+ + xmlReq.readyState + ", xmlReq.status:" + xmlReq.status);
+ }
+
+ if (xmlReq.readyState != xmlReq.DONE) {
return false;
+ }
+ // Read status to find redirection
switch (xmlReq.status) {
- case 301: // Moved Permanently
- case 302: // Found
- case 307: // Temporary redirect (since HTTP/1.1)
- if (this.debug) this.logInfo(": ExchangeRequest.redirect :"+evt.type+", readyState:"+xmlReq.readyState+", status:"+xmlReq.status);
-
- let httpChannel = xmlReq.channel.QueryInterface(Ci.nsIHttpChannel);
- let loc = httpChannel.getResponseHeader("Location");
-
- // The location could be a relative path
- if (loc.indexOf("http") == -1) {
- if (this.debug) this.logInfo("new location looks to be relative.");
- if (loc.indexOf("/") == 0) {
- if (this.debug) this.logInfo("Relative to the root of the server.");
+ case 301: // Moved Permanently
+ case 302: // Found
+ case 307: // Temporary redirect (since HTTP/1.1)
+ if (this.debug) {
+ this.logInfo(": ExchangeRequest.redirect :"
+ + evt.type + ", readyState:" + xmlReq.readyState
+ + ", status:" + xmlReq.status);
+ }
+
+ // Read new location from HTTP headers
+ let httpChannel = xmlReq.channel.QueryInterface(Ci.nsIHttpChannel);
+ let loc = httpChannel.getResponseHeader("Location");
+
+ // The location could be a relative path
+ if (loc.indexOf("http") === -1) {
+ if (this.debug) {
+ this.logInfo("new location looks to be relative.");
+ }
+
// Relative to the root of the server
- //Find position of third slash https://xxx/
- var slashCounter = 0;
- var counter = 0;
- while ((slashCounter < 3) && (counter < this.currentUrl.length)) {
- if (this.currentUrl.substr(counter, 1) == "/") {
- slashCounter++;
-
- if (slashCounter == 3) {
- var tmpUrl = this.currentUrl.substr(0, counter);
- break;
+ if (loc.indexOf("/") === 0) {
+ if (this.debug) {
+ this.logInfo("Relative to the root of the server.");
+ }
+
+ // Retrieve current root path by looking for the third slash
+ // for the currenty requested URL (like https://xxx.yyy/)
+ // If there's not 3 slash, so the URL is already the root path
+ var rootUrlPath = null
+ var slashCounter = 0;
+ var pos = 0;
+ while ((slashCounter < 3) && (pos < this.currentUrl.length)) {
+ if (this.currentUrl.substr(pos, 1) === "/") {
+ slashCounter++;
+
+ if (slashCounter === 3) {
+ rootUrlPath = this.currentUrl.substr(0, pos);
+ break;
+ }
}
+ pos++;
+ }
+
+ if (rootUrlPath) {
+ loc = rootUrlPath + loc;
+ }
+ else {
+ loc = this.currentUrl + loc;
}
- counter++;
- }
- if (tmpUrl) {
- loc = tmpUrl + loc;
}
else {
- loc = this.currentUrl + loc;
+ // Relative to last dir.
+ if (this.debug){
+ this.logInfo("it is relative to the last dir. Currently not able to handle this.");
+ }
}
}
- else {
- // Relative to last dir.
- if (this.debug) this.logInfo("it is relative to the last dir. Currently not able to handle this. Will be available in future version.");
- }
- }
- if (this.debug) this.logInfo(": Redirect: " + loc + "\n");
+ if (this.debug){
+ this.logInfo(": Redirect: " + loc + "\n");
+ }
- // XXX pheer loops.
- xmlReq.abort();
- this.sendRequest(this.mData, loc);
+ // XXX pheer loops.
+ xmlReq.abort();
+ this.sendRequest(this.mData, loc);
- return true;
+ // This is a redirection and we are alreday trying a new URL
+ return true;
}
+ // That wasn't a redirection
return false;
},
- unchunk: function _unchunk(aStr)
+ /*
+ * Revert chunk process on data:
+ * this function take string splitted in big pieces of data
+ * and gather them in one big string.
+ */
+ unchunk: function _unchunk(aChunkedString)
{
- var pos = aStr.indexOf("\r\n");
+ var pos = aChunkedString.indexOf("\r\n");
if ((pos > -1) && (pos < 5)) {
var chunkCounter = 1;
- var chunkLength = parseInt(aStr.substr(0,pos), 16);
+ var chunkLength = parseInt(aChunkedString.substr(0,pos), 16);
+
if (isNaN(chunkLength)) {
- if (this.debug) this.logInfo("unchunk: 1st chunk is not a number:"+aStr.substr(0,pos));
+ if (this.debug){
+ this.logInfo("unchunk: 1st chunk is not a number:" + aChunkedString.substr(0,pos));
+ }
return "";
}
- if (this.debug) this.logInfo("unchunk: 1st chunk has length:"+chunkLength);
- var newStr = "";
+
+ if (this.debug) {
+ this.logInfo("unchunk: 1st chunk has length:" + chunkLength);
+ }
+
+ var gatheredString = "";
while (chunkLength > 0) {
var bytesToCopy = chunkLength;
pos = pos + 2;
var charCode;
while (bytesToCopy > 0) {
- newStr = newStr + aStr.substr(pos, 1);
- charCode = aStr.charCodeAt(pos);
+ gatheredString = gatheredString + aChunkedString.substr(pos, 1);
+ charCode = aChunkedString.charCodeAt(pos);
if (charCode <= 0xFF) {
bytesToCopy--;
}
else {
if (charCode <= 0xFFFF) {
- if (this.debug) this.logInfo("unchunk: TWO bytes copied '"+aStr.substr(pos, 1)+"'="+charCode);
+ if (this.debug) {
+ this.logInfo("unchunk: TWO bytes copied '" + aChunkedString.substr(pos, 1) + "'="+charCode);
+ }
bytesToCopy = bytesToCopy - 2;
}
else {
if (charCode <= 0xFFFFFF) {
- if (this.debug) this.logInfo("unchunk: THREE bytes copied '"+aStr.substr(pos, 1)+"'="+charCode);
+ if (this.debug) {
+ this.logInfo("unchunk: THREE bytes copied '" + aChunkedString.substr(pos, 1) + "'="+charCode);
+ }
bytesToCopy = bytesToCopy - 3;
}
}
@@ -547,55 +725,71 @@
pos++;
}
- //newStr = newStr + aStr.substr(pos+2, chunkLength);
- if (this.debug) this.logInfo("unchunk: pos:"+pos+", CunkStr:"+newStr+"|");
- //pos = pos + chunkLength + 2;
+ if (this.debug) {
+ this.logInfo("unchunk: pos:" + pos + ", CunkStr:" + gatheredString + "|");
+ }
+
// Next two bytes should be \r\n
- var check = aStr.substr(pos, 2);
+ var check = aChunkedString.substr(pos, 2);
if (check != "\r\n") {
- if (this.debug) this.logInfo("unchunk: Strange. Expected 0D0A (Cr+Lf) but found:"+check+". Stopping processing of this chunked message.");
+ if (this.debug) {
+ this.logInfo("unchunk: Strange. Expected 0D0A (Cr+Lf) but found:"
+ + check + ". Stopping processing of this chunked message.");
+ }
return "";
}
pos = pos + 2;
- var tmpStr = aStr.substr(pos, 6);
+ var tmpStr = aChunkedString.substr(pos, 6);
var pos2 = tmpStr.indexOf("\r\n");
chunkCounter++;
if (pos2 > -1) {
- if (this.debug) this.logInfo("unchunk: Found next chunk. Number:"+chunkCounter+", LengthStr:"+tmpStr.substr(0,pos2));
+ if (this.debug) {
+ this.logInfo("unchunk: Found next chunk. Number:"+chunkCounter+", LengthStr:"+tmpStr.substr(0,pos2));
+ }
+
chunkLength = parseInt(tmpStr.substr(0,pos2), 16);
if (isNaN(chunkLength)) {
- if (this.debug) this.logInfo("unchunk: Chunk '"+chunkCounter+"' is not a number:"+tmpStr);
+ if (this.debug) {
+ this.logInfo("unchunk: Chunk '"+chunkCounter+"' is not a number:"+tmpStr);
+ }
return "";
}
- if (this.debug) this.logInfo("unchunk: Chunk '"+chunkCounter+"' has length:"+chunkLength);
+ if (this.debug) {
+ this.logInfo("unchunk: Chunk '"+chunkCounter+"' has length:"+chunkLength);
+ }
pos = pos + pos2;
}
else {
- if (this.debug) this.logInfo("unchunk: Trying to determine chunk '"+chunkCounter+"' length but it is more than 4 bytes big!! size:"+tmpStr);
+ if (this.debug) {
+ this.logInfo("unchunk: Trying to determine chunk '"+chunkCounter+"' length but it is more than 4 bytes big!! size:"+tmpStr);
+ }
return "";
}
}
- return newStr;
+ return gatheredString;
}
else {
- if (this.debug) this.logInfo("unchunk: Trying to determine first chunk length but it is very big...!! size:"+pos);
- return aStr;
+ if (this.debug) {
+ this.logInfo("unchunk: Trying to determine first chunk length but it is very big...!! size:" + pos);
+ }
+ return aChunkedString;
}
},
saveToFile: function _saveToFile(aFilename, aContent)
{
var file = Cc["@mozilla.org/file/directory_service;1"]
- .getService(Components.interfaces.nsIProperties)
- .get("ProfD", Components.interfaces.nsIFile);
+ .getService(Components.interfaces.nsIProperties)
+ .get("ProfD", Components.interfaces.nsIFile);
+
file.append("exchange-data");
if ( !file.exists() || !file.isDirectory() ) {
- file.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, parseInt("0777", 8));
+ file.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, parseInt("0777", 8));
}
file.append("responses");
if ( !file.exists() || !file.isDirectory() ) {
- file.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, parseInt("0777", 8));
+ file.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, parseInt("0777", 8));
}
if (!this.fileCount) {
@@ -606,73 +800,65 @@
}
if (this.fileCount < 10) {
- file.append(this.uuid+"-00"+this.fileCount+"."+aFilename);
+ file.append(this.uuid+"-00" + this.fileCount + "."+aFilename);
+ }
+ else if (this.fileCount < 100) {
+ file.append(this.uuid+"-0" + this.fileCount + "." + aFilename);
}
else {
- if (this.fileCount < 100) {
- file.append(this.uuid+"-0"+this.fileCount+"."+aFilename);
- }
- else {
- file.append(this.uuid+"-"+this.fileCount+"."+aFilename);
- }
+ file.append(this.uuid+"-" + this.fileCount + "."+aFilename);
}
if (file.exists()) {
file.remove(false);
}
-// file.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0777);
-
- var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"].
- createInstance(Components.interfaces.nsIFileOutputStream);
- foStream.init(file, 0x02 | 0x08 | 0x20, parseInt("0777", 8), 0);
+ var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"].
+ createInstance(Components.interfaces.nsIFileOutputStream);
+ foStream.init(file, 0x02 | 0x08 | 0x20, parseInt("0777", 8), 0);
var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].
- createInstance(Components.interfaces.nsIConverterOutputStream);
+ createInstance(Components.interfaces.nsIConverterOutputStream);
converter.init(foStream, "UTF-8", 0, 0);
converter.writeString(aContent);
converter.close(); // this closes foStream
-
+
return 0;
},
- onLoad:function _onLoad(evt)
+ onLoad:function _onLoad(evt)
{
let xmlReq = this.mXmlReq;
- if (this.debug) this.logInfo(": ExchangeRequest.onLoad :"+evt.type+", readyState:"+xmlReq.readyState+", status:"+xmlReq.status);
-
- if (this.debug) this.logInfo(": ExchangeRequest.onLoad :"+xmlReq.getAllResponseHeaders(),2);
-
- if (this.debug) this.logInfo(": ExchangeRequest.onLoad :"+xmlReq.responseText,2);
-
- //this.exchangeStatistics.addDataRead(this.currentUrl, xmlReq.responseText.length);
-
- if (xmlReq.readyState != 4) {
-
- //if (this.tryNextURL()) return;
-
- if (this.debug) this.logInfo("readyState < 4. THIS SHOULD NEVER HAPPEN. PLEASE REPORT.");
- this.fail(this.ER_ERROR_OPEN_FAILED,"Ready state != 4, readyState:"+xmlReq.readyState);
- return;
+ if (this.debug) {
+ this.logInfo(": ExchangeRequest.onLoad :" + evt.type
+ + ", readyState:" + xmlReq.readyState
+ + ", status:" + xmlReq.status);
+ this.logInfo(": ExchangeRequest.onLoad :"
+ + xmlReq.getAllResponseHeaders(), 2);
+ this.logInfo(": ExchangeRequest.onLoad :" + xmlReq.responseText, 2);
}
- if (this.isHTTPRedirect(evt)) {
+ if (xmlReq.readyState != xmlReq.DONE) {
+ if (this.debug) {
+ this.logInfo("readyState is not DONE inside the onLoad internal function. THIS SHOULD NEVER HAPPEN. PLEASE REPORT.");
+ }
+ this.fail(this.ER_ERROR_OPEN_FAILED,
+ "Ready state != 4, readyState:" + xmlReq.readyState);
return;
}
- if (this.isHTTPError()) {
+ // Check redirection and follow it if possible
+ // Check if this is an HTTP Error
+ if (this.isHTTPRedirect(evt) || this.isHTTPError()) {
return;
}
var xml = xmlReq.responseText; // bug 270553
- //this.saveToFile("onload.xml", xml);
-
-// Removed following as this is no longer a problem as we are not using E4X anymore.
-// xml = xml.replace(//g, ""); // BUG 61 remove hexadecimal code 0x10. It will fail in xml conversion.
-
var newXML;
+
+ // Initiate XML parser
try {
if (this.xml2json === true) {
newXML = xml2json.newJSON();
@@ -681,8 +867,13 @@
newXML = new mivIxml2jxon('', 0, null);
}
}
- catch(exc) { if (this.debug) this.logInfo("createInstance error:"+exc);}
+ catch(exc) {
+ if (this.debug) {
+ this.logInfo("createInstance error:"+exc);
+ }
+ }
+ // Parse XML data
try {
if (this.xml2json === true) {
xml2json.parseXML(newXML, xml);
@@ -696,7 +887,12 @@
newXML.processXMLString(xml, 0, null);
}
}
- catch(exc) { if (this.debug) this.logInfo("processXMLString error:"+exc.name+", "+exc.message+"\n"+xml);}
+ catch(exc) {
+ if (this.debug) {
+ this.logInfo("processXMLString error:" + exc.name + ","
+ + exc.message + "\n" + xml);
+ }
+ }
this.mAuthFail = 0;
this.mRunning = false;
@@ -706,38 +902,52 @@
try {
if (this.xml2json === true) {
let serverVersion = xml2json.XPath(newXML,"/Envelope/Header/ServerVersionInfo");
- if ((serverVersion.length > 0) && (xml2json.getAttribute(serverVersion[0], "Version") !== null)) {
- this.exchangeStatistics.setServerVersion(this.currentUrl, xml2json.getAttribute(serverVersion[0], "Version"), xml2json.getAttribute(serverVersion[0], "MajorVersion"), xml2json.getAttribute(serverVersion[0], "MinorVersion"));
+ if (serverVersion.length > 0
+ && xml2json.getAttribute(serverVersion[0], "Version") !== null) {
+ this.exchangeStatistics.setServerVersion(this.currentUrl,
+ xml2json.getAttribute(serverVersion[0], "Version"),
+ xml2json.getAttribute(serverVersion[0], "MajorVersion"),
+ xml2json.getAttribute(serverVersion[0], "MinorVersion"));
}
serverVersion = null;
}
else {
let serverVersion = newXML.XPath("/s:Header/ServerVersionInfo");
- if ((serverVersion.length > 0) && (serverVersion[0].getAttribute("Version") != "")) {
- this.exchangeStatistics.setServerVersion(this.currentUrl, serverVersion[0].getAttribute("Version"), serverVersion[0].getAttribute("MajorVersion"), serverVersion[0].getAttribute("MinorVersion"));
+ if (serverVersion.length > 0
+ && serverVersion[0].getAttribute("Version") != "") {
+ this.exchangeStatistics.setServerVersion(this.currentUrl,
+ serverVersion[0].getAttribute("Version"),
+ serverVersion[0].getAttribute("MajorVersion"),
+ serverVersion[0].getAttribute("MinorVersion"));
}
serverVersion[0] = null;
serverVersion = null;
}
}
- catch(err) { }
+ catch(err) {
+ }
this.retryCount = 0;
-
if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) {
exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
}
-try {
- this.mCbOk(this, newXML);
-}catch(err) { dump("onload: err:"+err+"\n"+this.globalFunctions.STACK()+"\n"+xml+"\n");}
+ try {
+ this.mCbOk(this, newXML);
+ }
+ catch(err)
+ {
+ if (this.debug) {
+ this.logInfo("onLoad: err:" + err);
+ this.logInfo("onLoad: stack:" + this.globalFunctions.STACK());
+ this.logInfo("onLoad: xml:" + xml);
+ }
+ }
this.originalReq = null;
}
-//dump(" stat: time1:"+(time2-time1)+", time2:"+(time4-time3)+"\n");
newXML = null;
-
- this.observerService.notifyObservers(this._notificationCallbacks, "onExchangeConnectionOk", this.currentUrl);
+ this.observerService.notifyObservers(this.channelCallbackEcAuthPrompt2, "onExchangeConnectionOk", this.currentUrl);
},
retryCurrentUrl: function()
@@ -747,14 +957,18 @@
tryNextURL: function _tryNextURL()
{
- if (this.debug) this.logInfo("exchangeRequest.tryNextURL");
- let xmlReq = this.mXmlReq;
- if (xmlReq.readyState != 4) {
+ if (this.debug) {
+ this.logInfo("exchangeRequest.tryNextURL");
+ }
+
+ let xmlReq = this.mXmlReq;
+
+ if (xmlReq.readyState != xmlReq.DONE) {
xmlReq.abort();
}
if (this.urllist.length > 0) {
- if (this.debug) this.logInfo("exchangeRequest.tryNextURL: We have another URLto try the request on.");
+ if (this.debug) this.logInfo("exchangeRequest.tryNextURL: We have another URL to try the request on.");
this.sendRequest(this.mData);
return true;
}
@@ -769,161 +983,179 @@
// https://webmail.example.com/ews/exchange.asmx
var tmpColon = tmpURL.indexOf("://");
- tmpURL = tmpURL.substr(0, tmpColon+3) + aUser + "@" + tmpURL.substr(tmpColon+3);
+ tmpURL = tmpURL.substr(0, tmpColon + 3) + aUser + "@" + tmpURL.substr(tmpColon+3);
}
- return this._notificationCallbacks.getPrePassword(aUser, tmpURL);
+ return this.channelCallbackEcAuthPrompt2.getPrePassword(aUser, tmpURL);
},
- isHTTPError: function()
- {
- let xmlReq = this.mXmlReq;
+ isHTTPError: function()
+ {
+ let xmlReq = this.mXmlReq;
- if (xmlReq.status != 200) {
+ if (xmlReq.status != 200) {
if (xmlReq.status == 303) { // See Other (since HTTP/1.1) new request should be a GET instead of a POST.
- this.fail(this.ER_ERROR_HTTP_ERROR4XX, "HTTP Redirection "+xmlReq.status+": See Other\n"+xmlReq.responseText.substr(0,300)+"\n\n");
- return true;
+ this.fail(this.ER_ERROR_HTTP_ERROR4XX,
+ "HTTP Redirection " + xmlReq.status + ": See Other\n"
+ + xmlReq.responseText.substr(0,300) + "\n\n");
+ return true;
}
- if ((xmlReq.status > 399) && (xmlReq.status < 500)) {
-
+ if ((xmlReq.status > 399) && (xmlReq.status < 500)) {
var errMsg = "";
switch (xmlReq.status) {
- case 400: errMsg = "Bad request"; break;
- case 401: errMsg = "Unauthorized"; break;
- case 402: errMsg = "Payment required"; break;
- case 403: errMsg = "Forbidden"; break;
- case 404: errMsg = "Not found"; break;
- case 405: errMsg = "Method not allowed"; break;
- case 406: errMsg = "Not acceptable"; break;
- case 407: errMsg = "Proxy athentication required"; break;
- case 408: errMsg = "Request timeout"; break;
- case 409: errMsg = "Conflict"; break;
- case 410: errMsg = "Gone"; break;
- case 411: errMsg = "Length required"; break;
- case 412: errMsg = "Precondition failed"; break;
- case 413: errMsg = "Request entity too large"; break;
- case 414: errMsg = "Request-URI too long"; break;
- case 415: errMsg = "Unsupported media type"; break;
- case 416: errMsg = "Request range not satisfiable"; break;
- case 417: errMsg = "Expectation failed"; break;
- case 418: errMsg = "I'm a teapot(RFC 2324)"; break;
- case 420: errMsg = "Enhance your calm (Twitter)"; break;
- case 422: errMsg = "Unprocessable entity (WebDAV)(RFC 4918)"; break;
- case 423: errMsg = "Locked (WebDAV)(RFC 4918)"; break;
- case 424: errMsg = "Failed dependency (WebDAV)(RFC 4918)"; break;
- case 425: errMsg = "Unordered collection (RFC 3648)"; break;
- case 426: errMsg = "Upgrade required (RFC2817)"; break;
- case 428: errMsg = "Precondition required"; break;
- case 429: errMsg = "Too many requests"; break;
- case 431: errMsg = "Request header fields too large"; break;
- case 444: errMsg = "No response"; break;
- case 449: errMsg = "Retry with"; break;
- case 450: errMsg = "Blocked by Windows Parental Controls"; break;
- case 499: errMsg = "Client closed request"; break;
+ case 400: errMsg = "Bad request"; break;
+ case 401: errMsg = "Unauthorized"; break;
+ case 402: errMsg = "Payment required"; break;
+ case 403: errMsg = "Forbidden"; break;
+ case 404: errMsg = "Not found"; break;
+ case 405: errMsg = "Method not allowed"; break;
+ case 406: errMsg = "Not acceptable"; break;
+ case 407: errMsg = "Proxy athentication required"; break;
+ case 408: errMsg = "Request timeout"; break;
+ case 409: errMsg = "Conflict"; break;
+ case 410: errMsg = "Gone"; break;
+ case 411: errMsg = "Length required"; break;
+ case 412: errMsg = "Precondition failed"; break;
+ case 413: errMsg = "Request entity too large"; break;
+ case 414: errMsg = "Request-URI too long"; break;
+ case 415: errMsg = "Unsupported media type"; break;
+ case 416: errMsg = "Request range not satisfiable"; break;
+ case 417: errMsg = "Expectation failed"; break;
+ case 418: errMsg = "I'm a teapot(RFC 2324)"; break;
+ case 420: errMsg = "Enhance your calm (Twitter)"; break;
+ case 422: errMsg = "Unprocessable entity (WebDAV)(RFC 4918)"; break;
+ case 423: errMsg = "Locked (WebDAV)(RFC 4918)"; break;
+ case 424: errMsg = "Failed dependency (WebDAV)(RFC 4918)"; break;
+ case 425: errMsg = "Unordered collection (RFC 3648)"; break;
+ case 426: errMsg = "Upgrade required (RFC2817)"; break;
+ case 428: errMsg = "Precondition required"; break;
+ case 429: errMsg = "Too many requests"; break;
+ case 431: errMsg = "Request header fields too large"; break;
+ case 444: errMsg = "No response"; break;
+ case 449: errMsg = "Retry with"; break;
+ case 450: errMsg = "Blocked by Windows Parental Controls"; break;
+ case 499: errMsg = "Client closed request"; break;
}
- if (this.debug) this.logInfo(": isConnError req.status="+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText, 2);
+ if (this.debug) {
+ this.logInfo(": isConnError req.status=" + xmlReq.status
+ + ": " +errMsg + "\nURL:" + this.currentUrl + "\n"
+ + xmlReq.responseText, 2);
+ }
var myAuthPrompt2 = Cc["@1st-setup.nl/exchange/authprompt2;1"].getService(Ci.mivExchangeAuthPrompt2);
- if ((this.urllist.length > 0) && (!myAuthPrompt2.getUserCanceled(this.currentUrl))) {
- if (this.tryNextURL()) {
+ if (this.urllist.length > 0 && !myAuthPrompt2.getUserCanceled(this.currentUrl)) {
+ if (this.tryNextURL()) {
return true;
}
- this.fail(this.ER_ERROR_HTTP_ERROR4XX, "HTTP Client error "+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText.substr(0,300)+"\n\n");
+ this.fail(this.ER_ERROR_HTTP_ERROR4XX,
+ "HTTP Client error " + xmlReq.status + ": "
+ + errMsg + "\nURL:" + this.currentUrl + "\n"
+ + xmlReq.responseText.substr(0,300)+"\n\n");
+ }
+ else if (myAuthPrompt2.getUserCanceled(this.currentUrl)) {
+ this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION,
+ "User canceled providing a valid password for url="
+ + this.currentUrl + ". Aborting this request.");
}
else {
- if (myAuthPrompt2.getUserCanceled(this.currentUrl)) {
- this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION, "User canceled providing a valid password for url="+this.currentUrl+". Aborting this request.");
- }
- else {
- this.fail(this.ER_ERROR_HTTP_ERROR4XX, "HTTP Client error "+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText.substr(0,300)+"\n\n");
- }
+ this.fail(this.ER_ERROR_HTTP_ERROR4XX, "HTTP Client error "
+ + xmlReq.status + ": " +errMsg +"\nURL:" + this.currentUrl
+ + "\n" + xmlReq.responseText.substr(0,300)+"\n\n");
}
- return true;
-
- }
-
- if ((xmlReq.status > 499) && (xmlReq.status < 600)) {
+ return true;
+ }
+ if ((xmlReq.status > 499) && (xmlReq.status < 600)) {
var errMsg = "";
switch (xmlReq.status) {
- case 500: errMsg = "Internal server error";
-
+ case 500: errMsg = "Internal server error";
// First check if we have a version mismatch and we need a lower version. This sometimes happens.
if (xmlReq.responseText.indexOf("ErrorInvalidServerVersion") > -1) {
- if (this.debug) this.logInfo(" ErrorInvalidServerVersion -> RequestServerVersion wrong:"+this.version+".", 2);
- // We are going to retry with a different serverversion.
+ if (this.debug) {
+ this.logInfo(" ErrorInvalidServerVersion -> RequestServerVersion wrong:"+this.version+".", 2);
+ }
+
+ // We are going to retry with a different server version.
var tryAgain = false;
switch(this.version) {
- case "Exchange2010":
- this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2007_SP1", null, null);
- tryAgain = true;
- break;
- case "Exchange2010_SP1":
- this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010", null, null);
- tryAgain = true;
- break;
- case "Exchange2010_SP2":
- this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP1", null, null);
- tryAgain = true;
- break;
- case "Exchange2013":
- this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP2", null, null);
- tryAgain = true;
- break;
- default:
- tryAgain = false;
+ case "Exchange2010":
+ this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2007_SP1", null, null);
+ tryAgain = true;
+ break;
+ case "Exchange2010_SP1":
+ this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010", null, null);
+ tryAgain = true;
+ break;
+ case "Exchange2010_SP2":
+ this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP1", null, null);
+ tryAgain = true;
+ break;
+ case "Exchange2013":
+ this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP2", null, null);
+ tryAgain = true;
+ break;
+ default:
+ tryAgain = false;
}
if (tryAgain) {
- if (this.debug) this.logInfo("Going to retry with lower server version", 2);
+ if (this.debug) {
+ this.logInfo("Going to retry with lower server version", 2);
+ }
this.sendRequest(this.makeSoapMessage(this.originalReq), this.currentUrl);
return true;
}
}
-
- // First check if we have a version mismatch and we need a higher version. This sometimes happens.
- if ((xmlReq.responseText.indexOf("ErrorIncorrectSchemaVersion") > -1) &&
- (xmlReq.responseText.indexOf("RequestServerVersion") > -1) ) {
- if (this.debug) this.logInfo(" ErrorIncorrectSchemaVersion -> RequestServerVersion wrong:"+this.version+".", 2);
+ // Next check if we have a version mismatch and we need a higher version. This sometimes happens.
+ if (xmlReq.responseText.indexOf("ErrorIncorrectSchemaVersion") > -1
+ && xmlReq.responseText.indexOf("RequestServerVersion") > -1) {
+ if (this.debug){
+ this.logInfo(" ErrorIncorrectSchemaVersion -> RequestServerVersion wrong:"+this.version+".", 2);
+ }
// We are going to retry with a different serverversion.
var tryAgain = false;
switch(this.version) {
- case "Exchange2007_SP1":
- this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010", null, null);
- tryAgain = true;
- break;
- case "Exchange2010":
- this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP1", null, null);
- tryAgain = true;
- break;
- case "Exchange2010_SP1":
- this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP2", null, null);
- tryAgain = true;
- break;
- case "Exchange2010_SP2":
- this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2013", null, null);
- tryAgain = true;
- break;
- default:
- tryAgain = false;
+ case "Exchange2007_SP1":
+ this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010", null, null);
+ tryAgain = true;
+ break;
+ case "Exchange2010":
+ this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP1", null, null);
+ tryAgain = true;
+ break;
+ case "Exchange2010_SP1":
+ this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP2", null, null);
+ tryAgain = true;
+ break;
+ case "Exchange2010_SP2":
+ this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2013", null, null);
+ tryAgain = true;
+ break;
+ default:
+ tryAgain = false;
}
if (tryAgain) {
- if (this.debug) this.logInfo("Going to retry with higher server version", 2);
+ if (this.debug) {
+ this.logInfo("Going to retry with higher server version", 2);
+ }
this.sendRequest(this.makeSoapMessage(this.originalReq), this.currentUrl);
return true;
}
}
// This might be generated because of a password not yet supplied in open function during a request so we try again
- //if ((this.prePassword == "") &&
- if ((!exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) || (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount < 3)) {
- if (this.debug) this.logInfo("isHTTPError: We are going to ask the user or password store for a password and try again.");
+ if ((!exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl])
+ || (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount < 3)) {
+ if (this.debug) {
+ this.logInfo("isHTTPError: We are going to ask the user or password store for a password and try again.");
+ }
this.prePassword = this.getPrePassword(this.currentUrl, this.mArgument.user);
if (this.prePassword) {
-
- if (this.debug) this.logInfo("isHTTPError: We received a prePassword. Going to retry current URL");
+ if (this.debug) {
+ this.logInfo("isHTTPError: We received a prePassword. Going to retry current URL");
+ }
if (!exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) {
exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl] = {};
@@ -933,17 +1165,24 @@
exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount++;
xmlReq.abort();
-
this.retryCurrentUrl();
return true;
}
- if (this.debug) this.logInfo("isHTTPError: User canceled request for prePassword.");
+ if (this.debug) {
+ this.logInfo("isHTTPError: User canceled request for prePassword.");
+ }
}
- if ((exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) && (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount > 2)) {
+ // Password were given and that's the third try we have an error
+ if ((exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl])
+ && (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount > 2)) {
// Failed three times. Remove password also from password store.
- if (this.debug) this.logInfo("isHTTPError: Failed password "+exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount+" times. Stopping communication.");
+ if (this.debug) {
+ this.logInfo("isHTTPError: Failed password "
+ + exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount
+ + " times. Stopping communication.");
+ }
var title = "Microsoft Exchange EWS";
var tmpURL = this.currentUrl;
if (this.mArgument.user != "") {
@@ -953,63 +1192,79 @@
var tmpColon = tmpURL.indexOf("://");
tmpURL = tmpURL.substr(0, tmpColon+3) + this.mArgument.user + "@" + tmpURL.substr(tmpColon+3);
}
- this._notificationCallbacks.passwordManagerRemove(this.mArgument.user, tmpURL, title);
+ this.channelCallbackEcAuthPrompt2.passwordManagerRemove(this.mArgument.user, tmpURL, title);
}
+ // Finally reset password cache
if (!exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) {
exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl] = {};
}
-
+
exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
this.prePassword = null;
-
break;
- case 501: errMsg = "Not implemented"; break;
- case 502: errMsg = "Bad gateway"; break;
- case 503: errMsg = "Service unavailable"; break;
- case 504: errMsg = "Gateway timeout"; break;
- case 505: errMsg = "HTTP version not supported"; break;
- case 506: errMsg = "Variant also negotiates (RFC 2295)"; break;
- case 507: errMsg = "Insufficient Storage (WebDAV)(RFC 4918)"; break;
- case 508: errMsg = "Loop detected (WebDAV)(RFC 4918)"; break;
- case 509: errMsg = "Bandwith limit exceeded (Apache bw/limited extension)"; break;
- case 510: errMsg = "Not extended (RFC 2774)"; break;
- case 511: errMsg = "Network authentication required"; break;
- case 598: errMsg = "Network read timeout error"; break;
- case 599: errMsg = "Network connect timeout error"; break;
+ case 501: errMsg = "Not implemented"; break;
+ case 502: errMsg = "Bad gateway"; break;
+ case 503: errMsg = "Service unavailable"; break;
+ case 504: errMsg = "Gateway timeout"; break;
+ case 505: errMsg = "HTTP version not supported"; break;
+ case 506: errMsg = "Variant also negotiates (RFC 2295)"; break;
+ case 507: errMsg = "Insufficient Storage (WebDAV)(RFC 4918)"; break;
+ case 508: errMsg = "Loop detected (WebDAV)(RFC 4918)"; break;
+ case 509: errMsg = "Bandwith limit exceeded (Apache bw/limited extension)"; break;
+ case 510: errMsg = "Not extended (RFC 2774)"; break;
+ case 511: errMsg = "Network authentication required"; break;
+ case 598: errMsg = "Network read timeout error"; break;
+ case 599: errMsg = "Network connect timeout error"; break;
}
- if (this.debug) this.logInfo(": isConnError req.status="+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText, 2);
+ if (this.debug) {
+ this.logInfo(": isConnError req.status="
+ + xmlReq.status + ": " + errMsg
+ + "\nURL:" + this.currentUrl + "\n"
+ + xmlReq.responseText, 2);
+ }
if (this.tryNextURL()) {
return true;
}
- this.fail(this.ER_ERROR_HTTP_ERROR4XX, "HTTP Server error "+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText.substr(0,300)+"\n\n");
- return true;
- }
+ this.fail(this.ER_ERROR_HTTP_ERROR4XX, "HTTP Server error "+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText.substr(0,300)+"\n\n");
+ return true;
+ } // End of error status 5xx
if (this.tryNextURL()) {
return true;
}
- // XXX parse it
- this.fail(this.ER_ERROR_FROM_SERVER, "Unknown error from server"+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText.substr(0,300)+"\n\n");
- return true;
- }
- return false;
- },
+ // XXX parse it
+ this.fail(this.ER_ERROR_FROM_SERVER, "Unknown error from server"
+ + xmlReq.status + ": " + errMsg + "\nURL:"+this.currentUrl
+ + "\n" + xmlReq.responseText.substr(0,300) + "\n\n");
+ return true;
+ } // Received HTTP 200 OK
+
+ // That wasn't an HTTP error
+ return false;
+ },
fail: function(aCode, aMsg)
{
- if (this.debug) this.logInfo("ecExchangeRequest.fail: aCode:"+aCode+", aMsg:"+aMsg);
+ if (this.debug) {
+ this.logInfo("ecExchangeRequest.fail: aCode:"+aCode+", aMsg:"+aMsg);
+ }
+
if (this.mCbError) {
this.mCbError(this, aCode, aMsg);
}
+
this.originalReq = null;
},
+ /*
+ * Generate SOAP message by xml2json
+ */
makeSoapMessage2: function erMakeSoapMessage2(aReq)
{
this.originalReq = aReq;
@@ -1021,23 +1276,23 @@
xml2json.setAttribute(msg, "xmlns:nsTypes", nsTypesStr);
this.version = this.exchangeStatistics.getServerVersion(this.mArgument.serverUrl);
-
+
var header = xml2json.addTag(msg,"Header", "nsSoap", null);
var requestServerVersion = xml2json.addTag(header, "RequestServerVersion", "nsTypes", null);
xml2json.setAttribute(requestServerVersion, "Version", this.version);
-
+
var exchTimeZone = this.timeZones.getExchangeTimeZoneByCalTimeZone(this.globalFunctions.ecDefaultTimeZone(), this.mArgument.serverUrl, cal.now());
if (exchTimeZone) {
- let timeZoneContext = xml2json.addTag(header, "TimeZoneContext", "nsTypes", null);
- let tmpTimeZone = xml2json.addTag(timeZoneContext, "TimeZoneDefinition", "nsTypes");
- if (this.version.indexOf("2007") < 0) {
- xml2json.setAttribute(tmpTimeZone, "Name",exchTimeZone.name);
- }
- xml2json.setAttribute(tmpTimeZone, "Id",exchTimeZone.id);
- tmpTimeZone = null;
- timeZoneContext = null;
+ let timeZoneContext = xml2json.addTag(header, "TimeZoneContext", "nsTypes", null);
+ let tmpTimeZone = xml2json.addTag(timeZoneContext, "TimeZoneDefinition", "nsTypes");
+ if (this.version.indexOf("2007") < 0) {
+ xml2json.setAttribute(tmpTimeZone, "Name",exchTimeZone.name);
+ }
+ xml2json.setAttribute(tmpTimeZone, "Id",exchTimeZone.id);
+ tmpTimeZone = null;
+ timeZoneContext = null;
}
header = null;
@@ -1051,6 +1306,9 @@
return tmpStr;
},
+ /*
+ * Generate SOAP message by mivIxml2jxon
+ */
makeSoapMessage: function erMakeSoapMessage(aReq)
{
this.originalReq = aReq;
@@ -1058,41 +1316,29 @@
var msg = new mivIxml2jxon('<nsSoap:Envelope xmlns:nsSoap="'+nsSoapStr+'" xmlns:nsMessages="'+nsMessagesStr+'" xmlns:nsTypes="'+nsTypesStr+'"/>', 0, null);
this.version = this.exchangeStatistics.getServerVersion(this.mArgument.serverUrl);
-
+
var header = msg.addChildTag("Header", "nsSoap", null);
+ header.addChildTag("RequestServerVersion", "nsTypes", null).setAttribute("Version", this.version);
-/* if (this.mArgument.ServerVersion) {
- header.addChildTag("RequestServerVersion", "nsTypes", null).setAttribute("Version", this.mArgument.ServerVersion);
- }
- else {*/
- header.addChildTag("RequestServerVersion", "nsTypes", null).setAttribute("Version", this.version);
-// }
-
var exchTimeZone = this.timeZones.getExchangeTimeZoneByCalTimeZone(this.globalFunctions.ecDefaultTimeZone(), this.mArgument.serverUrl, cal.now());
if (exchTimeZone) {
- //exchTimeZone.timeZone.tagName = "TimeZoneDefinition";
- //header.addChildTag("TimeZoneContext", "nsTypes", null).addChildTagObject(exchTimeZone.timeZone);
-
- if (this.version.indexOf("2007") > -1) {
- var tmpTimeZone = new mivIxml2jxon('<t:TimeZoneDefinition xmlns:m="'+nsMessagesStr+'" xmlns:t="'+nsTypesStr+'"/>',0,null);
- tmpTimeZone.setAttribute("Id",exchTimeZone.id);
- }
- else {
- var tmpTimeZone = new mivIxml2jxon('<t:TimeZoneDefinition xmlns:m="'+nsMessagesStr+'" xmlns:t="'+nsTypesStr+'"/>',0,null);
- tmpTimeZone.setAttribute("Name",exchTimeZone.name);
- tmpTimeZone.setAttribute("Id",exchTimeZone.id);
- }
- header.addChildTag("TimeZoneContext", "nsTypes", null).addChildTagObject(tmpTimeZone);
- tmpTimeZone = null;
+ if (this.version.indexOf("2007") > -1) {
+ var tmpTimeZone = new mivIxml2jxon('<t:TimeZoneDefinition xmlns:m="'+nsMessagesStr+'" xmlns:t="'+nsTypesStr+'"/>',0,null);
+ tmpTimeZone.setAttribute("Id",exchTimeZone.id);
+ }
+ else {
+ var tmpTimeZone = new mivIxml2jxon('<t:TimeZoneDefinition xmlns:m="'+nsMessagesStr+'" xmlns:t="'+nsTypesStr+'"/>',0,null);
+ tmpTimeZone.setAttribute("Name",exchTimeZone.name);
+ tmpTimeZone.setAttribute("Id",exchTimeZone.id);
+ }
+ header.addChildTag("TimeZoneContext", "nsTypes", null).addChildTagObject(tmpTimeZone);
+ tmpTimeZone = null;
}
header = null;
msg.addChildTag("Body", "nsSoap", null).addChildTagObject(aReq);
-//dump("Going to send1:"+msg.toString().length+", xml:"+msg.getSize()+"\n");
-//dump("Going to send2:"+msg.toString()+"\n");
-
var tmpStr = xml_tag + msg.toString();
msg = null;
return tmpStr;
@@ -1129,9 +1375,7 @@
{
this.fail(this.ERR_PASSWORD_ERROR, aMsg);
},
-
-
-};
+}; // End of ExchangeRequest prototype
var ecPasswordErrorList = {};
@@ -1140,7 +1384,7 @@
this.exchangeRequest = aExchangeRequest;
this.globalFunctions = Cc["@1st-setup.nl/global/functions;1"]
- .getService(Ci.mivFunctions);
+ .getService(Ci.mivFunctions);
this.uuid = this.globalFunctions.getUUID();
this.callback = null;
@@ -1154,13 +1398,12 @@
this.password = null;
this.URL = null;
this.lastStatus = 0; // set by nsIProgressEventSink onStatus.
-
+
this.timer = Cc["@mozilla.org/timer;1"]
- .createInstance(Ci.nsITimer);
+ .createInstance(Ci.nsITimer);
}
ecnsIAuthPrompt2.prototype = {
-
QueryInterface: XPCOMUtils.generateQI([Ci.nsIAuthPrompt2, Ci.nsIBadCertListener2, Ci.nsIProgressEventSink,
Ci.nsISecureBrowserUI, Ci.nsIDocShellTreeItem, Ci.nsIAuthPromptProvider,
Ci.nsIChannelEventSink, Ci.nsIRedirectResultListener]),
@@ -1174,23 +1417,23 @@
if ((Ci.nsIBadCertListener2) && (iid.equals(Ci.nsIBadCertListener2))) {
this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsIBadCertListener2");
- return Cc["@1st-setup.nl/exchange/badcertlistener2;1"].getService(Ci.mivExchangeBadCertListener2);
+ return Cc["@1st-setup.nl/exchange/badcertlistener2;1"].getService(Ci.mivExchangeBadCertListener2);
}
if ((Ci.nsIProgressEventSink) && (iid.equals(Ci.nsIProgressEventSink))) { // iid == d974c99e-4148-4df9-8d98-de834a2f6462
this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsIProgressEventSink");
- return this;
- }
+ return this;
+ }
if ((Ci.nsISecureBrowserUI) && (iid.equals(Ci.nsISecureBrowserUI))) { // iid == 081e31e0-a144-11d3-8c7c-00609792278c
this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsISecureBrowserUI");
- return this;
+ return this;
}
if ((Ci.nsIDocShellTreeItem) && (iid.equals(Ci.nsIDocShellTreeItem))) { // iid == 09b54ec1-d98a-49a9-bc95-3219e8b55089
this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsIDocShellTreeItem");
- return Cr.NS_NOINTERFACE;
- }
+ return Cr.NS_NOINTERFACE;
+ }
if ((Ci.nsIAuthPromptProvider) && (iid.equals(Ci.nsIAuthPromptProvider))) { // iid == bd9dc0fa-68ce-47d0-8859-6418c2ae8576
this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsIAuthPromptProvider");
@@ -1199,12 +1442,12 @@
if ((Ci.nsIChannelEventSink) && (iid.equals(Ci.nsIChannelEventSink))) { // iid == a430d870-df77-4502-9570-d46a8de33154
this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsIChannelEventSink");
- return this;
+ return this;
}
if ((Ci.nsIRedirectResultListener) && (iid.equals(Ci.nsIRedirectResultListener))) { // iid == 85cd2640-e91e-41ac-bdca-1dbf10dc131e
this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsIRedirectResultListener");
- return this;
+ return this;
}
// The next iid is available sine TB 13.
@@ -1219,7 +1462,6 @@
return Cr.NS_NOINTERFACE; // We do not support this.
}
- this.globalFunctions.LOG(" >>>>>>>>>>> SUBMIT THIS LINE TO https://github.com/Ericsson/exchangecalendar/issues: ecnsIAuthPrompt2.getInterface("+iid+")");
throw Cr.NS_NOINTERFACE;
},
@@ -1238,15 +1480,15 @@
this.lastStatus = aStatus;
this.lastStatusArg = aStatusArg;
switch (aStatus) {
- case 0x804b0003: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_RESOLVING of "+aStatusArg); break;
- case 0x804b000b: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_RESOLVED of "+aStatusArg); break;
- case 0x804b0007: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_CONNECTING_TO of "+aStatusArg); break;
- case 0x804b0004: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_CONNECTED_TO of "+aStatusArg); break;
- case 0x804b0005: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_SENDING_TO of "+aStatusArg); break;
- case 0x804b000a: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_WAITING_FOR of "+aStatusArg); break;
- case 0x804b0006: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_RECEIVING_FROM of "+aStatusArg); break;
- default:
- this.logInfo(" --- ecnsIAuthPrompt2.onStatus:"+aStatus+" of "+aStatusArg);
+ case 0x804b0003: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_RESOLVING of "+aStatusArg); break;
+ case 0x804b000b: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_RESOLVED of "+aStatusArg); break;
+ case 0x804b0007: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_CONNECTING_TO of "+aStatusArg); break;
+ case 0x804b0004: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_CONNECTED_TO of "+aStatusArg); break;
+ case 0x804b0005: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_SENDING_TO of "+aStatusArg); break;
+ case 0x804b000a: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_WAITING_FOR of "+aStatusArg); break;
+ case 0x804b0006: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_RECEIVING_FROM of "+aStatusArg); break;
+ default:
+ this.logInfo(" --- ecnsIAuthPrompt2.onStatus:"+aStatus+" of "+aStatusArg);
}
},
@@ -1272,22 +1514,27 @@
this.logInfo(" --- ecnsIAuthPrompt2.tooltipText (nsISecureBrowserUI):");
return "ecnsIAuthPrompt2.tooltipText";
},
-
+
// nsIChannelEventSink
//void asyncOnChannelRedirect(in nsIChannel oldChannel,
- // in nsIChannel newChannel,
- // in unsigned long flags,
- // in nsIAsyncVerifyRedirectCallback callback);
+ // in nsIChannel newChannel,
+ // in unsigned long flags,
+ // in nsIAsyncVerifyRedirectCallback callback);
asyncOnChannelRedirect: function _nsIChannelEventSink_asyncOnChannelRedirect(oldChannel, newChannel, flags, callback)
{
var tmpStr = "";
- if (flags & 1) tmpStr += "REDIRECT_TEMPORARY";
- if (flags & 2) tmpStr += " REDIRECT_PERMANENT";
- if (flags & 4) tmpStr += " REDIRECT_INTERNAL";
+ if (flags & 1) {
+ tmpStr += "REDIRECT_TEMPORARY";
+ }
+ if (flags & 2) {
+ tmpStr += " REDIRECT_PERMANENT";
+ }
+ if (flags & 4) {
+ tmpStr += " REDIRECT_INTERNAL";
+ }
this.logInfo(" --- nsIChannelEventSink.asyncOnChannelRedirect :flags:"+flags+"="+tmpStr);
-
var url1 = "";
var url2 = "";
@@ -1296,8 +1543,8 @@
this.logInfo("We are going to allow the redirect from '"+url1+"' to '"+url2+"'.");
- newChannel.notificationCallbacks = this;
- callback.onRedirectVerifyCallback(Cr.NS_OK);
+ newChannel.notificationCallbacks = this;
+ callback.onRedirectVerifyCallback(Cr.NS_OK);
},
// nsIRedirectResultListener
@@ -1312,7 +1559,7 @@
this.logInfo("getPrePassword for user:"+aUsername+", server url:"+aURL);
this.username = aUsername;
this.URL = aURL;
-
+
var password;
var myAuthPrompt2 = Cc["@1st-setup.nl/exchange/authprompt2;1"].getService(Ci.mivExchangeAuthPrompt2);
if (myAuthPrompt2.getUserCanceled(aURL)) {
@@ -1339,6 +1586,4 @@
this.globalFunctions.LOG(this.uuid+": "+aMsg);
}
},
-
-
-}
+} // End of ecnsIAuthPrompt2 prototype
diff -Nru calendar-exchange-provider-3.9.0/debian/changelog calendar-exchange-provider-4.0.0~beta4/debian/changelog
--- calendar-exchange-provider-3.9.0/debian/changelog 2017-04-08 14:45:28.000000000 +0200
+++ calendar-exchange-provider-4.0.0~beta4/debian/changelog 2017-08-25 19:14:23.000000000 +0200
@@ -1,3 +1,30 @@
+calendar-exchange-provider (4.0.0~beta4-1) unstable; urgency=medium
+
+ * New upstream release
+ * Bump Standard-Version to 4.0.0, no changes needed
+ * Change patching into rules
+ * Correct typos in changelog
+
+ -- Mechtilde Stehmann <mechtilde@debian.org> Fri, 25 Aug 2017 19:14:23 +0200
+
+calendar-exchange-provider (4.0.0~beta2-1) unstable; urgency=medium
+
+ * New upstream release
+ + Changing history_en_US.txt to CHANGELOG.md
+ * Changing dependency and build dependency in control (>= 52)
+ * Adapt description to thunderbird transition
+ * Analog to thunderbird bump to sid
+
+ -- Mechtilde Stehmann <mechtilde@debian.org> Sun, 18 Jun 2017 20:20:56 +0200
+
+calendar-exchange-provider (4.0.0~beta1-1) experimental; urgency=low
+
+ * New upstream release for using with thunderbird 52.x
+ + (Closes: #864484)
+ * Changed upstream URL in control and watch
+
+ -- Mechtilde Stehmann <mechtilde@debian.org> Fri, 09 Jun 2017 18:04:59 +0200
+
calendar-exchange-provider (3.9.0-4) unstable; urgency=low
* debian/patches/bugfix-854025.patch:
diff -Nru calendar-exchange-provider-3.9.0/debian/control calendar-exchange-provider-4.0.0~beta4/debian/control
--- calendar-exchange-provider-3.9.0/debian/control 2017-04-08 14:41:26.000000000 +0200
+++ calendar-exchange-provider-4.0.0~beta4/debian/control 2017-08-25 19:13:23.000000000 +0200
@@ -2,27 +2,27 @@
Section: mail
Priority: optional
Maintainer: Mechtilde Stehmann <mechtilde@debian.org>
-Build-Depends: debhelper (>= 9), mozilla-devscripts, icedove-dev (>= 45) | thunderbird-dev, python-ply
+Build-Depends: debhelper (>= 9), mozilla-devscripts, thunderbird-dev (>= 52), python-ply
Standards-Version: 3.9.8
Vcs-Git: https://anonscm.debian.org/cgit/collab-maint/calendar-exchange-provider.git/
Vcs-Browser: https://anonscm.debian.org/cgit/collab-maint/calendar-exchange-provider.git/
-Homepage: https://github.com/Ericsson/exchangecalendar
+Homepage: https://github.com/ExchangeCalendar/exchangecalendar
Package: calendar-exchange-provider
Architecture: all
-Depends: ${misc:Depends}, ${xpi:Depends}, iceowl-extension | lightning
+Depends: ${misc:Depends}, ${xpi:Depends}, thunderbird (>= 52), lightning
Recommends: ${xpi:Recommends}
Provides: ${xpi:Provides}
Enhances: ${xpi:Enhances}
Breaks: ${xpi:Breaks}
-Description: MS Exchange support for iceowl-extension
+Description: MS Exchange support for Thunderbird/Lightning
This plugin allows one to communicate with an Exchange 2007 or 2010 server
using the Exchange Web Service (EWS) interface.
.
Plugin works with the Exchange Webservice Server of Exchange 2007 or 2010 or
that from Microsoft Office 365.
.
- With this plugin, you can perform these tasks from within Icedove/Thunderbird:
+ With this plugin, you can perform these tasks from within Thunderbird:
.
* Sync Calendar and Task/Todo items from an EWS (Exchange) server. Syncing is
done on a user settable poll interval. It will track changes on the server
diff -Nru calendar-exchange-provider-3.9.0/debian/patches/bugfix-854025.patch calendar-exchange-provider-4.0.0~beta4/debian/patches/bugfix-854025.patch
--- calendar-exchange-provider-3.9.0/debian/patches/bugfix-854025.patch 2017-04-08 14:43:22.000000000 +0200
+++ calendar-exchange-provider-4.0.0~beta4/debian/patches/bugfix-854025.patch 1970-01-01 01:00:00.000000000 +0100
@@ -1,21 +0,0 @@
-bugfix for Bug #854025
-
---- a/interfaces/exchangeCalendar/mivExchangeCalendar.js
-+++ b/interfaces/exchangeCalendar/mivExchangeCalendar.js
-@@ -5569,10 +5569,14 @@
- var proposeStart = this.tryToSetDateValue(input.proposeStart,"");
- var proposeEnd = this.tryToSetDateValue(input.proposeEnd,"");
- var proposeNewTime = false;
--
-+
-+ if ( proposeStart ) {
- input.proposeStart = cal.toRFC3339(proposeStart.getInTimezone(this.globalFunctions.ecUTC()));
-+ }
-+ if ( proposeEnd ) {
- input.proposeEnd = cal.toRFC3339(proposeEnd.getInTimezone( this.globalFunctions.ecUTC()));
--
-+ }
-+
- if( input.proposeStart && input.proposeEnd ){
- proposeNewTime = true;
- }
diff -Nru calendar-exchange-provider-3.9.0/debian/patches/remove-update-notification.patch calendar-exchange-provider-4.0.0~beta4/debian/patches/remove-update-notification.patch
--- calendar-exchange-provider-3.9.0/debian/patches/remove-update-notification.patch 2017-04-08 14:11:48.000000000 +0200
+++ calendar-exchange-provider-4.0.0~beta4/debian/patches/remove-update-notification.patch 1970-01-01 01:00:00.000000000 +0100
@@ -1,9 +0,0 @@
-remove update notification
-
---- a/defaults/preferences/update.js
-+++ b/defaults/preferences/update.js
-@@ -1 +1,3 @@
--user_pref("extensions.1st-setup.others.updateRequired", true);
-+user_pref("extensions.1st-setup.others.updateRequired", false);
-+user_pref("extensions.1st-setup.others.warnAboutNewAddOnVersion", false);
-+user_pref("extensions.1st-setup.others.checkForNewAddOnVersion", false);
diff -Nru calendar-exchange-provider-3.9.0/debian/patches/series calendar-exchange-provider-4.0.0~beta4/debian/patches/series
--- calendar-exchange-provider-3.9.0/debian/patches/series 2017-04-08 13:13:34.000000000 +0200
+++ calendar-exchange-provider-4.0.0~beta4/debian/patches/series 1970-01-01 01:00:00.000000000 +0100
@@ -1,2 +0,0 @@
-remove-update-notification.patch
-bugfix-854025.patch
diff -Nru calendar-exchange-provider-3.9.0/debian/rules calendar-exchange-provider-4.0.0~beta4/debian/rules
--- calendar-exchange-provider-3.9.0/debian/rules 2017-04-08 14:41:26.000000000 +0200
+++ calendar-exchange-provider-4.0.0~beta4/debian/rules 2017-08-25 19:13:23.000000000 +0200
@@ -22,15 +22,19 @@
override_dh_auto_install:
install-xpi -x 'chrome/skins/fugue/Fugue Icons README.txt' \
$$(find $(TOPDIRS) -name *.idl -printf '-x %p ') \
- -x history.en_US.txt \
+ -x CHANGELOG.md \
-x license.txt \
-x defaults/preferences/debug.js \
calendar-exchange-provider.xpi
override_dh_installdocs:
- cp history.en_US.txt Changelog
+ cp CHANGELOG.md Changelog
dh_installdocs
+ mkdir -p $(CURDIR)/debian/calendar-exchange-provider/usr/share/xul-ext/calendar-exchange-provider/defaults/preferences/
+ cd $(CURDIR)/debian/calendar-exchange-provider/usr/share/xul-ext/calendar-exchange-provider/defaults/preferences/ && \
+ cp update_disable.txt update.js
+
override_dh_auto_clean:
dh_auto_clean
find -type f -name *.xpt -delete
diff -Nru calendar-exchange-provider-3.9.0/debian/watch calendar-exchange-provider-4.0.0~beta4/debian/watch
--- calendar-exchange-provider-3.9.0/debian/watch 2017-04-08 14:41:26.000000000 +0200
+++ calendar-exchange-provider-4.0.0~beta4/debian/watch 2017-08-25 19:13:23.000000000 +0200
@@ -1,3 +1,3 @@
version=3
opts="uversionmangle=s/-Beta/~beta/;s/-rc/~rc/,filenamemangle=s/.*\/v?(\d+\.\d+\.\d+(?:-(Beta|rc)\d+)?)\.tar\.gz/exchangecalendar-$1.tar.gz/" \
-https://github.com/Ericsson/exchangecalendar/releases/ .*/v?(\d+\.\d+\.\d+(?:-rc\d+)?)\.tar\.gz
+https://github.com/ExchangeCalendar/exchangecalendar/releases/ .*/v?(\d+\.\d+\.\d+(?:-rc\d+)?)\.tar\.gz
diff -Nru calendar-exchange-provider-3.9.0/history.en_US.txt calendar-exchange-provider-4.0.0~beta4/history.en_US.txt
--- calendar-exchange-provider-3.9.0/history.en_US.txt 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/history.en_US.txt 1970-01-01 01:00:00.000000000 +0100
@@ -1,625 +0,0 @@
-Version 3.7.0:
-- d1b2860 (origin/master, origin/HEAD, master) revert calendar-event-dialog
-- df713f4 Merge pull request #458 from enozkan/patch-5
-- 180e91a Update preferences.dtd for Turkish locale
-
-Version 3.6.0:
-- a2a50be strict mode error fix
-- 5db3c8d task sync and strict mode error fix
-- 16d56bf translation for preference password fix
-- 22850a8 preference password fix
-- 1fcaf4c Merge pull request #423 from Dominique-2202/patch-2
-- 6b16cad French translation calendar-summary-dialog.dtd
-- ae091d5 Merge pull request #422 from Mechtilde/Translation
-- d716986 German translation for calendar-summary-dialog.dtd
-- 65c222a Merge pull request #415 from enozkan/patch-4
-- 1fd65b1 Merge pull request #416 from Trim/erFindContactsOffset
-- 23ca0b3 Merge pull request #417 from Trim/erFindCalendarItems
-- e537089 Update calendar-summary-dialog.dtd for tr
-- 7b4b9fb erFindContacts: give a copy of arrays to callback
-- 2235634 erFindContacts: Use server offset instead of own computation
-- b7dd3aa erFindContacts: remove trailing blanks and use contact logs instead of main logs
-- 9a5b78d erFindContacts: Requests all contacts of address books
-- 4681316 erFindCalendarItems: use slice method to clone javascript arrays
-- 91ac17f erFindCalendarItems: don't cal too many times possibly big array
-- b45a6f4 erFindCalendarItems: use LOG instead of dump
-- 3f9de40 string not translatable #409
-- 9a82408 its good to have xpi filename with 'v' preceeding the version
-
-Version 3.5.0:
-- Fix Thunderbird hangs on startup
-- Fix Be more defensive about terminating the loop: under some circumstances startYearDay (and I presume startYear) can be greater than endYear[Day] on entry to the loop.
-- Fix Reword log, Bug #373 "Incorrect exhortationto MAIL THIS LINE TO ..."
-- Fix Bug #371 "Cannot add custom reminder (alarm) to an event ..."
-- Fix Lightning 4.0.2.1
-
-Version 3.4.0:
-- New Support Extended to Lightning 4.0.0.1
-- New Support Extended to Thunderbird 38.*
-- New EWS Tagger - Feature
-- New Task Email Follow Up - Feature
-- New Language Support For exchange address Book
-- New Mail folder Delegation - Feature
-- New Automatically set lightning time zone
-- New Plug in Builder for deb package
-
-- Fix Reminder Problem
-- Fix #190 - Can not add manually add exchange address book
-- Fix Calendar not refreshing during suspend/resume
-- Fix Busy/Free information wasn’t available
-- Fix Ignore domain request for email user names.
-- Fix freezing on start up
-- Fix Restoring cache
-- Fix rtews.dtd typo fixed
-- Fix Cant not add Google calendar
-- Fix Avoid JS exception in auto completion.
-- Fix Also fill out primary email address if local ID is present
-- Fix Treat public DLs the same way as private ones in auto completion
-- Fix Exchange Icon Update in preference
-- Fix Missing Translation English language
-- Fix Israel Timezone fix for Daylight savings time
-- Fix Password Looping fix
-- New Updated French,German Translation
-- New Preference for mail properties syncing
-- New Preference for Email Follow up
-
-- Change Update suggestions only for stable release
-- Change Minimum Refresh time is set to 60
-- Change Enabled Cache by default or No disable option for cache
-- Change Removed all calendar Refresh time
-- Change Optimized syncing method
-- Change Enable NTLM by default in Thunderbird
-- Change Remove old saved password if user doesn’t choose
-- Change Block adding domain entry in autodiscovery window when email used
-- Change Platform based CSS thanks to git-hub user "@mariolorenz"
-- Change Clear Logging.
-
-Version 3.3.2:
-- Bug fix release
-
-Version 3.3.1:
-- New New Column for invite mail in message list pane
-- New Support for Thunderbird Nightly Aurora 38.0+
-- New Locale improved
-- New Delegating Calendar feature
-- New Auto-update from Git-hub releases
-- New High priority mails with auto tagging - important
-
-- Changed Meetings that are canceled are removed
-- Changed New Event usability issue in lightning
-- Changed Priority column with updated icons,startup preference
-- Changed Cache Clear on Add on Update
-
-- Fixed Dismissing reminder
-- Fixed Accept/Tentative/Reject button appearance
-- Fixed Fix Address Book freeze when attempting to view "Properties"
-- Fixed Tentative status does not get saved
-- Fixed Unable to forward event in Thunderbird
-- Fixed Breaking other add on columns in message list pane
-- Fixed UX error when saving Out of Office
-
-Version 3.2.0:
-- changed add-on name to "Exchange EWS Provider" as it is shorter than including all the exchange versions it can connect to.
-- Fixes bug where sometimes the date/time is shifted on Free/busy info in calendar of someone else.
-- Added preference userAgent. User can now specify their own userAgent string to use in communication.
-- Fixes Bug 277 - Cannot extend the time on a calendar event (Exchange2007)
-- Improved Out Of Office text editor so it is fully HTML aware again.
-- Improved memory usage. It shoud use less memory now. Please read bug 279 on https://www.1st-setup.nl/bugzilla
-- Fixed Bug 287 - no folder details anymore in the ews settings of calendar
-- Fixed a bug where it was not possible to create an exception.
-- Update on French locale.
-- Fixed Bug 291 - Modify instance of recurring meeting fails silently
-- Added Access Control List functionality of Lightning to follow user rights and permissions.
-- Russian translation is added.
-- Fixed problem with new exchange versions of Office365 and Exchange2013.
-- User can mark calendar as readonly. This state is preserved between restarts.
-- Rich text editing of description (body) part for calendar items and task items.
-- Fixed problem where offline cache became out of sync.
-- You can click on links in the description text of invitation and read-only events/tasks
-
-Version 3.2.0-Beta20:
-- Fixed Bug 276 - Duplicate entries, wrong hours and sometimes missing entries when viewving other calendars
-
-Version 3.2.0-Beta16:
-- Fixed Bug 273 - Tmezone in US or Canada triggers XML error and results in HTTP 400 Bad Request.
-
-Version 3.2.0-Beta14:
-- Received new German translation from Björn Töpper.
-- Fixed some small outstanding bugs which will get mentioned when I release the final version.
-
-Version 3.2.0-Beta11:
-- Bug 267 - Problem with upgrade from 3.1.2-bug175-3 to 3.2.0-Beta10
-
-Version 3.2.0-Beta10:
-- Fixed problem where the add-on would not show events and task against an Exchange2013 server.
-- Changed the title of the add-on to "Exchange 2007/2010/2013 Calendar, Tasks, Contacts and GAL Provider"
-- Started work on improving the progress tooltip info.
-- Fixes bug 162 Changing recurring meeting to Wednesdays, moved it to Thursday
-
-Version 3.2.0-Beta9:
-- Introduced loading/showing image when one is available for a contact (addressbook). Only works starting from Exchange server 2010_SP2
-- Fixes a bug where creation of new tasks and Event was not possible since Beta8.
-- Finalized autocompletion. Depending on the connetion speed with the exchange server it can take some time to fill the autocomplete list.
-
-Version 3.2.0-Beta8:
-- Introduced an icon which shows connection status to the exchange server.
-- Introduced autocompletion. It works but could use some refinement.
-- Improved CPU load when the add-on has problems connecting to the exchange server .
-
-Version 3.2.0-Beta6:
-- Improved copying between exchange calendars and non exchange calendars.
-- Fixed snooze/dismiss reminder problems for events and tasks.
-- Improved UI scripts used in XUL.
-- Fixes Bug 264 - Schema failure when dismissing a reminder
-- Fixes Bug 261 - Number of jobs in Status Bar increasing
-- Fixes Bug 255 - Complete state of tasks not working in today pane
-- Fixes Bug 254 - NewEventInterfaces lists calendars twice
-- Fixes Bug 253 - Import Calendar into Exchange Calendar / copy calendar items from one to another
-- Fixes Bug 252 - Internal server error on reminder dismissal
-
-Version 3.2.0-Beta5:
-- Fixed working with attachments lists in the different views/dialogs/panes
-- Customized settings reminders on events and tasks according to what is possible in Exchange.
-- Fixes Bug 255 - Complete state of tasks not working in today pane
-- Fixes Bug 256 - Set custom reminder on task created in outlook without due or entry date not possible
-
-Version 3.2.0-Beta4:
-- Split mivExchangeEvent object into mivExchangeEvent and mivExchangeBaseItem. As preparation for mivExchangeTodo.
-- Improved the conversion from Exchange Timezone to Lightning timezone and from Lightning timezone to Exchange timezone.
-- Added the Exchange task/todo detail fields. Lightning does not known about the by default.
-- Fixes Bug 63 - Repeating tasks posted to Exchange Server have incorrect due date/time
-- Fixes Bug 107 - Snooze state of tasks gets lost after restart
-- Fixes Bug 194 - Tasks appear at wrong date
-- Fixes Bug 215 - Snoozed task reminders continually pop up, dismissing task reminders takes 2 clicks of Dismiss
-- Fixes Bug 235 - Try to set a task due date aways sets the current date time
-- Fixes Bug 250 - No tasks with current 3.2.0 beta
-
-Version 3.2.0-Beta3:
-- Fixes Bug 150 - Dismissing reminders asks to send update for meeting
-- Fixes Bug 180 - NTLM and Kerberos fail
-- Fixes bug 229 - Creating a custom repeating event - creates event on following day
-- Fixes bug 238 - "All day Event" created for day prior to selected date
-- Fixes bug 241 - Autodiscover RedirectAddr not followed
-- Fixes bug 246 - Modifying recurring meeting resulted in "modification failed" errors
-- Moved exchangecalendar object into it's own interface.
-- Create our own recurrenceInfo object/interface.
-
-Version 3.2.0-Beta2:
-- Fixes bug 241 - Autodiscover RedirectAddr not followed
-
-Version 3.2.0-Beta1:
-- Added own ExchangeEvent Interface. With this creation of items from cache or exchange server should be faster.
-- Converted handling of timezones to own interface.
-- Timezone of Lightning events are set to those of Exchange. As close as possible because the timezone databases between Exchange and Lighting are not the same.
-- Added new SOAP Autodiscovery functionality which is supported since Exchange2010. It will use this when available.
-
-Version 3.1.102:
-- Fixes bug 226: No more than 20 contacts are shown.
-
-Version 3.1.99:
-- Fixes Bug 212 - version >= 3.x leaks memory
-- Fixes Bug 211 - 3.1.2 breaks login (3.1.1 working)
-- Fixes Bug 188 - Adding a new Exchange 2010 EWS Calendar via add-on goes into an infinite password prompt loop
-- Fixes Bug 173 - Exchange 2007/2010 Calendar and Tasks Provider deletes Outlook Calendar entries
-- Fixes Bug 164 - Can not Connect to server
-- Fixes Bug 159 - Thunderbird freezes
-- Fixes Bug 157 - Infinity Loope for Password/Username
-- Fixes Bug 143 - The adding uses wrong folder and does not fetch contacts
-
-Version 3.1.2:
-- Fixed bug 175: After 10 calendars the jobs will hang up
-- Fixed bug 201: Number of Jobs displayed in status bar is negative
-- Added new loadbalancer for request to Exchange servers. You can now control the simultaneous request to the exchange server.
-- Created new interface for the global functions.
-- Added extra info to progress indicator. It now also uses the new loadbalancer for the statistics.
-
-Version 3.1.1:
-- Fixed bug 205 Extension overwrites URI for non-exchange calendars
-
-Version 3.1.0:
-- Fixed part of bug51. When emailaddress of attendee is empty do not throw an error.
-- Fixed: Bug where removal of last attachment was not possible.
-- Enhancement: Startup of Thunderbird has been improved.
-- Fixed problem when turning off and on offlineCache.
-
-Version 3.0.2:
-- Minor bug fix.
-
-Version 3.0.1:
-- Fixed bug 196: Version 3.0.0-rc3 seems to interfere with address autocompletion
-- Fixed bug 204: Thunderbird hangs when creating a new item with attachment
-- Added automatic update functionality. This will check the developer website for new versions and give the change to autmoatically install it.
-
-Version 3.0.0:
-- Removed all references to e4x
-- Removed some bugs and stabilized the code.
-
-Version 3.0.0-rc4:
-- Add Japanese translation.
-- Added fix for new chunked message responses from Exchange server.
-
-Version 3.0.0-rc3:
-- Optimized the code to improve speed.
-
-Version 3.0.0-rc2:
-- Optimized the xml handling code so startup and other communications are faster.
-
-Version 3.0.0-rc1:
-- Converted last part, editing of tasks, from e4x to xml2jxon.
-
-Version 3.0.0-beta4:
-- Fixed problem where a reminder change (dismiss or new time) was not saved to exchange.
-
-Version 3.0.0-beta3:
-- Fixed bug 182: Reoccuring Events keep popping up in reminder.
-
-Version 3.0.0-beta2:
-- Fixed two parts which were not yet converted. Editing of tasks still to do.
-
-Version 3.0.0-beta:
-- Complete rewrite of all xml handling stuff from using e4x to the new xmlToJxon object.
-
-Version 2.2.3:
-- Fixed: bug 176 - Calendars whose names contains a slash can't be opened
-
-Version 2.2.2:
-- Fixed: bug 160 - Meeting invitation received does not get added after accepting
-
-Version 2.2.1:
-- Fixed bug when closing TB the offline cache would be emptyed.
-- Fixed: Bug 161 - pb accessing calendars
-
-Version 2.2.0:
-- Fixed complaint of ad-on checker.
-- Fixed bug of cloning a calendar showed empty fields.
-
-Version 2.1.4:
-- Fixed: "Unresponsive script" bug.
-
-Version 2.1.3:
-- Fixed: Bug 52 - Incorrect sync: random calendar events missing, others duplicated
-
-Version 2.1.2:
--Fixed: Bug 118 - Kerberos authentication broken in 1.8.11
-
-Version 2.1.1:
-- Fixed: Bug 151 - Email id property of exchange calendar becomes None on updating thunderbird to 13.0
-- Fixed: Bug 153 - "allday" event -> invite someone -> password request -> communication stopped
-- Improved: Disabled calendars are not started on TB startup.
-- Fixed: The way a calendar startup after is has been created newly.
-
-Version 2.1.0:
-- Fixed filtering of events
-- Fixed saving of the EWS settings.
-- Fixed calendarReset.
-- Improved getItems function.
-
-Version 2.0.5:
-- Added: Processing of getItemsFromOfflineCache into a seperate thread.
-- Fixed: Problem when turning on offline cache this would only start after restarting TB.
-
-Version 2.0.4:
-- Fixed: bug with reminders in offline cache.
-- Added: Extra dialog when answering an invitation.
-
-Version 2.0.2:
-- Improved: Further improved Offline cache items retrieval.
-- Fixed: Bug when receiving a HTTP 302 relative redirect. Because of a typo in the code it threw an exception. Possibly bug 51.
-
-Version 2.0.1:
-- Improved: Offline cache items retrieval.
-
-Version 2.0.0:
-- Added: Offline cache functionality. (When not connected or offline it goes into Read-Only mode)
-- Added: Invitation forwarding functionality.
-
-Version 1.8.19:
-- Fixes: problem where Out Of Office stopped working int TB12. Fix replaces the WYSIWYG editor into a flat text editor.
-- Fixes: Several small bugs.
-
-Version 1.8.18:
-- Addedd access to exchange contacts folders. (Currently READ-ONLY)
-- Fixed: Problem with dismissing and snoozing alarms.
-- Fixed: Problem on autodiscovery where sometimes a EWS URL select list was shown with duplicate entries.
-- Fixed: Other small problems.
-- Fixed: Bug 116 - Authentication fails after Thunderbird-restart
-- Fixed: Bug 24 - Accepting or rejecting of invitations changes owner
-
-Version 1.8.16:
-- Fixed: Bug 122 - New: I get "Event Invitation" email for my own meetings when I import them
-- Fixed: Bug 91 - Recurring appointment causes immediate reminders for all future
-- Fixed a lot of smaller bugs.
-
-Version 1.8.13:
-- Fixed: Bug 120 - All my calendar appointments are not visible in Thunderbird
-- Fixed: Bug 94 - Credentials (Username, Password) for calendars are not stored
-
-Version 1.8.12:
-- Fixed: Bug 117 - tasks calendar shows calendar items
-- Fixed: Problem where only Free/Busy information would be shown for defalt personal calendar.
-
-Version 1.8.6:
-- Fixed: Bug 111 - No events are visible when user only has calendar permission to see Free/Busy info
-
-Version 1.8.5:
-- Fixed: Bug 91 - Recurring appointment causes immediate reminders for all future occurrences
-- Fixed: Bug 107 - Snooze state of tasks gets lost after restart
-- Updated: Code for setting of alarms and snooze parameters changed completely.
-
-Version 1.8.4:
-- Fixed: Bug 103 - aListener not defined in calExchangeCalendar
-- Added: Global minimal memory cache size preferences.
-
-Version 1.8.3:
-- fixed: Bug 102 - Extension continually asks for password
-
-Version 1.8.1:
-- Fixed: Bug 99 - Tasks do not show up in the tasks pane/tab
-
-Version 1.8.0:
-- Added: Full attachment functionality.
-- Fixed: Bug 97 - Last month's events are missing
-
-Version 1.7.18:
-- Fixed: Bug it is not possible to accept or decline a meeting invitation
-
-Version 1.7.17:
-- Fixed: Bug where a HTTP 302 redirect which was called as an error was not handled correctly.
-- Fixed: Bug 31 - Unable to invite attendees
-- Fixed: Bug 45 - Cannot display users own calendar
-- Fixed: Bug 68 - MenuItems for creating new items are disabled
-- Fixed: Bug 77 - Lightening fails to save Microsoft Live Meeting style events to the Exchange calendar
-- Fixed: Bug 80 - request response HTTP 302 redirect is NOT redirected and communication stops
-- Fixed: Bug 82 - Copying of events from google calendar does not work
-- Fixed: Bug 83 - Can't add a calendar -> HTTP-ERROR 500
-- Fixed: Bug 84 - checks performed on disabled calendars
-- Fixed: Bug 85 - Can't open or save file attachments in a calendar meeting
-- Fixed: Bug 86 - Invalid log path on Windows
-- Added: When you try to access another person's calendar but do not have full read permissions it will switch and only tries to get Free/Busy/Tentative/OOF information.
-- Added: The domainname is no longer a required field
-- Added: German localization
-- Added: Setting logging preferences can now be done from the TB preferences.
-- Added: Exporting to ICS. Currently it only export what is has requested from the Exchange server. Default a period of one month ahead and one month back from currentdate.
-- Changed: Changed default CalendarPollInterval to once every 60 seconds and InboxPollInterval to once every 180 seconds.
-
-Version 1.7.15:
-- Fixed: Bug 59 - Exchange sends extra invitations when first one is accepted
-- Fixed: Bug 32 - Unable to add event to calendar using iTIP buttons
-- Fixed: Bug 33 - Accept multiple-day appointment request via iTIP creates single-day event
-- Fixed: Bug 61 - Error: reference to invalid character number when trying to pull in calendar
-- Fixed: Bug 62 - Moving calendar item from one calendar to another fails
-- Added: Functionality to clone an Exchange Calendar.
-- Fixed: Bug 19 - Event stays shown after deletion
-- Fixed: Bug 66 - No workflow (accept, reject, ...) buttons are shown in invitations
-- Fixed: Bug 65 - read only of calendar
-- Added: New debugging preferences and possibility to create a log/debug file.
-- Added: Finer info/error control in communication object.
-
-Version 1.7.13:
-- Added: Folder properties visible in EWS Settings dialog.
-- Added: Mouse cursor wait indication when browsing folders.
-- Added: Add a new calendar base on the information in a share calendar invitation from someone.
-- Fixed: BUG 54 Shared Calendar w/notification: error when closing
-- Fixed: BUG 55 Can't set reminder for a task
-- Added: Opening and saving of attachments. (ReadOnly)
-- Added: Check if lightning is installed and active. When not it will show a warning.
-- Added: Functionality to migrate an Exchange Provider add-on calendar to this add-on.
-- Added: User can change poll interval for calendar through EWS Settings.
-- Fixed: Bug 56 - Not possible to acknowledge repeating meeting
-- Fixed: Small bug when importing an invitation send from a Google Calendar. It does not contain timezone information.
-- Fixed: Bug 38 - Invalid security certificate
-- Added: Mouse cursor wait indicatie when checking server and username on creating an calendar or changing the server settings.
-
-
-Version 1.7.12:
-- Added: Support for Seamonkey.
-- Added: Access to public/shared folders without a mailbox. Only windows username, domain & password required.
-- Added: You can use now a username consisting of a username part followed by ampersand (@) and full domainname and empty domain field or a username and domain field value.
-- Fixed: BUG37. Alarm info on a master calendar item is not show correctly.
-- Fixed: BUG41. Synching meetings with empty titles fails
-- Added: French localization.
-- Fixed: Bug 44 - Synchronizaton fails when a calendar item has no start date
-- Fixed: Bug 39 - Accepting a meeting does not get updated in Lightning
-- Added: Importing ICS file.
-- Change: Changed namespacing on request of Mozilla.
-
-
-Version 1.7.11:
-- Modified: Debug log lines show more usefull information.
-- Fixed: BUG 30: Accept via iTIP button fails for requests sent to distribution lists
-- Improved: The processing of meeting invitations is complete. Even the iTIP buttons work.
-
-Version 1.7.10a3:
-- Fixed an Exchange server version problem in function GetMeetingRequestByUID. It did not work correctly on Exchange 2007
-
-Version 1.7.10a1:
-- Fixed: BUG 28 "NL -> EN translation string" EN != "Settings voor calendar"
-- Fixed: BUG 24 "Accepting or rejecting of invitations changes owner". Meeting invitations are not yet working as wanted when using iTIP buttons.
-
-Version 1.7.9:
-- Fixed: Meeting requests and updates to these requests were not processed in the right way.
-
-Version 1.7.8:
-- Fixed: BUG 25 Recuring event with reminder prevents calendar refresh
-- Fixed: BUG 26 Deleting a single occurrence in a sequence has no effect
-- Fixed: BUG 27 Today Pane Tasks fails to show newly created tasks
-
-Version 1.7.7:
-- Fixed: BUG 24 "Accepting or rejecting of invitations changes owner"
-- Fixed: Stabilized meeting invitations in global. Now works with distribution lists, other alias name, etc...
-
-Version 1.7.7a3:
-- Fixed: BUG 23 "Request sent instead of Confirmation; wrong Timezone"
-- Fixed: Trying to mark a task as completed gives an update error: "CompleteDate cannot be set to a date in the future."
-- Fixed: Removing the completed task status through the checkbox in the task view produces an error.
-
-Version 1.7.7a2:
-- Fixed: Could not respond to aa meeting invitation where the mailbox name was different in character Upper/Lowercase than the emailaddress in the invitation.
-
-Version 1.7.7a1:
-- Fixed: Chagning/updating of an existing item where you are the organiser but also on the attendee list, created by outlook, gave an error.
-- Added: The add-on now modifies the Exchange nextreminderdate on the Exchange server as the old Exchange provider add-on did. This is part of the merge of the add-ons.
-
-Version 1.7.6:
-- Added: Progres indicator with tooltip. (closes BUG report 14)
-- Solved: BUG 16 Cannot create event due to Time Zone error (reported by Sven)
-- solved: BUG 17 Out of office retrieval of incorrect values (reported by Sven)
-- Solved: When you are editing Out Of Office settings and had the externel reply window open and did a save the text for the external reply was changed by the internal reply message.
-- Added: It is not possible anymore to add tasks to a calendar folder and calendaritems in a tasks folder. This would produce an error.
-- Fixed: BUG 18 Changing the end or start date of an allday event produces an error. (reported by Sven)
-
-Version 1.7.5:
-- Minor changes to keep the add-on working in version 10.0a2.
-- Fixed: Problem where timezone information downloading did not work for exchange 2007.
-
-Version 1.7.4:
-- Added: The snooze and dismiss states are saved on the exchange server so they survive a restart of TB. Was a problem when "show missed alarms" was on. (BUG 12 reported by pazz)
-- Solved: Shut-down is faster.
-
-Version 1.7.3:
-- Solved: BUG 11/ During creation of an allday event with a reminder or turning on the reminder on an existing allday event triggers an error and change is not saved. (reported by gislair)
-
-Version 1.7.2:
-- Solved: When the windows account got locked the password manager kept asking for a password. Now after tree failed attempts it will stop asking until a restart.
-- Solved: Respong to a meeting request through the iTIP buttons generated an error and did not work.
-
-Version 1.7.1:
-- Solved: When an organiser removed a meeting which was confirmed the update in your calendar was performed every 3 seconds.
-
-Version 1.7.0:
-- Changed: Folder browser shows different icons for different folderclass property.
-- Solved: Removing a meeting in a public folder did not work an give error.
-- Solved: Buttons Save and cancel in the EWS settings dialog would drop of dialog window.
-- Major version changed into 1 because the add-on is feature complete.
-
-Version 0.7.47:
-- New: Selecting the right folder below the folderbase can now be done through a folder browser.
-
-Version 0.7.46
-- Improved: Creation, modification and deletion of repeating events.
-
-Version 0.7.45
-- Solved: Removing a repeating event did not allways work.
-
-Version 0.7.44
-- Solved: Creating an all day event did not work anymore.
-
-Version 0.7.42
-- Solved: Some alarms could not be removed.
-- Solved: For repeating meetings multiple alarms were shown, with same titel and date, when option show missed alarms was on in Lightning settings.
-- Added: Option to automatically remove responses to meetingrequest from your inbox when you are not the organiser.
-- Solved: BUG10 reported by P.Palai.
-
-Version 0.7.41
-- Solved: Checking/searching for certain folderpath locations did not work.
-- Solved: Manipulating occurrences in a repeating meeting did not always work.
-- Solved: Changing the EWS settings did not refresh the calendar and therefore the changes were not visible.
-
-Version 0.7.40
-- Some small changed to make shared funcitonality available to the Exchange Contacts add-on
-- Meetingrequest in a non personal folder we show als invitation request to the use. Now they are not shown anymore as invitation request.
-- Added different job queues for synchronization and modify actions to the EWS server. During startup changes are show earlier.
-
-Version 0.7.39
-- User must choose to whom invitation updates are send.
-- Added a new calender folder poller which will sync by default every 10 seconds.
-
-Version 0.7.38
-- Changes in meetings in personal calendars will be send always to all involved persons.
-- In a later version the extension will ask the user to specify what he wants (send updates or not)
-
-Version 0.7.37
-- Fixed problem where after an autodiscovery and server and mailbox check did not work.
-- Removing a calendar will remove all settings and running processes.
-
-Version 0.7.36
-- Fixed a warning in the Mozilla tests.
-
-Version 0.7.35
-- Fixed bug (reported by Tudor Timisescu). Check for server and mailbox did not work anymore.
-
-Version 0.7.34
-- Added management of Out of Office settings.
-
-Version 0.7.33
-- Added three new options to the EWS preferences for each calendar.
-- Completed list of "base folder" options.
-
-Version 0.7.32
-- EWS Timezome information added for Exchange2007(_SP1) servers
-- Problems with allday event solved (see version 0.7.30)
-- Tasks date and times are working now for different timezones.
-- Version is stable for production use.
-
-Version 0.7.31
-- Fixed upgrade problem between versions 0.7.29 and 0.7.30
-
-Version 0.7.30
-- Timezone is added correctly. There is even a difference between a 2010 or 2007 version of Exchange.
-- Starting mechanism is optimized.
-- A calendar reset is done completely now.
-- Known problem: If you add a alldayevent EWS will add an extra day infront of it. So 1 allday becomes two.
-
-Version 0.7.29
-- Added the posibility to change your reaction to an invitation request in the meetingresponse screen.
-
-Version 0.7.28
-- Addedd extra options to the EWS Settings.
-
-Version 0.7.27
-- Fixed bug 6. TB becomes unresponsive on paging back in week view.
-
-Version 0.7.26
-- Extra settings for each calendar (poll inbox)
-- Inbox poller results are better processed.
-- Settings are now saved in the right location within preferences..
-
-Version 0.7.22
-- Deleting of an occurrence from a string does work now.
-- Alarms can be dismissed or gesnoozed.
- This status is not saved between TB restarts.
- This is an in memory status maintained by TB.
-
-Version 0.7.21
-- iTIP processing improved.
-
-Version 0.7.20
-- Settings and alarm on recurring appointments is better handled.
-
-Version 0.7.19
-- Fixed BUG 4.
-- Fixed BUG 5.
-- So called observers are broken down in the right way.
-
-Version 0.7.18
-- Fixed BUG 3.
-- Alarm changing improved.
-
-Version 0.7.17
-- Fixed BUG 2.
-
-Version 0.7.16
-- Task alarms are being set in the right way.
-- Dismiss or snooze the alarm of a task is working now.
-
-Version 0.7.15
-- Removed all storage of passwords in Memory. All password are only stored by the default Thunderbird Password Manager.
-
-Version 0.7.14
-- Imporved iTIP processing.
-
-Version 0.7.13
-- Source code cleanup.
-- Exception "nsIAuthPrompt2.asyncPromptAuth" solved.
-- Failures during creating connections to server are better handled.
-
-Version 0.7.12
-- Changed text on buttons for MessageRespons screen.
-- Fixed where it was not possible to create an alldayevent.
-- Dismissing an alarm will work.
-
-Version 0.7.11
-- Improved iTIP processing.
-
-Version 0.7.10
-- Fixed problem for date/time conversions. Through this problem some appointments were show on the wrong date or time.
diff -Nru calendar-exchange-provider-3.9.0/install.rdf calendar-exchange-provider-4.0.0~beta4/install.rdf
--- calendar-exchange-provider-3.9.0/install.rdf 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/install.rdf 2017-07-03 22:10:10.000000000 +0200
@@ -5,13 +5,13 @@
<Description about="urn:mozilla:install-manifest">
<em:id>exchangecalendar@extensions.1st-setup.nl</em:id>
- <em:version>3.9.0</em:version>
+ <em:version>4.0.0-beta4</em:version>
<em:targetApplication>
<Description>
<!-- Thunderbird -->
<em:id>{3550f703-e582-4d05-9a08-453d09bdfdc6}</em:id>
<em:minVersion>12.0</em:minVersion>
- <em:maxVersion>50.*</em:maxVersion>
+ <em:maxVersion>52.*</em:maxVersion>
</Description>
</em:targetApplication>
@@ -20,7 +20,7 @@
<!-- Seamonkey -->
<em:id>{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}</em:id>
<em:minVersion>2.6</em:minVersion>
- <em:maxVersion>2.26.*</em:maxVersion>
+ <em:maxVersion>2.46.*</em:maxVersion>
</Description>
</em:targetApplication>
@@ -30,7 +30,7 @@
You can view, delete, create and update calendar and task/todo items. And manage "Out of Office" settings.
-Dutch, French, English, German, Swedish and Japanese localizations.
+Dutch, French, English, German, Swedish, Japanese, Russian, Italian and Turkish localizations.
Some of the icons and images used are from the Fugue Icons Collection made by Yusuke Kamiyamane (http://p.yusukekamiyamane.com/)</em:description>
<em:creator>Ericsson (exchangecalendar@ericsson.com)</em:creator>
@@ -42,6 +42,8 @@
<em:translator>Björn Töpper (de)</em:translator>
<em:translator>Hiroshi Miura (ja-JP)</em:translator>
<em:translator>Alexey Sinitsyn (ru)</em:translator>
+ <em:translator>Alessandro Menti (it-IT)</em:translator>
+ <em:translator>Engin Özkan (tr)</em:translator>
<em:homepageURL>http://www.1st-setup.nl/wordpress/?page_id=133</em:homepageURL>
<em:iconURL>chrome://exchangecalendar-common/skin/images/lightningexchangecalendar.png</em:iconURL>
<em:type>2</em:type> <!-- type: extension -->
@@ -56,7 +58,7 @@
You can view, delete, create and update calendar and task/todo items. And manage "Out of Office" settings.
You can read and use contacts and global addres list contacts for address autcompletion.
-Dutch, French, English, German, Swedish and Japanese localizations.
+Dutch, French, English, German, Swedish, Japanese, Russian, Italian and Turkish localizations.
Some of the icons and images used are from the Fugue Icons Collection made by Yusuke Kamiyamane (http://p.yusukekamiyamane.com/)</em:description>
</Description>
@@ -71,7 +73,7 @@
Sie können diese Kalender- und Aufgabeneinträge betrachten, löschen, erstellen und aktualisieren. Sie können die "Out of Office"-Einstellungen verwalten.
Sie können Kontakte und globale Adresslisten lesen und für die Autovervollständigung der Adressen nutzen.
-Übersetzungen in Niederländisch, Französisch, Deutsch Schwedisch und Japanisch.
+Übersetzungen in Niederländisch, Französisch, Deutsch, Schwedisch, Japanisch, Russisch, Italienisch und Türkisch.
Einige der Icons und die Bilder werden aus der Fugue Icons Collection erstellt von Yusuke Kamiyamane (http://p.yusukekamiyamane.com/) genutzt.
</em:description>
@@ -123,5 +125,34 @@
</Description>
</em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>it-IT</em:locale>
+ <em:name>Provider Exchange EWS</em:name>
+ <em:description>Consente di sincronizzare i propri Calendario, Attività e Contatti con un server Microsoft Exchange 2007/2010/2013 EWS da Lightning.
+
+È possibile visualizzare, eliminare, creare e aggiornare elementi del Calendario e Attività/Da fare e gestire le opzioni Fuori sede.
+È possibile leggere e utilizzare i propri contatti e i contatti della Global Address List per l'autocompletamento degli indirizzi.
+
+Localizzato in olandese, francese, inglese, tedesco, svedese, giapponese e italiano.
+
+Alcune delle icone e immagini utilizzate sono state tratte dalla Fugue Icons Collection di Yusuke Kamiyamane (http://p.yusukekamiyamane.com/)</em:description>
+ </Description>
+ </em:localized>
+
+ <em:localized>
+ <Description>
+ <em:locale>tr</em:locale>
+ <em:name>Exchange EWS Sağlayıcısı</em:name>
+ <em:description>Lightning içinde, Takvim, Görevler ve Kişileri Microsoft Exchange 2007/2010/2013 EWS sunucunuzla eşitlemenizi sağlar.
+
+Takvim ve Görev-Yapılacaklarınızdaki maddeleri görebilir ve silebilir, yeni maddeler yaratabilir ya da maddeleri güncelleyebilirsiniz. "İşyeri Dışında" ayarlarınızı da denetleyebilirsiniz.
+Kişilerinizdeki ve Genel Adres Listesindeki kişileri görebilir ve automatik adres tamamlamada kullanabilirsiniz.
+
+Almanca, Flemenkçe, Fransızca, İngilizce, İsveççe, İtalyanca, Japonca, Rusça, ve Türkçe yerelleştirmeleri vardır.
+
+Bazı ikon ve imgeler, Yusuke Kamiyamane tarafından yapılmış olan Fugue Icons Collection'dan alınıp kullanılmıştır. (http://p.yusukekamiyamane.com/)</em:description>
+ </Description>
+ </em:localized>
</Description>
</RDF>
diff -Nru calendar-exchange-provider-3.9.0/interfaces/exchangeAuthPrompt2/mivExchangeAuthPrompt2.js calendar-exchange-provider-4.0.0~beta4/interfaces/exchangeAuthPrompt2/mivExchangeAuthPrompt2.js
--- calendar-exchange-provider-3.9.0/interfaces/exchangeAuthPrompt2/mivExchangeAuthPrompt2.js 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/interfaces/exchangeAuthPrompt2/mivExchangeAuthPrompt2.js 2017-07-03 22:10:10.000000000 +0200
@@ -109,8 +109,6 @@
// var realm = aRealm;
var realm = "Exchange Web Service";
- //this.logInfo("getPassword: useCached:"+useCached);
-
if (!realm) {
this.logInfo("getPassword: No realm specified. Trying to get it from the URL.");
var ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
@@ -129,7 +127,7 @@
if we have password from cache or manager, and we have a password in the channel. We are going to match them.
Because when they are equal then the cached and stored password were wrong. Otherwise we did not get here.
- When no password at al always ask. */
+ When no password at all always ask. */
var password;
if (this.passwordCache[username+"|"+aURL+"|"+realm]) {
@@ -166,17 +164,18 @@
this.logInfo("getPassword: password(2)=********");
}
- if ((password) && (aChannel) && (aChannel.URI.password) && (decodeURIComponent(aChannel.URI.password) != "")) {
+ if ((password) && (aChannel) && (aChannel.URI.password)
+ && (decodeURIComponent(aChannel.URI.password) != "")) {
this.logInfo("getPassword: There was a password in cache or passwordManager and one on the channel. Going to see if they are the same.");
- if ((password == decodeURIComponent(aChannel.URI.password)) && (!useCached)) {
+ if ((password === decodeURIComponent(aChannel.URI.password)) && (!useCached)) {
this.logInfo("getPassword: There was a password in cache or passwordManager and one on the channel. And they are the same. Going to ask user to provide a new password.");
- if ((this.details[aURL]) && (this.details[aURL].ntlmCount == 1)) {
+ if ((this.details[aURL]) && (this.details[aURL].ntlmCount === 1)) {
this.logInfo("getPassword: There was a password in cache or passwordManager and one on the channel. And they are the same. But it is a first pass on an NTLM authentication. Using stored password and going to see if it can be used.");
}
else {
this.logInfo("getPassword: There was a password in cache or passwordManager and one on the channel. And they are the same. Going to ask user to provide a new password.");
var channel = aChannel.QueryInterface(Ci.nsIHttpChannel);
- if( channel.responseStatus == 401 ){
+ if( channel.responseStatus === 401 ){
password=null;
this.logInfo("getPassword: Login Failed, Going to ask user to provide a new password.");
}
@@ -261,17 +260,23 @@
asyncPromptAuthNotifyCallback: function _asyncPromptAuthNotifyCallback(aURL)
{
if (!this.details[aURL]) {
- this.logInfo("asyncPromptAuthNotifyCallback: This is strange, We do not have this URL '"+aURL+"' in queue");
+ this.logInfo("asyncPromptAuthNotifyCallback: This is strange, We do not have this URL '"
+ + aURL + "' in queue");
return;
}
if (this.details[aURL].showing) {
- this.logInfo("asyncPromptAuthNotifyCallback: Allready showing a prompt or trying to get the password for URL '"+aURL+"'. Not going to try again until the active one has finished.");
+ this.logInfo("asyncPromptAuthNotifyCallback: Already showing a prompt or trying to get the password for URL '"
+ + aURL + "'. Not going to try again until the active one has finished.");
return;
}
+ else {
+ this.details[aURL].showing = true;
+ }
- if (this.details[aURL].queue.length == 0) {
- this.logInfo("asyncPromptAuthNotifyCallback: This is strange, We do not have a request in queue for URL '"+aURL+"'.");
+ if (this.details[aURL].queue.length === 0) {
+ this.logInfo("asyncPromptAuthNotifyCallback: This is strange, We do not have a request in queue for URL '"
+ + aURL +"'.");
return;
}
@@ -279,7 +284,9 @@
// We grab the first one from the queue.
var request = this.details[aURL].queue.shift();
- this.logInfo("asyncPromptAuthNotifyCallback: Removed request from queue["+aURL+"]. There are now '"+this.details[aURL].queue.length+"' requests in queue left.");
+ this.logInfo("asyncPromptAuthNotifyCallback: Removed request from queue["
+ + aURL + "]. There are now '"
+ + this.details[aURL].queue.length + "' requests in queue left.");
var aChannel = request.channel;
var aCallback = request.callback;
var aContext = request.context;
@@ -288,7 +295,9 @@
var canUseBasicAuth = false;
if (this.details[aURL].previousFailedCount > 4) { // Maybe make this a user preference
- this.logInfo("asyncPromptAuthNotifyCallback: We have more than '"+this.details[aURL].previousFailedCount+"' previous failed for '"+aURL+"'.");
+ this.logInfo("asyncPromptAuthNotifyCallback: We have more than '"
+ + this.details[aURL].previousFailedCount + "' previous failed for '"
+ + aURL +"'.");
aCallback.onAuthCancelled(aContext, false);
return;
}
@@ -309,7 +318,7 @@
username = this.globalFunctions.trim(decodeURIComponent(aChannel.URI.username));
}
- if (username == "") {
+ if (username === "") {
// We do not have a username. We need to prompt for one.
// This should always be filled in. So for now we error.
this.logInfo("asyncPromptAuthNotifyCallback: username is empty. This is not allowed.");
@@ -319,25 +328,25 @@
this.logInfo("asyncPromptAuthNotifyCallback: username="+username);
if (!error) {
- // Trying to get realm from response header. This is used when basic authentication is available.
+ // Trying to get realm from response header.
+ // This is used when basic authentication is available.
var realm = "exchange.server";
try {
var acceptedAuthentications = aChannel.getResponseHeader("WWW-Authenticate");
acceptedAuthentications = acceptedAuthentications.split("\n");
- for each (var index in acceptedAuthentications) {
- this.logInfo("asyncPromptAuthNotifyCallback: WWW-Authenticate:"+index);
- if (index.indexOf("realm=") > -1) {
- realm = index.substr(index.indexOf("realm=")+6);
- while (realm.indexOf('"') > -1) {
- realm = realm.replace('"', "");
- }
- this.logInfo("asyncPromptAuthNotifyCallback: Found a realm going to use it. realm="+realm);
+
+ for (let acceptAuth of acceptedAuthentications) {
+ this.logInfo("asyncPromptAuthNotifyCallback: WWW-Authenticate:" + acceptAuth);
+ if (acceptAuth.indexOf("realm=") > -1) {
+ realm = acceptAuth.substr(index.indexOf("realm=") + 6);
+ realm = realm.replace(/"/g, "");
+ this.logInfo("asyncPromptAuthNotifyCallback: Found a realm going to use it. realm=" + realm);
canUseBasicAuth = true;
}
}
}
catch(err) {
- this.logInfo("asyncPromptAuthNotifyCallback: NO WWW-Authenticate in response header!?");
+ this.logInfo("asyncPromptAuthNotifyCallback: WWW-Authenticate HTTP response header not found !");
}
// try to get password.
@@ -350,7 +359,7 @@
error = true;
}
- if ((!password) || (password == null)) {
+ if ((!password)) {
error = true;
}
else {
@@ -359,8 +368,8 @@
}
}
+ // Return credentials we have obtained
if (!error) {
- // Return credentials we have obtained
if (!(authInfo.flags & Ci.nsIAuthInformation.ONLY_PASSWORD)) {
this.logInfo("asyncPromptAuthNotifyCallback: authInfo wants username and password and possibly domainname.");
if (authInfo.flags & Ci.nsIAuthInformation.NEED_DOMAIN) {
@@ -379,7 +388,7 @@
else {
this.logInfo("asyncPromptAuthNotifyCallback: We do not have a domainname part in the username. Specifying empty one.");
authInfo.username = username;
- }
+ }
}
else {
authInfo.username = username;
@@ -416,9 +425,7 @@
}
}
}
-
- //this.details[aURL].showing = false;
-
+ this.details[aURL].showing = false;
},
asyncPromptAuthCancelCallback: function _asyncPromptAuthCallBack(aReason, aURL, aUUID)
@@ -564,11 +571,11 @@
try {
var acceptedAuthentications = aChannel.getResponseHeader("WWW-Authenticate");
acceptedAuthentications = acceptedAuthentications.split("\n");
- for each (var index in acceptedAuthentications) {
- this.logInfo("promptAuth: WWW-Authenticate:"+index);
- if (index.indexOf("realm=") > -1) {
- realm = index.substr(index.indexOf("realm=")+6);
- this.logInfo("promptAuth: Found a realm going to use it. realm="+realm);
+ for (let authenticateHeader of acceptedAuthentications) {
+ this.logInfo("promptAuth: WWW-Authenticate:" + authenticateHeader);
+ if (authenticateHeader.indexOf("realm=") > -1) {
+ realm = index.substr(authenticateHeader.indexOf("realm=")+6);
+ this.logInfo("promptAuth: Found a realm going to use it. realm=" + realm);
}
}
}
@@ -625,7 +632,7 @@
.getService(Ci.nsILoginManager);
var logins = loginManager.findLogins({}, aURL, null, aRealm);
- for each (var loginInfo in logins) {
+ for (let loginInfo of logins) {
if (loginInfo.username == aUsername) {
this.logInfo("passwordManagerGet found password for: username="+aUsername+", aURL="+aURL+", aRealm="+aRealm);
return { result: true, password: loginInfo.password};
@@ -654,12 +661,12 @@
if (logins.length > 0) {
var modified = false;
- for each (let loginInfo in logins) {
- if (loginInfo.username == aUsername) {
+ for (let loginInfo of logins) {
+ if (loginInfo.username === aUsername) {
this.logInfo("Login credentials updated:username="+aUsername+", aURL="+aURL+", aRealm="+aRealm);
loginManager.removeLogin(loginInfo);
modified = true;
- break;
+ break;
}
}
if (!modified) {
@@ -699,7 +706,7 @@
if (logins.length > 0) {
var modified = false;
- for each (let loginInfo in logins) {
+ for (let loginInfo of logins) {
if (loginInfo.username == aUsername) {
this.logInfo("Login credentials updated:username="+aUsername+", aURL="+aURL+", aRealm="+aRealm);
loginManager.modifyLogin(loginInfo, newLoginInfo);
diff -Nru calendar-exchange-provider-3.9.0/interfaces/exchangeCalendar/mivExchangeCalendar.js calendar-exchange-provider-4.0.0~beta4/interfaces/exchangeCalendar/mivExchangeCalendar.js
--- calendar-exchange-provider-3.9.0/interfaces/exchangeCalendar/mivExchangeCalendar.js 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/interfaces/exchangeCalendar/mivExchangeCalendar.js 2017-07-03 22:10:10.000000000 +0200
@@ -5570,8 +5570,10 @@
var proposeEnd = this.tryToSetDateValue(input.proposeEnd,"");
var proposeNewTime = false;
- input.proposeStart = cal.toRFC3339(proposeStart.getInTimezone(this.globalFunctions.ecUTC()));
- input.proposeEnd = cal.toRFC3339(proposeEnd.getInTimezone( this.globalFunctions.ecUTC()));
+ if (proposeStart)
+ input.proposeStart = cal.toRFC3339(proposeStart.getInTimezone(this.globalFunctions.ecUTC()));
+ if (proposeEnd)
+ input.proposeEnd = cal.toRFC3339(proposeEnd.getInTimezone( this.globalFunctions.ecUTC()));
if( input.proposeStart && input.proposeEnd ){
proposeNewTime = true;
diff -Nru calendar-exchange-provider-3.9.0/interfaces/global/mivFunctions.js calendar-exchange-provider-4.0.0~beta4/interfaces/global/mivFunctions.js
--- calendar-exchange-provider-3.9.0/interfaces/global/mivFunctions.js 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/interfaces/global/mivFunctions.js 2017-07-03 22:10:10.000000000 +0200
@@ -35,7 +35,11 @@
function mivFunctions()
{
- //dump("\n ++ mivFunctions.init\n");
+ // Mozilla helpers
+ this.domParser = Cc["@mozilla.org/xmlextras/domparser;1"]
+ .getService(Ci.nsIDOMParser);
+ this.xmlSerializer = Cc["@mozilla.org/xmlextras/xmlserializer;1"]
+ .createInstance(Ci.nsIDOMSerializer);
}
mivFunctions.prototype = {
@@ -875,16 +879,16 @@
fromText2HTML: function _fromText2HTML(aString)
{
- var html = convertSpecialCharatersToXML(aString);
- if (html) {
- html = html.replace(/\n/g, '<br>');
- }
- else {
- html = "";
+ let parsedHtml = null;
+
+ if (!aString) {
+ aString = "";
}
- return '<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></HEAD><BODY>'+html+'</BODY></HTML>';
- },
+ parsedHtml = this.domParser.parseFromString(aString, 'text/html');
+
+ return this.xmlSerializer.serializeToString(parsedHtml);
+ },
}
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/de/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/de/calendar-event-dialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/de/calendar-event-dialog.dtd 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/de/calendar-event-dialog.dtd 1970-01-01 01:00:00.000000000 +0100
@@ -1,7 +0,0 @@
-<!ENTITY exchWebService.owner.label "Besitzer:">
-<!ENTITY exchWebService.totalWork.label "Gesamtaufwand:">
-<!ENTITY exchWebService.actualWork.label "Ist-Aufwand:">
-<!ENTITY exchWebService.mileage.label "Reisekilometer:">
-<!ENTITY exchWebService.billingInformation.label "Abrechnungsinfo:">
-<!ENTITY exchWebService.companies.label "Firma:">
-
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/de/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/de/lightning-item-iframe.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/de/lightning-item-iframe.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/de/lightning-item-iframe.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,7 @@
+<!ENTITY exchWebService.owner.label "Besitzer:">
+<!ENTITY exchWebService.totalWork.label "Gesamtaufwand:">
+<!ENTITY exchWebService.actualWork.label "Ist-Aufwand:">
+<!ENTITY exchWebService.mileage.label "Reisekilometer:">
+<!ENTITY exchWebService.billingInformation.label "Abrechnungsinfo:">
+<!ENTITY exchWebService.companies.label "Firma:">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/en-US/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/en-US/calendar-event-dialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/en-US/calendar-event-dialog.dtd 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/en-US/calendar-event-dialog.dtd 1970-01-01 01:00:00.000000000 +0100
@@ -1,7 +0,0 @@
-<!ENTITY exchWebService.owner.label "Owner:">
-<!ENTITY exchWebService.totalWork.label "Total work:">
-<!ENTITY exchWebService.actualWork.label "Actual work:">
-<!ENTITY exchWebService.mileage.label "Mileage:">
-<!ENTITY exchWebService.billingInformation.label "Billing information:">
-<!ENTITY exchWebService.companies.label "Company:">
-
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/en-US/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/en-US/lightning-item-iframe.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/en-US/lightning-item-iframe.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/en-US/lightning-item-iframe.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,7 @@
+<!ENTITY exchWebService.owner.label "Owner:">
+<!ENTITY exchWebService.totalWork.label "Total work:">
+<!ENTITY exchWebService.actualWork.label "Actual work:">
+<!ENTITY exchWebService.mileage.label "Mileage:">
+<!ENTITY exchWebService.billingInformation.label "Billing information:">
+<!ENTITY exchWebService.companies.label "Company:">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/attachments-view.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/attachments-view.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/attachments-view.dtd 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/attachments-view.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -1,2 +1,2 @@
-<!ENTITY exchWebServie.add.attachment.button.label "Attachements">
+<!ENTITY exchWebServie.add.attachment.button.label "Pièces jointes">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/calendar-event-dialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/calendar-event-dialog.dtd 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/calendar-event-dialog.dtd 1970-01-01 01:00:00.000000000 +0100
@@ -1,7 +0,0 @@
-<!ENTITY exchWebService.owner.label "Responsable:">
-<!ENTITY exchWebService.totalWork.label "Temps total:">
-<!ENTITY exchWebService.actualWork.label "Temps réalisé:">
-<!ENTITY exchWebService.mileage.label "Durée:">
-<!ENTITY exchWebService.billingInformation.label "Information de facturation:">
-<!ENTITY exchWebService.companies.label "Compagnie:">
-
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/exchangeSettingsOverlay.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/exchangeSettingsOverlay.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/exchangeSettingsOverlay.dtd 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/exchangeSettingsOverlay.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -50,7 +50,7 @@
<!ENTITY exchWebServices.UserAvailability.label "Seul le status de disponibilité de l'utilsateur du calendrier de cette BAL sera visible.">
-<!ENTITY exchWebServices.exchtype.label "Exchange Type">
-<!ENTITY exchWebServices.hostexch.label "Hosted Exchange">
+<!ENTITY exchWebServices.exchtype.label "Infrastructure Exchange">
+<!ENTITY exchWebServices.hostexch.label "Infrastructure Exchange dédiée">
<!ENTITY exchWebServices.365exch.label "Microsoft Office365">
-<!ENTITY exchWebServices.detail.label "Details">
+<!ENTITY exchWebServices.detail.label "Détails">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/lightning-item-iframe.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/lightning-item-iframe.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/lightning-item-iframe.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,7 @@
+<!ENTITY exchWebService.owner.label "Responsable:">
+<!ENTITY exchWebService.totalWork.label "Temps total:">
+<!ENTITY exchWebService.actualWork.label "Temps réalisé:">
+<!ENTITY exchWebService.mileage.label "Durée:">
+<!ENTITY exchWebService.billingInformation.label "Information de facturation:">
+<!ENTITY exchWebService.companies.label "Compagnie:">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/attachments-view.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/attachments-view.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/attachments-view.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/attachments-view.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,2 @@
+<!ENTITY exchWebServie.add.attachment.button.label "Allegati">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/browseFolder.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/browseFolder.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/browseFolder.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/browseFolder.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,12 @@
+<!ENTITY label.acceptbutton "Seleziona">
+<!ENTITY label.cancelbutton "Annulla">
+
+<!ENTITY browsefolder.title "Sfoglia cartelle">
+
+<!ENTITY treecol.label.foldername "Nome cartella">
+<!ENTITY treecol.label.folderclass "Classe cartella">
+
+
+
+
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/calendar-calendars-list.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/calendar-calendars-list.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/calendar-calendars-list.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/calendar-calendars-list.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,5 @@
+<!ENTITY calendar.context.exchange.convert.label "Converti a componente aggiuntivo Calendario e Attività Exchange 2007/2010">
+<!ENTITY calendar.context.exchange.properties.label "Proprietà Exchange (EWS)">
+<!ENTITY calendar.context.exchange.oof.settings.label "Opzioni Fuori sede">
+<!ENTITY calendar.context.exchange.clone.settings.label "Clona opzioni in un nuovo calendario">
+<!ENTITY calendar.context.exchange.delegate.calendar.settings.label "Delega calendario">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/calendar-summary-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/calendar-summary-dialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/calendar-summary-dialog.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/calendar-summary-dialog.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,3 @@
+<!ENTITY forward.invite.label "Inoltra invito">
+<!ENTITY required.attendee.label "Partecipante richiesto">
+<!ENTITY optional.attendee.label "Partecipante facoltativo">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/calExchangeCalendar.properties calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/calExchangeCalendar.properties
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/calExchangeCalendar.properties 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/calExchangeCalendar.properties 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,49 @@
+displayName=Provider Calendario e Attività per Exchange 2007/2010
+
+resetEventMessage=Il calendario "%1$S" è stato reimpostato.
+addTaskEventMessage=Aggiunta attività "%1$S" (%2$S).
+addCalendarEventMessage=Aggiunto appuntamento "%1$S" (%2$S).
+ewsErrorEventMessage=Errore durante la comunicazione con il server EWS per "%1$S". Errore: %2$S, codice: %3$S.
+updateCalendarEventMessage=L'appuntamento "%1$S" è stato modificato (%2$S).
+updateTaskEventMessage=L'attività "%1$S" è stata modificata (%2$S).
+deleteCalendarEventMessage=L'appuntamento "%1$S" è stato rimosso (%2$S).
+deleteTaskEventMessage=L'attività "%1$S" è stata rimossa (%2$S).
+syncFolderEventMessage="%4$S": ricevuti aggiornamenti dal server EWS (nuovi: %1$S, modificati: %2$S, eliminati: %3$S).
+syncInboxRequests="%4$S": ricevuti aggiornamenti inviti a riunione dal server EWS nella Posta in arrivo (nuovi: %1$S, modificati: %2$S, eliminati: %3$S).
+syncInboxCancelations="%4$S": ricevuti annullamenti inviti a riunione dal server EWS nella Posta in arrivo (nuovi: %1$S, modificati: %2$S, eliminati: %3$S).
+syncInboxResponses="%4$S": ricevuti aggiornamenti risposte riunione dal server EWS nella Posta in arrivo (nuovi: %1$S, modificati: %2$S, eliminati: %3$S).
+ewsMeetingResponsEventMessage=Risposta "%2$S" ricevuta per la richiesta riunione "%1$S" (%3$S). Messaggio:
+
+ecErrorServerCheck=Errore durante il controllo sul server: %1$S (%2$S)
+ecErrorAutodiscovery=Errore durante la ricerca automatica: %1$S (%2$S)
+ecErrorAutodiscoveryURLInvalid=Non è stato possibile determinare le impostazioni tramite la ricerca automatica utilizzando la parte nome di dominio della casella di posta (%1$S).\nSolitamente ciò significa che non esiste un server ricerca automatica definito con la parte di dominio come nome host.
+ecErrorServerCheckURLInvalid=Il server "%1$S" non esiste.
+ecErrorServerAndMailboxCheck=Errore durante il controllo del server e della casella di posta: %1$S (codice: %2$S)
+
+updateUserPrefs1=Opzioni utente aggiornate per la nuova versione (dalla 0.7.26)
+
+autoRemoveConfirmedInvitationOnCancellation=L'appuntamento confermato "%1$S" è stato annullato ed è stato rimosso automaticamente come specificato dalle opzioni utente (%2$S).
+
+sendAutoRespondMeetingRequestMessage=È stata automaticamente inviata una risposta alla richiesta di riunione "%1$S" come specificato dalle opzioni utente (%2$S).
+
+ecLoadingOofSettings=(Recupero dati in corso)
+ecLoadedOofSettings=(Dati recuperati)
+ecErrorLoadingOofSettings=Errore durante il caricamento delle opzioni Fuori sede. Codice: %2$S, messaggio: %1$S.
+ecSavingOofSettings=(Salvataggio dati in corso)
+ecSavedOofSettings=(Dati salvati)
+ecErrorSavingOofSettings=Errore durante il salvataggio delle opzioni Fuori sede. Codice: %2$S, messaggio: %1$S.
+
+
+exchWebService.PidLidTaskHistory.duedate.changed=La data di scadenza è stata modificata
+exchWebService.PidLidTaskHistory.some.property.changed=È stata modificata una proprietà
+exchWebService.PidLidTaskHistory.accepted=Attività accettata da %1$S
+exchWebService.PidLidTaskHistory.rejected=Attività rifiutata da %1$S
+exchWebService.PidLidTaskHistory.assigned=Attività assegnata a %1$S
+exchWebService.PidLidTaskHistory.no.changes=Nessuna modifica
+
+ecErrorServerAndMailboxCheckFolderNotFound=Non si dispone delle autorizzazioni di lettura sulla casella di posta selezionata o la casella di posta non è corretta.\n\nDopo che la casella di posta sarà stata corretta si potrebbe disporre delle autorizzazioni di visualizzazione dello stato di disponibilità utente (occupato/provvisorio/fuori sede) per il suo calendario.\n\n(%2$S: %1$S)
+
+tooltipCalendarDisconnected=Il calendario %1$S non è connesso al server Exchange\n(Motivo: %2$S).
+tooltipCalendarDisconnectedReadOnly=Il calendario %1$S non è connesso al server Exchange ed è in sola lettura\n(Motivo: %2$S).
+tooltipCalendarConnected=Il calendario %1$S è connesso al server Exchange.
+tooltipCalendarConnectedReadOnly=Il calendario %1$S è connesso al server Exchange ed è in sola lettura.
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/delegate-calendar-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/delegate-calendar-dialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/delegate-calendar-dialog.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/delegate-calendar-dialog.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,25 @@
+
+<!ENTITY label.delegateCalendar.cancelbutton "Annulla">
+<!ENTITY label.delegateCalendar.userEmail "Indirizzo di posta elettronica">
+<!ENTITY label.delegateCalendar.deliveryMeetingRerquestControl "Recapita richieste riunione">
+
+<!ENTITY menuitem.delegateCalendar.deliverMeetingRequestslist.delegateOnly "Solo ai delegati">
+<!ENTITY menuitem.delegateCalendar.deliverMeetingRequestslist.delegateAndMe "Ai delegati e a me">
+<!ENTITY menuitem.delegateCalendar.deliverMeetingRequestslist.delegateAndInfo "Ai delegati e inviami le notifiche">
+
+<!ENTITY label.delegateCalendar.permission "Autorizzazioni">
+<!ENTITY menuitem.delegateCalendar.permission.author "Autore">
+<!ENTITY menuitem.delegateCalendar.permission.editor "Editor">
+<!ENTITY menuitem.delegateCalendar.permission.reviewer "Revisore">
+<!ENTITY menuitem.delegateCalendar.permission.none "Nessuno">
+
+<!ENTITY label.delegateCalendar.permission.receiveInvitationCopy "Ricevi copie dei messaggi riunione" >
+<!ENTITY label.delegateCalendar.permission.viewPrivateItems "Visualizza elementi privati" >
+
+
+<!ENTITY delegateCalendar.permission.description.author "Leggi e crea elementi nella cartella Calendario." >
+<!ENTITY delegateCalendar.permission.description.editor "Leggi, crea e modifica elementi nella cartella Calendario." >
+<!ENTITY delegateCalendar.permission.description.reviewer "Leggi elementi nella cartella Calendario." >
+<!ENTITY delegateCalendar.permission.description.none "Nessuna autorizzazione di accesso alla cartella Calendario." >
+
+<!ENTITY delegateCalendar.permission.details.label "Dettagli autorizzazioni: " >
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/delegate-folder.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/delegate-folder.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/delegate-folder.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/delegate-folder.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,45 @@
+
+<!ENTITY label.delegatefolder.cancelbutton "Annulla">
+<!ENTITY label.delegatefolder.userEmail "Indirizzo di posta elettronica">
+
+<!ENTITY label.delegatefolder.permissionLevel "Livello autorizzazioni">
+<!ENTITY label.delegatefolder.userboxcolumn1 "Utente">
+<!ENTITY label.delegatefolder.userboxcolumn2 "Permessi">
+
+<!ENTITY menuitem.delegatefolder.permission.author "Autore">
+<!ENTITY menuitem.delegatefolder.permission.editor "Editor">
+<!ENTITY menuitem.delegatefolder.permission.reviewer "Revisore">
+<!ENTITY menuitem.delegatefolder.permission.none "Nessuno">
+<!ENTITY menuitem.delegatefolder.permission.owner "Proprietario" >
+<!ENTITY menuitem.delegatefolder.permission.publishingEditor "Supervisore pubblicazione" >
+<!ENTITY menuitem.delegatefolder.permission.publishingAuthor "Autore pubblicazione" >
+<!ENTITY menuitem.delegatefolder.permission.noneditingAuthor "Autore nonediting" >
+<!ENTITY menuitem.delegatefolder.permission.contributor "Collaboratore" >
+<!ENTITY menuitem.delegatefolder.permission.custom "Personalizzato" >
+
+<!ENTITY delegatefolder.permission.description.author "Leggi e crea elementi nella cartella." >
+<!ENTITY delegatefolder.permission.description.editor "Leggi, crea e modifica elementi nella cartella." >
+<!ENTITY delegatefolder.permission.description.reviewer "Leggi elementi nella cartella." >
+<!ENTITY delegatefolder.permission.description.none "Nessuna autorizzazione di accesso alla cartella." >
+
+<!ENTITY delegatefolder.permission.details.caption "Autorizzazioni ">
+
+<!ENTITY delegatefolder.tab.msg.label "Calendario e Attività non trovati per questo account di posta.">
+<!ENTITY delegatefolder.tab.name "Condivisione cartelle Exchange">
+
+<!ENTITY delegatefolder.permissions.none "Nessuno">
+<!ENTITY delegatefolder.permissions.own "Propri elementi">
+<!ENTITY delegatefolder.permissions.all "Tutti gli elementi">
+<!ENTITY delegatefolder.permissions.full "Dettagli completi">
+
+<!ENTITY delegatefolder.permissions.cancreateitems "Creazione elementi">
+<!ENTITY delegatefolder.permissions.cancreatesubfolders "Creazione sottocartelle">
+<!ENTITY delegatefolder.permissions.isfolderowner "Proprietario cartella">
+<!ENTITY delegatefolder.permissions.isfoldervisible "Cartella visibile">
+<!ENTITY delegatefolder.permissions.isfoldercontact "Cartella contatti">
+<!ENTITY delegatefolder.permissions.edititems "Modifica elementi">
+<!ENTITY delegatefolder.permissions.deleteitems "Eliminazione elementi">
+<!ENTITY delegatefolder.permissions.readitems "Lettura elementi">
+
+<!ENTITY delegatefolder.permissions.true "Vero">
+<!ENTITY delegatefolder.permissions.false "Falso">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/ecCalendarCreation.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/ecCalendarCreation.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/ecCalendarCreation.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/ecCalendarCreation.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,5 @@
+<!ENTITY exchange1.description "Opzioni Exchange/Windows Active Directory">
+<!ENTITY exchange.cache.label "Utilizza cache offline">
+
+
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeCloneSettings.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeCloneSettings.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeCloneSettings.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeCloneSettings.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,6 @@
+<!ENTITY label.acceptbutton "Salva">
+<!ENTITY label.cancelbutton "Annulla">
+
+<!ENTITY label.ecExchangeSettings.title "Nuova descrizione:">
+
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeReminderDialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeReminderDialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeReminderDialog.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeReminderDialog.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,4 @@
+<!ENTITY exchWebService.reminder.relation.origin.label "prima dell'inizio dell'evento">
+
+
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeSettings.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeSettings.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeSettings.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeSettings.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,54 @@
+<!ENTITY label.acceptbutton "Salva e reimposta">
+<!ENTITY label.cancelbutton "Annulla">
+<!ENTITY ecsettings.title "Opzioni Calendario e Posta EWS">
+<!ENTITY ecsettings.tab.adsettings "Exchange/AD Windows">
+<!ENTITY ecsettings.tab.meetingrequestsettings "Richieste riunione">
+<!ENTITY ecsettings.tab.calendarfolderproperties "Proprietà cartella">
+
+<!ENTITY label.ecExchangeSettings.title "Opzioni per il calendario:">
+
+<!ENTITY label.poll.inbox "Esegui il polling della Posta in arrivo per gestire richieste, modifiche e annullamenti.">
+<!ENTITY label.poll.inbox.interval "Frequenza di polling Posta in arrivo (in secondi):">
+<!ENTITY label.poll.calendar.interval "Frequenza di polling Calendario (in secondi):">
+
+<!ENTITY label.nomeetingrequestsettings "Impossibile impostare la richiesta riunione perché non si è selezionato il calendario principale per la casella di posta">
+
+<!ENTITY label.autorespond.meetingrequest "Rispondi automaticamente a un nuovo invito con ">
+
+<!ENTITY menuitem.label.ec-autorespond-answer.tentative "Forse parteciperò">
+<!ENTITY menuitem.label.ec-autorespond-answer.accepted "Parteciperò">
+<!ENTITY menuitem.label.ec-autorespond-answer.declined "Non parteciperò">
+
+<!ENTITY label.autoremove.invitation_cancellation1 "Rimuovi automaticamente l'invito e il messaggio di annullamento abbinato se non si è ancora risposto all'invito.">
+<!ENTITY label.autoremove.invitation_cancellation2 "Rimuovi automaticamente un invito confermato quando si riceve un messaggio di annullamento.">
+
+<!ENTITY label.autoremove.invitation_response1 "Rimuovi automaticamente una risposta di terzi a un invito di cui non si è l'organizzatore.">
+
+<!ENTITY label.doautorespond.meetingrequest.message "Invia il seguente messaggio con le risposte anziché richiedere un messaggio.">
+<!ENTITY label.autorespond.meetingrequest.message "Messaggio:">
+
+<!ENTITY treecol.label.userid "Nome utente">
+<!ENTITY treecol.label.email "Indirizzo di posta elettronica">
+
+
+<!ENTITY ecsettings.tab.offlineCachingproperties "Cache non in linea">
+
+<!ENTITY label.offlineCacheproperties.cachingStartDate "Data di inizio cache:">
+<!ENTITY label.offlineCacheproperties.cachingEndDate "Data di fine cache:">
+<!ENTITY label.offlineCacheproperties.totalEvents "Numero totale di eventi in cache:">
+<!ENTITY label.offlineCacheproperties.totalTasks "Numero totale di attività in cache:">
+
+<!ENTITY label.offlineCacheproperties.monthsBeforeStartDate "Numero di mesi prima di oggi per cui mantenere gli elementi in cache:">
+<!ENTITY label.offlineCacheproperties.monthsBeforeEndDate "Numero di mesi dopo di oggi per cui mantenere gli elementi in cache:">
+
+<!ENTITY button.offlineCacheproperties.clearCache "Elimina dati nella cache non in linea">
+<!ENTITY ecsettings.tab.autoprocessingproperties "Elaborazione automatica">
+<!ENTITY ecsettings.tab.mailitemsProperties "Opzioni EWS (Posta)">
+
+<!ENTITY label.syncmailitems.interval "Ritarda sincronizzazione elementi di posta (tag, ecc.)">
+<!ENTITY label.autoprocessingproperties.deletecancelleditems "Rimuovi automaticamente eventi annullati">
+<!ENTITY label.autoprocessingproperties.markeventtentative "Contrassegna automaticamente gli eventi come provvisori e invia la risposta all'organizzatore">
+<!ENTITY label.syncmailitems.active "Mantieni attiva la sincronizzazione degli elementi di posta (tag, ecc.)">
+
+<!ENTITY label.syncfollowup.deactivtate "Disabilita Contrassegna attività per il completamento">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeSettingsOverlay.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeSettingsOverlay.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeSettingsOverlay.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeSettingsOverlay.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,56 @@
+<!ENTITY ecautodiscover "Utilizza funzionalità ricerca automatica di Exchange.">
+<!ENTITY ecfolderbase.label "Cartella base:">
+<!ENTITY ecfolderpath.label "Percorso entro la cartella base:">
+<!ENTITY ecfolderidofshare.label "ID cartella condivisa:">
+<!ENTITY exchWebServices.SharedFolderID.label "Nome visualizzato cartella condivisa:">
+
+<!ENTITY menuitem.label.ecfolderbase.calendar "Cartella Calendario">
+<!ENTITY menuitem.label.ecfolderbase.publicfoldersroot "Cartelle pubbliche">
+<!ENTITY menuitem.label.ecfolderbase.inbox "Cartella Posta in arrivo">
+<!ENTITY menuitem.label.ecfolderbase.voicemail "Cartella Segreteria telefonica">
+<!ENTITY menuitem.label.ecfolderbase.msgfolderroot "Radice cartella messaggi">
+<!ENTITY menuitem.label.ecfolderbase.root "Radice casella di posta">
+<!ENTITY menuitem.label.ecfolderbase.tasks "Cartella Attività">
+
+<!ENTITY menuitem.label.ecfolderbase.contacts "Cartella Contatti">
+<!ENTITY menuitem.label.ecfolderbase.deleteditems "Cartella Elementi eliminati">
+<!ENTITY menuitem.label.ecfolderbase.drafts "Cartella Bozze">
+<!ENTITY menuitem.label.ecfolderbase.journal "Cartella Diario">
+<!ENTITY menuitem.label.ecfolderbase.notes "Cartella Note">
+<!ENTITY menuitem.label.ecfolderbase.outbox "Cartella Posta in uscita">
+<!ENTITY menuitem.label.ecfolderbase.sentitems "Cartella Posta inviata">
+<!ENTITY menuitem.label.ecfolderbase.junkemail "Cartella Posta indesiderata">
+<!ENTITY menuitem.label.ecfolderbase.searchfolders "Cartella Ricerca cartelle">
+<!ENTITY menuitem.label.ecfolderbase.version2010 "-- Le opzioni sottostanti sono valide solo per Exchange 2010 --">
+<!ENTITY menuitem.label.ecfolderbase.recoverableitemsroot "Cartella radice Elementi ripristinabili">
+<!ENTITY menuitem.label.ecfolderbase.recoverableitemsdeletions "Cartella Eliminazioni in Elementi ripristinabili">
+<!ENTITY menuitem.label.ecfolderbase.recoverableitemsversion "Cartella Versioni in Elementi ripristinabili">
+<!ENTITY menuitem.label.ecfolderbase.recoverableitemspurges "Cartella Elimina in Elementi ripristinabili">
+<!ENTITY menuitem.label.ecfolderbase.archiveroot "Cartella radice Archivio">
+<!ENTITY menuitem.label.ecfolderbase.archivemsgfolderroot "Cartella radice messaggi Archivio">
+<!ENTITY menuitem.label.ecfolderbase.archivedeleteditems "Cartella Elementi eliminati Archivio">
+<!ENTITY menuitem.label.ecfolderbase.archiverecoverableitemsroot "Cartella radice Elementi ripristinabili - Archivio">
+<!ENTITY menuitem.label.ecfolderbase.Archiverecoverableitemsdeletions "Cartella Eliminazioni in Elementi ripristinabili - Archivio">
+<!ENTITY menuitem.label.ecfolderbase.Archiverecoverableitemsversions "Cartella Versioni in Elementi ripristinabili - Archivio">
+<!ENTITY menuitem.label.ecfolderbase.Archiverecoverableitemspurges "Cartella Elimina in Elementi ripristinabili - Archivio">
+
+<!ENTITY button.label.autodiscovercheck "Esegui ricerca automatica">
+<!ENTITY button.label.serverandmailboxcheck "Controlla server e casella di posta">
+<!ENTITY button.label.servercheck "Controlla server e account">
+
+<!ENTITY ecmailbox.label "Indirizzo di posta elettronica principale:">
+<!ENTITY ecmailbox.tooltip "Non specificando una casella di posta si sarà in grado di accedere solamente alle cartelle pubbliche.">
+<!ENTITY ecwindowsuser.label "Nome utente:">
+<!ENTITY ecwindowsdomain.label "Nome dominio:">
+<!ENTITY ecwindowspassword.label "Password:">
+
+<!ENTITY button.label.folderpathcheck "Controlla">
+<!ENTITY button.label.folderbrowse "Sfoglia">
+
+<!ENTITY exchWebServices.UserAvailability.label "Per il calendario della casella di posta sarà visibile unicamente lo stato di disponibilità utente.">
+
+<!ENTITY exchWebServices.exchtype.label "Tipo Exchange">
+<!ENTITY exchWebServices.hostexch.label "Exchange hosted">
+<!ENTITY exchWebServices.365exch.label "Microsoft Office 365">
+<!ENTITY exchWebServices.detail.label "Dettagli">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/extra-priority.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/extra-priority.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/extra-priority.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/extra-priority.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,18 @@
+<!ENTITY prefwindow.title "Opzioni aggiuntive">
+<!ENTITY general.label "Generale">
+<!ENTITY about.label "Informazioni su">
+
+<!ENTITY about.description.label "Funzionalità avanzate per Thunderbird e SeaMonkey">
+<!ENTITY iconify.label "Visualizza solo icone priorità">
+<!ENTITY shadeHigh.label "Aggiungi un colore di sfondo ai messaggi con priorità alta">
+<!ENTITY shadeLow.label "Aggiungi un colore di sfondo ai messaggi con priorità bassa">
+<!ENTITY tagImportant.label "Contrassegna automaticamente i messaggi con priorità alta come Importante">
+
+<!ENTITY highestColor.label "Massima">
+
+<!ENTITY highColor.label "Alta">
+<!ENTITY lowColor.label "Bassa">
+<!ENTITY lowestColor.label "Minima">
+
+<!ENTITY prioritycolor "Colore personalizzato">
+<!ENTITY pref.color "Opzioni colore:">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/invitationResponse.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/invitationResponse.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/invitationResponse.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/invitationResponse.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,20 @@
+<!ENTITY label.acceptbutton "Conferma modifica">
+<!ENTITY label.cancelbutton "Annulla modifica">
+
+<!ENTITY description.invitationResponse "Conferma la modifica della risposta per la riunione.">
+
+<!ENTITY label.calendarName "Calendario:">
+<!ENTITY label.itemTitle "Oggetto:">
+<!ENTITY label.itemStart "Ora di inizio:">
+<!ENTITY label.itemResponse "Risposta:">
+<!ENTITY label.meetingOrganiser "Organizzatore:">
+
+<!ENTITY label.messageReponseBody "Messaggio risposta:">
+
+<!ENTITY menuitem.label.ec-autorespond-answer.tentative "Forse parteciperò">
+<!ENTITY menuitem.label.ec-autorespond-answer.accepted "Parteciperò">
+<!ENTITY menuitem.label.ec-autorespond-answer.declined "Non parteciperò">
+
+<!ENTITY label.proposenewtime.title "Proponi nuovo orario (Exchange 2013 o successivo)">
+<!ENTITY label.proposenewtime.start "Ora di inizio">
+<!ENTITY label.proposenewtime.end "Ora di fine">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/inviteStyle.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/inviteStyle.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/inviteStyle.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/inviteStyle.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,2 @@
+<!ENTITY label.inviteCol "Invito a calendario">
+<!ENTITY tooltip.inviteCol "Ordina per invito">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/lightning-item-iframe.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/lightning-item-iframe.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/lightning-item-iframe.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,7 @@
+<!ENTITY exchWebService.owner.label "Proprietario:">
+<!ENTITY exchWebService.totalWork.label "Lavoro totale:">
+<!ENTITY exchWebService.actualWork.label "Lavoro effettivo:">
+<!ENTITY exchWebService.mileage.label "Chilometraggio:">
+<!ENTITY exchWebService.billingInformation.label "Informazioni di fatturazione:">
+<!ENTITY exchWebService.companies.label "Azienda:">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/manageEWSAccounts.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/manageEWSAccounts.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/manageEWSAccounts.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/manageEWSAccounts.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,16 @@
+<!ENTITY label.acceptbutton "Chiudi">
+
+<!ENTITY exchWebService.manageEWSAccounts.newAccount.button "Aggiungi account">
+<!ENTITY exchWebService.manageEWSAccounts.removeAccount.button "Rimuovi account">
+<!ENTITY exchWebService.manageEWSAccounts.saveAccount.button "Salva impostazioni">
+
+<!ENTITY exchWebService.manageEWSAccounts.autodiscover.label "Utilizza la funzionalità di ricerca automatica di Exchange.">
+<!ENTITY exchWebService.manageEWSAccounts.mailbox.label "Nome casella di posta:">
+<!ENTITY exchWebService.manageEWSAccounts.windowsuser.label "Nome utente:">
+<!ENTITY exchWebService.manageEWSAccounts.windowsdomain.label "Nome dominio:">
+<!ENTITY exchWebService.manageEWSAccounts.autodiscover.button "Esegui ricerca automatica">
+<!ENTITY exchWebService.manageEWSAccounts.servercheck.button "Controlla server e account">
+<!ENTITY exchWebService.manageEWSAccounts.name.label "Nome:">
+
+<!ENTITY exchWebService.manageEWSAccounts.menuitem "Account Exchange Web Services">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/messenger_task_delegation.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/messenger_task_delegation.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/messenger_task_delegation.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/messenger_task_delegation.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,6 @@
+<!ENTITY exchWebService.task.delegation.owner.name "Proprietario attività">
+<!ENTITY exchWebService.task.delegation.delegator.name "Delegato attività">
+<!ENTITY exchWebService.task.delegation.accept.button "Accetta">
+<!ENTITY exchWebService.task.delegation.decline.button "Rifiuta">
+<!ENTITY exchWebService.task.delegation.lastUpdateDate "Ultima modifica">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/oofSettings.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/oofSettings.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/oofSettings.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/oofSettings.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,26 @@
+<!ENTITY title.oofsettings "Opzioni Fuori sede">
+<!ENTITY label.acceptbutton "Salva">
+<!ENTITY label.cancelbutton "Chiudi">
+<!ENTITY label.oofsettings.title "Opzioni Fuori sede per:">
+
+<!ENTITY label.oofstatus "Stato Fuori sede:">
+
+<!ENTITY label.externalaudience "Persone esterne a cui inviare messaggi Fuori sede: ">
+<!ENTITY menuitem.label.exchWebService-oof-externalaudience.none "Nessuno">
+<!ENTITY menuitem.label.exchWebService-oof-externalaudience.known "Solo persone nel mio elenco contatti">
+<!ENTITY menuitem.label.exchWebService-oof-externalaudience.all "Tutti">
+
+<!ENTITY button.label.internal "Messaggio interno">
+<!ENTITY button.label.external "Messaggio esterno">
+<!ENTITY label.internalreply "Messaggio che sarà inviato alle persone nella propria impresa:">
+<!ENTITY label.externalreply "Messaggio che sarà inviato alle persone al di fuori della propria impresa:">
+
+<!ENTITY menuitem.label.exchWebService-oof-status.disabled "Disabilitato">
+<!ENTITY menuitem.label.exchWebService-oof-status.enabled "Abilitato">
+
+<!ENTITY checkbox.label.exchWebService-oof-scheduled "Abilitato solo nell'intervallo temporale specificato:">
+<!ENTITY label.hbox-oof-scheduled-startTime "Ora di inizio:">
+<!ENTITY label.hbox-oof-scheduled-endTime "Ora di fine:">
+
+
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/preferences.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/preferences.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/preferences.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/preferences.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,48 @@
+<!ENTITY exchangeWebService.paneAccounts.title "Exchange (EWS)">
+<!ENTITY exchangeWebService.paneDebug.title "Registrazione eventi">
+
+<!ENTITY exchangeWebService.preferences.tab.accounts "Account">
+<!ENTITY exchangeWebService.preferences.tab.debug "Registrazione eventi">
+<!ENTITY exchangeWebService.preference.debug.file "Percorso file di log:">
+<!ENTITY exchangeWebService.preference.network.debug.caption "Comunicazioni con il server Exchange:">
+<!ENTITY exchangeWebService.preference.debug.log.label "Registra informazioni sulla console e/o su un file">
+<!ENTITY exchangeWebService.preference.debug.file.button "Sfoglia">
+<!ENTITY exchangeWebService.preference.network.debug.label "Registra comunicazioni con il server Exchange">
+<!ENTITY exchangeWebService.preference.network.debuglevel.label1 "Livello di log">
+<!ENTITY exchangeWebService.preference.network.debuglevel.label2 "1 = informazioni di base, 2 = comunicazioni integrali">
+<!ENTITY exchangeWebService.preference.authentication.debug.label "Registra informazioni sull'avanzamento delle comunicazioni (ad es. autenticazione)">
+<!ENTITY exchangeWebService.preference.authentication.showpassword.label "Visualizza la password come testo in chiaro nel file di log.">
+
+<!ENTITY exchangeWebService.preference.contacts.debug.caption "Rubrica/Contatti:">
+<!ENTITY exchangeWebService.preference.contacts.debuglevel.label1 "Livello di log">
+<!ENTITY exchangeWebService.preference.contacts.debuglevel.label2 "1 = informazioni di base, 2 = comunicazioni integrali">
+<!ENTITY exchangeWebService.preference.contacts.debug.label "Registra informazioni relative alla Rubrica/Contatti">
+
+<!ENTITY exchangeWebService.preferences.titleWin "Opzioni Exchange (EWS)">
+
+<!ENTITY exchangeWebService.preference.core.debug.caption "Oggetto core provider:">
+<!ENTITY exchangeWebService.preference.core.debuglevel.label2 "0 = nessuna informazione, 1 = informazioni di base, 2 = comunicazioni integrali">
+
+<!ENTITY exchangeWebService.preferences.tab.cache "Caching">
+<!ENTITY exchangeWebService.preference.cache.memory.label "Cache minimale temporanea in memoria">
+<!ENTITY exchangeWebService.preference.cache.memory.startupBefore.label "Numero di giorni di cui scaricare i dati prima della data di avvio del programma:">
+<!ENTITY exchangeWebService.preference.cache.memory.startupAfter.label "Numero di giorni di cui scaricare i dati dopo la data di avvio del programma:">
+
+<!ENTITY exchangeWebService.preferences.tab.others "Altro">
+<!ENTITY exchangeWebService.preference.others.prefs.label "Opzioni comunicazioni:">
+<!ENTITY exchangeWebService.preference.others.prefs.retryCount.label "Numero massimo di tentativi per le comunicazioni con Exchange:">
+
+<!ENTITY exchangeWebService.preference.updateFunction.label "Funzionalità aggiornamento componente aggiuntivo:">
+<!ENTITY exchangeWebService.preference.checkForUpdates.label "Controlla automaticamente la disponibilità di una nuova versione del componente aggiuntivo su Internet all'avvio di Thunderbird.">
+<!ENTITY exchangeWebService.preference.warnForUpdates.label "Visualizza un avviso se una nuova versione è disponibile per consentirne un'installazione facile.">
+<!ENTITY exchangeWebService.preference.warnForPrereleaseUpdates.label "Visualizza un avviso se una nuova versione non definitiva (beta, RC, ecc.) è disponibile.">
+
+<!ENTITY exchangeWebService.preference.loadbalancer.debug.caption "Bilanciamento del carico:">
+<!ENTITY exchangeWebService.preference.loadbalancer.prefs.label "Bilanciamento del carico:">
+<!ENTITY exchangeWebService.preference.loadbalancer.prefs.maxJobs.label "Numero massimo di richieste contemporanee al server Exchange:">
+<!ENTITY exchangeWebService.preference.loadbalancer.prefs.sleepBetweenJobs.label "Tempo minimo di attesa fra richieste al server Exchange:">
+<!ENTITY exchangeWebService.preference.userAgent.label "Agente utente HTTP:">
+
+<!ENTITY exchangeWebService.preference.ntlmv1.label "Opzioni NTLM-v1:">
+<!ENTITY exchangeWebService.preference.ntlmv1.true.label "Abilita">
+<!ENTITY exchangeWebService.preference.ntlmv1.false.label "Disabilita">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/preInvitationResponse.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/preInvitationResponse.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/preInvitationResponse.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/preInvitationResponse.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,14 @@
+<!ENTITY dialog.exchWebService.preInvitationResponse.title "Come si desidera rispondere?">
+<!ENTITY label.acceptbutton "OK">
+<!ENTITY label.cancelbutton "Annulla">
+
+<!ENTITY label.calendarName "Calendario:">
+<!ENTITY label.itemTitle "Oggetto:">
+<!ENTITY label.itemStart "Ora di inizio:">
+<!ENTITY label.itemResponse "Risposta:">
+<!ENTITY label.meetingOrganiser "Organizzatore:">
+
+<!ENTITY radio.label.exchWebService.preInvitationResponse.edit "Modifica la risposta prima di inviarla.">
+<!ENTITY radio.label.exchWebService.preInvitationResponse.sendnow "Invia la risposta ora.">
+<!ENTITY radio.label.exchWebService.preInvitationResponse.donotsend "Non inviare una risposta.">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/rtews.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/rtews.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/rtews.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/rtews.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,15 @@
+ <!ENTITY rtews.selectaccountdesc "Selezionare l'account di posta elettronica da configurare. L'account deve essere basato su Microsoft Exchange">
+ <!ENTITY rtews.accconfigured "Account già configurato">
+ <!ENTITY rtews.dicoverdesc "È possibile scegliere di ricercare automaticamente l'URL del server Microsoft Exchange (EWS) URL o configurarlo manualmente">
+ <!ENTITY rtews.dicoverdesc2 "Per configurarlo manualmente, immettere l'URL nel campo sottostante.">
+ <!ENTITY rtews.autodiscover "Ricerca automatica">
+ <!ENTITY rtews.doautodicover "Esegui ricerca automatica">
+ <!ENTITY rtews.manual "Manuale">
+ <!ENTITY rtews.test "Fare clic qui per verificare l'URL EWS">
+ <!ENTITY rtews.msexchewsurl "URL EWS Microsoft Exchange EWS verificato. Cliccare Fine per completare la configurazione">
+ <!ENTITY rtews.selectaccount "Seleziona account">
+ <!ENTITY rtews.configure.label "Configura...">
+ <!ENTITY rtews.rtforexch "Contrassegni remoti per Microsoft Exchange">
+ <!ENTITY rtews.confirmAccDetail "Confermare i seguenti dettagli dell'account">
+ <!ENTITY rtews.username "Nome utente">
+ <!ENTITY rtews.domain "Dominio">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/rtews.properties calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/rtews.properties
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/rtews.properties 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/rtews.properties 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,2 @@
+rtews.title=EWStagger
+rtews.tagAddError=Si è verificato un errore durante la creazione del tag per la categoria
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/selectEWSUrl.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/selectEWSUrl.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/selectEWSUrl.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/selectEWSUrl.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,9 @@
+<!ENTITY label.acceptbutton "Seleziona">
+<!ENTITY label.cancelbutton "Annulla">
+
+<!ENTITY description.selectews "Selezionare dall'elenco un server EWS adatto alla posizione corrente.">
+<!ENTITY label.selectews "Elenco server EWS:">
+
+
+
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/sendUpdateTo.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/sendUpdateTo.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/sendUpdateTo.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/sendUpdateTo.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,9 @@
+<!ENTITY title.sendupdateto "A chi dev'essere inviato quest'aggiornamento?">
+<!ENTITY label.acceptbutton "Esegui">
+<!ENTITY label.cancelbutton "Annulla">
+<!ENTITY label.calendaritem.title "Invia aggiornamento per la riunione:">
+
+<!ENTITY radio.label.sendtonone "Non inviare l'aggiornamento a nessuno.">
+<!ENTITY radio.label.sendtoall "Invia l'aggiornamento a tutti gli invitati.">
+<!ENTITY radio.label.sendtochanged "Invia l'aggiornamento solo alle persone aggiunte o rimosse.">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/sharedCalendarParser.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/sharedCalendarParser.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/sharedCalendarParser.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/sharedCalendarParser.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,3 @@
+<!ENTITY exchWebService_vbox_label "Rilevato invito condivisione Exchange">
+<!ENTITY exchWebService_button_label_add_calendar "Aggiungi calendario">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/timezonePreference.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/timezonePreference.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/timezonePreference.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/timezonePreference.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1 @@
+<!ENTITY calendar.timezone.local.auto.label "Modifica fuso orario automaticamente">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/ja-JP/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ja-JP/calendar-event-dialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/ja-JP/calendar-event-dialog.dtd 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ja-JP/calendar-event-dialog.dtd 1970-01-01 01:00:00.000000000 +0100
@@ -1,7 +0,0 @@
-<!ENTITY exchWebService.owner.label "Owner:">
-<!ENTITY exchWebService.totalWork.label "Total work:">
-<!ENTITY exchWebService.actualWork.label "Actual work:">
-<!ENTITY exchWebService.mileage.label "Mileage:">
-<!ENTITY exchWebService.billingInformation.label "Billing information:">
-<!ENTITY exchWebService.companies.label "Company:">
-
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/ja-JP/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ja-JP/lightning-item-iframe.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/ja-JP/lightning-item-iframe.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ja-JP/lightning-item-iframe.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,7 @@
+<!ENTITY exchWebService.owner.label "Owner:">
+<!ENTITY exchWebService.totalWork.label "Total work:">
+<!ENTITY exchWebService.actualWork.label "Actual work:">
+<!ENTITY exchWebService.mileage.label "Mileage:">
+<!ENTITY exchWebService.billingInformation.label "Billing information:">
+<!ENTITY exchWebService.companies.label "Company:">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/nl/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/nl/calendar-event-dialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/nl/calendar-event-dialog.dtd 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/nl/calendar-event-dialog.dtd 1970-01-01 01:00:00.000000000 +0100
@@ -1,6 +0,0 @@
-<!ENTITY exchWebService.owner.label "Eigenaar:">
-<!ENTITY exchWebService.totalWork.label "Werk totaal:">
-<!ENTITY exchWebService.actualWork.label "Werk echt:">
-<!ENTITY exchWebService.mileage.label "Rendement:">
-<!ENTITY exchWebService.billingInformation.label "Factuurinfo:">
-<!ENTITY exchWebService.companies.label "Bedrijf:">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/nl/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/nl/lightning-item-iframe.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/nl/lightning-item-iframe.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/nl/lightning-item-iframe.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,6 @@
+<!ENTITY exchWebService.owner.label "Eigenaar:">
+<!ENTITY exchWebService.totalWork.label "Werk totaal:">
+<!ENTITY exchWebService.actualWork.label "Werk echt:">
+<!ENTITY exchWebService.mileage.label "Rendement:">
+<!ENTITY exchWebService.billingInformation.label "Factuurinfo:">
+<!ENTITY exchWebService.companies.label "Bedrijf:">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/ru/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ru/calendar-event-dialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/ru/calendar-event-dialog.dtd 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ru/calendar-event-dialog.dtd 1970-01-01 01:00:00.000000000 +0100
@@ -1,7 +0,0 @@
-<!ENTITY exchWebService.owner.label "Владелец:">
-<!ENTITY exchWebService.totalWork.label "Всего работ:">
-<!ENTITY exchWebService.actualWork.label "Фактическая работа:">
-<!ENTITY exchWebService.mileage.label "Пробег:">
-<!ENTITY exchWebService.billingInformation.label "Платежная информация:">
-<!ENTITY exchWebService.companies.label "Компания:">
-
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/ru/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ru/lightning-item-iframe.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/ru/lightning-item-iframe.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ru/lightning-item-iframe.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,7 @@
+<!ENTITY exchWebService.owner.label "Владелец:">
+<!ENTITY exchWebService.totalWork.label "Всего работ:">
+<!ENTITY exchWebService.actualWork.label "Фактическая работа:">
+<!ENTITY exchWebService.mileage.label "Пробег:">
+<!ENTITY exchWebService.billingInformation.label "Платежная информация:">
+<!ENTITY exchWebService.companies.label "Компания:">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/sv/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/sv/calendar-event-dialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/sv/calendar-event-dialog.dtd 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/sv/calendar-event-dialog.dtd 1970-01-01 01:00:00.000000000 +0100
@@ -1,7 +0,0 @@
-<!ENTITY exchWebService.owner.label "Ägare:">
-<!ENTITY exchWebService.totalWork.label "Total arbetstid:">
-<!ENTITY exchWebService.actualWork.label "Faktisk arbetstid:">
-<!ENTITY exchWebService.mileage.label "Körsträcka:">
-<!ENTITY exchWebService.billingInformation.label "Faktureringsinformation:">
-<!ENTITY exchWebService.companies.label "Företag:">
-
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/sv/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/sv/lightning-item-iframe.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/sv/lightning-item-iframe.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/sv/lightning-item-iframe.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,7 @@
+<!ENTITY exchWebService.owner.label "Ägare:">
+<!ENTITY exchWebService.totalWork.label "Total arbetstid:">
+<!ENTITY exchWebService.actualWork.label "Faktisk arbetstid:">
+<!ENTITY exchWebService.mileage.label "Körsträcka:">
+<!ENTITY exchWebService.billingInformation.label "Faktureringsinformation:">
+<!ENTITY exchWebService.companies.label "Företag:">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/tr/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/tr/calendar-event-dialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/tr/calendar-event-dialog.dtd 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/tr/calendar-event-dialog.dtd 1970-01-01 01:00:00.000000000 +0100
@@ -1,6 +0,0 @@
-<!ENTITY exchWebService.owner.label “Sahip:”>
-<!ENTITY exchWebService.totalWork.label "Toplam iş:”>
-<!ENTITY exchWebService.actualWork.label “Gerçekleşen iş:”>
-<!ENTITY exchWebService.mileage.label "Mil olarka uzaklık:”>
-<!ENTITY exchWebService.billingInformation.label “Faturalama bilgileri:”>
-<!ENTITY exchWebService.companies.label “Şirket:”>
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/tr/delegate-folder.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/tr/delegate-folder.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/tr/delegate-folder.dtd 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/tr/delegate-folder.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -1,45 +1,45 @@
-<!ENTITY label.delegatefolder.cancelbutton "Cancel">
-<!ENTITY label.delegatefolder.userEmail "Email">
+<!ENTITY label.delegatefolder.cancelbutton "İptal Et">
+<!ENTITY label.delegatefolder.userEmail "E-posta">
-<!ENTITY label.delegatefolder.permissionLevel "Permission Level">
-<!ENTITY label.delegatefolder.userboxcolumn1 "User">
-<!ENTITY label.delegatefolder.userboxcolumn2 "Permissions">
+<!ENTITY label.delegatefolder.permissionLevel "İzin Seviyesi">
+<!ENTITY label.delegatefolder.userboxcolumn1 "Kullanıcı">
+<!ENTITY label.delegatefolder.userboxcolumn2 "İzinler">
-<!ENTITY menuitem.delegatefolder.permission.author "Author">
-<!ENTITY menuitem.delegatefolder.permission.editor "Editor">
-<!ENTITY menuitem.delegatefolder.permission.reviewer "Reviewer">
-<!ENTITY menuitem.delegatefolder.permission.none "None">
-<!ENTITY menuitem.delegatefolder.permission.owner "Owner" >
-<!ENTITY menuitem.delegatefolder.permission.publishingEditor "PublishingEditor" >
-<!ENTITY menuitem.delegatefolder.permission.publishingAuthor "PublishingAuthor" >
-<!ENTITY menuitem.delegatefolder.permission.noneditingAuthor "NoneditingAuthor" >
-<!ENTITY menuitem.delegatefolder.permission.contributor "Contributor" >
-<!ENTITY menuitem.delegatefolder.permission.custom "Custom" >
+<!ENTITY menuitem.delegatefolder.permission.author "Yazıcı">
+<!ENTITY menuitem.delegatefolder.permission.editor "Düzenleyici">
+<!ENTITY menuitem.delegatefolder.permission.reviewer "Okuyucu">
+<!ENTITY menuitem.delegatefolder.permission.none "Yok">
+<!ENTITY menuitem.delegatefolder.permission.owner "Sahip" >
+<!ENTITY menuitem.delegatefolder.permission.publishingEditor "YayınlayanDüzenleyici" >
+<!ENTITY menuitem.delegatefolder.permission.publishingAuthor "YayınlayanYazıcı" >
+<!ENTITY menuitem.delegatefolder.permission.noneditingAuthor "DüzenleyemeyenYazıcı" >
+<!ENTITY menuitem.delegatefolder.permission.contributor "Yardımcı" >
+<!ENTITY menuitem.delegatefolder.permission.custom "Özel" >
-<!ENTITY delegatefolder.permission.description.author "Read and create items in the folder." >
-<!ENTITY delegatefolder.permission.description.editor "Read, create, and modify items in the folder." >
-<!ENTITY delegatefolder.permission.description.reviewer "Read items in the folder." >
-<!ENTITY delegatefolder.permission.description.none "No access permissions to the folder." >
+<!ENTITY delegatefolder.permission.description.author "Dizindeki maddeleri okuyabilir ve yaratabilir." >
+<!ENTITY delegatefolder.permission.description.editor "Dizindeki maddeleri okuyabilir, yaratabilir ve değiştirebilir." >
+<!ENTITY delegatefolder.permission.description.reviewer "Dizindeki maddeleri okuyabilir." >
+<!ENTITY delegatefolder.permission.description.none "Bu dizine erişim izni yok." >
- <!ENTITY delegatefolder.permission.details.caption "Permission ">
+ <!ENTITY delegatefolder.permission.details.caption "İzin ">
-<!ENTITY delegatefolder.tab.msg.label "No Calendar or Task found for this mail account.">
-<!ENTITY delegatefolder.tab.name "Exchange Folder Sharing">
+<!ENTITY delegatefolder.tab.msg.label "Bu posta hesabı için bir Takvim ya da Görev Listesi bulunamadı.">
+<!ENTITY delegatefolder.tab.name "Exchange Dizin Paylaşımı">
-<!ENTITY delegatefolder.permissions.none "None">
-<!ENTITY delegatefolder.permissions.own "Own items">
-<!ENTITY delegatefolder.permissions.all "All items">
-<!ENTITY delegatefolder.permissions.full "Full details">
+<!ENTITY delegatefolder.permissions.none "Yok">
+<!ENTITY delegatefolder.permissions.own "Kendi maddeleri">
+<!ENTITY delegatefolder.permissions.all "Bütün maddeler">
+<!ENTITY delegatefolder.permissions.full "Tüm detaylar">
-<!ENTITY delegatefolder.permissions.cancreateitems "Create Items">
-<!ENTITY delegatefolder.permissions.cancreatesubfolders "Create SubFolders">
-<!ENTITY delegatefolder.permissions.isfolderowner "Folder Owner">
-<!ENTITY delegatefolder.permissions.isfoldervisible "Folder Visible">
-<!ENTITY delegatefolder.permissions.isfoldercontact "Folder Contact">
-<!ENTITY delegatefolder.permissions.edititems "Edit Items">
-<!ENTITY delegatefolder.permissions.deleteitems "Delete Items">
-<!ENTITY delegatefolder.permissions.readitems "Read Items">
+<!ENTITY delegatefolder.permissions.cancreateitems "Madde Yarat">
+<!ENTITY delegatefolder.permissions.cancreatesubfolders "Altdizinler Yarat">
+<!ENTITY delegatefolder.permissions.isfolderowner "Dizin Sahibi">
+<!ENTITY delegatefolder.permissions.isfoldervisible "Dizin Görülebiliyor">
+<!ENTITY delegatefolder.permissions.isfoldercontact "Dizinle İlişkili Kişi">
+<!ENTITY delegatefolder.permissions.edititems "Maddeleri Düzenleyebilir">
+<!ENTITY delegatefolder.permissions.deleteitems "Maddeleri Silebilir">
+<!ENTITY delegatefolder.permissions.readitems "Maddeleri Okuyabilir">
-<!ENTITY delegatefolder.permissions.true "True">
-<!ENTITY delegatefolder.permissions.false "False">
+<!ENTITY delegatefolder.permissions.true "Doğru">
+<!ENTITY delegatefolder.permissions.false "Yanlış">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/tr/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/tr/lightning-item-iframe.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/tr/lightning-item-iframe.dtd 1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/tr/lightning-item-iframe.dtd 2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,6 @@
+<!ENTITY exchWebService.owner.label “Sahip:”>
+<!ENTITY exchWebService.totalWork.label "Toplam iş:”>
+<!ENTITY exchWebService.actualWork.label “Gerçekleşen iş:”>
+<!ENTITY exchWebService.mileage.label "Mil olarka uzaklık:”>
+<!ENTITY exchWebService.billingInformation.label “Faturalama bilgileri:”>
+<!ENTITY exchWebService.companies.label “Şirket:”>
diff -Nru calendar-exchange-provider-3.9.0/README.md calendar-exchange-provider-4.0.0~beta4/README.md
--- calendar-exchange-provider-3.9.0/README.md 2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/README.md 2017-07-03 22:10:10.000000000 +0200
@@ -1,50 +1,7 @@
-##Exchange EWS Provider
-=====================
-Thank you for checking out Ericsson's Exchange EWS Provider. Ericsson and the Ericsson QA team are grateful for the help and hard work of many [contributors][contributors] like yourself.
+Exchange Calendar is an **add-on for Thunderbird and Lightning** that provides **Exchange calendar support**.
-Current Release Vs. Download trend is something like [this](https://rawgit.com/muthusuba/github-tools/master/downloads-trend.html?user=Ericsson&repo=exchangecalendar)
-
-
-Getting involved as a contributor
-------------------------------------------
-We love working with contributors for Exchange EWS Provider, but it does require a few skills. You will need to know some Javascript, XUL, some CSS and a basic familiarity with GitHub.
-
-If you know some Javascript, it's worth having a look at the Object Oriented Programming to understand the basic concepts of class based coding and especially for xul window objects.
-
-If you need to brush-up on programming, but are eager to start contributing immediately, please consider helping us find bugs in Github [Exchange EWS Provider][Exchange EWS Provider] or find bugs in the Issues tested by the [EricssonQA][EricssonQA] team. To brush up on Javascript skills before engaging with us, Dive Into Javascript [mozilla][mozilla] is an excellent resource. W3schools also has [notes on Javascript][w3schools] available through their website. The programming concepts you will need to know include functions, working with classes, and some object-oriented programming basics. To brush up on XUL, Mozilla [XUL][XUL] is an easy and simple place to learn XUL, More of XUL are dynamically configured and cross-plateform.
-
-Special thanks to all our [contributors][contributors]
-
-[w3schools]: http://www.w3schools.com/js/
-[mozilla]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide
-[EricssonQA]: https://github.com/Ericsson/exchangecalendar/
-[Exchange EWS Provider]: https://github.com/Ericsson/exchangecalendar/issues
-[XUL]: https://developer.mozilla.org/en-US/Add-ons/Overlay_Extensions/XUL_School
-[contributors]: https://github.com/Ericsson/exchangecalendar/contributors
-
-Questions are always welcome
-----------------------------
-While we take pains to keep our documentation updated, the best source of information is those of us who work on the project. We also have the [wiki][wiki] pages to answer your general questions about contributing to Exchange EWS Provider.
-
-[wiki]: https://github.com/Ericsson/exchangecalendar/wiki
-
-Getting set up
--------------
-It's easy to get set up: just 2 pieces of software to install and in few command lines you'll be running the addon!
-
-### Install Thunderbird
-If you don't already have it installed, please install latest version
-https://support.mozilla.org/en-US/kb/installing-thunderbird
-
-### Install Lightning
-If you don't already have it installed, please install latest version
-https://support.mozilla.org/en-US/kb/installing-lightning-thunderbird
-
-### Cloning the test repository with Git
-After you have installed [Git] you will need to clone the project to your hard drive. From your workspace directory run this command which will copy (clone) the project to your hard drive
-
- git clone --recursive git://github.com/Ericsson/exchangecalendar.git
-[Git]: http://en.wikipedia.org/wiki/Git_%28software%29
+## Contributing
+This add-on is open-source and based on the work of many [contributors](https://github.com/ExchangeCalendar/exchangecalendar/graphs/contributors).
### Installing developement tools
You will need to install Dom Inspector, Javascript Debugger and some other development tools. Fortunately `Thunderbird addons` makes it easy to install all of these:
@@ -53,21 +10,6 @@
cd ./exchangecalendar_master; chmod +x ./build.sh; ./build.sh;
-Now you can install the Exchange EWS Provider addon
-
-Writing Code
--------------
-If you want to get involved and add more code, then there's just a few things
-we'd like to ask you to do:
-
-1. Use the similar code format for all new developement and window objects
-2. Follow mozilla's simple [Coding Style Guide][Coding Style Guide] recommendations
-3. Fork this project with your own GitHub account
-4. Make sure all tests are passing and submit a pull request with your changes
-
-[Coding Style Guide]: https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Coding_Style
-
-License
--------
+## License
This software is licensed under the [GNU GPL] Version 3
[GNU GPL]: http://www.gnu.org/licenses/gpl.html
Attachment:
signature.asc
Description: OpenPGP digital signature