OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 cr.define('print_preview', function() { |
| 6 'use strict'; |
| 7 |
| 8 /** |
| 9 * Printer sharing invitations data store. |
| 10 * @param {!print_preview.UserInfo} userInfo User information repository. |
| 11 * @constructor |
| 12 * @extends {cr.EventTarget} |
| 13 */ |
| 14 function InvitationStore(userInfo) { |
| 15 cr.EventTarget.call(this); |
| 16 |
| 17 /** |
| 18 * User information repository. |
| 19 * @private {!print_preview.UserInfo} |
| 20 */ |
| 21 this.userInfo_ = userInfo; |
| 22 |
| 23 /** |
| 24 * Maps user account to the list of invitations for this account. |
| 25 * @private {!Object.<string, !Array.<!print_preview.Invitation>>} |
| 26 */ |
| 27 this.invitations_ = {}; |
| 28 |
| 29 /** |
| 30 * Maps user account to the flag whether the invitations for this account |
| 31 * were successfully loaded. |
| 32 * @private {!Object.<string, print_preview.InvitationStore.LoadStatus_>} |
| 33 */ |
| 34 this.loadStatus_ = {}; |
| 35 |
| 36 /** |
| 37 * Event tracker used to track event listeners of the destination store. |
| 38 * @private {!EventTracker} |
| 39 */ |
| 40 this.tracker_ = new EventTracker(); |
| 41 |
| 42 /** |
| 43 * Used to fetch and process invitations. |
| 44 * @private {print_preview.CloudPrintInterface} |
| 45 */ |
| 46 this.cloudPrintInterface_ = null; |
| 47 |
| 48 /** |
| 49 * Invitation being processed now. Only one invitation can be processed at |
| 50 * a time. |
| 51 * @private {print_preview.Invitation} |
| 52 */ |
| 53 this.invitationInProgress_ = null; |
| 54 }; |
| 55 |
| 56 /** |
| 57 * Event types dispatched by the data store. |
| 58 * @enum {string} |
| 59 */ |
| 60 InvitationStore.EventType = { |
| 61 INVITATION_PROCESSED: |
| 62 'print_preview.InvitationStore.INVITATION_PROCESSED', |
| 63 INVITATION_SEARCH_DONE: |
| 64 'print_preview.InvitationStore.INVITATION_SEARCH_DONE' |
| 65 }; |
| 66 |
| 67 /** |
| 68 * @enum {number} |
| 69 * @private |
| 70 */ |
| 71 InvitationStore.LoadStatus_ = { |
| 72 IN_PROGRESS: 1, |
| 73 DONE: 2, |
| 74 FAILED: 3 |
| 75 }; |
| 76 |
| 77 InvitationStore.prototype = { |
| 78 __proto__: cr.EventTarget.prototype, |
| 79 |
| 80 /** |
| 81 * @return {print_preview.Invitation} Currently processed invitation or |
| 82 * {@code null}. |
| 83 */ |
| 84 get invitationInProgress() { |
| 85 return this.invitationInProgress_; |
| 86 }, |
| 87 |
| 88 /** |
| 89 * @param {string} account Account to filter invitations by. |
| 90 * @return {!Array.<!print_preview.Invitation>} List of invitations for the |
| 91 * {@code account}. |
| 92 */ |
| 93 invitations: function(account) { |
| 94 return this.invitations_[account] || []; |
| 95 }, |
| 96 |
| 97 /** |
| 98 * Sets the invitation store's Google Cloud Print interface. |
| 99 * @param {!print_preview.CloudPrintInterface} cloudPrintInterface Interface |
| 100 * to set. |
| 101 */ |
| 102 setCloudPrintInterface: function(cloudPrintInterface) { |
| 103 this.cloudPrintInterface_ = cloudPrintInterface; |
| 104 this.tracker_.add( |
| 105 this.cloudPrintInterface_, |
| 106 cloudprint.CloudPrintInterface.EventType.INVITES_DONE, |
| 107 this.onCloudPrintInvitesDone_.bind(this)); |
| 108 this.tracker_.add( |
| 109 this.cloudPrintInterface_, |
| 110 cloudprint.CloudPrintInterface.EventType.INVITES_FAILED, |
| 111 this.onCloudPrintInvitesDone_.bind(this)); |
| 112 this.tracker_.add( |
| 113 this.cloudPrintInterface_, |
| 114 cloudprint.CloudPrintInterface.EventType.PROCESS_INVITE_DONE, |
| 115 this.onCloudPrintProcessInviteDone_.bind(this)); |
| 116 this.tracker_.add( |
| 117 this.cloudPrintInterface_, |
| 118 cloudprint.CloudPrintInterface.EventType.PROCESS_INVITE_FAILED, |
| 119 this.onCloudPrintProcessInviteFailed_.bind(this)); |
| 120 }, |
| 121 |
| 122 /** Initiates loading of cloud printer sharing invitations. */ |
| 123 startLoadingInvitations: function() { |
| 124 if (!this.cloudPrintInterface_) |
| 125 return; |
| 126 if (!this.userInfo_.activeUser) |
| 127 return; |
| 128 if (this.loadStatus_.hasOwnProperty(this.userInfo_.activeUser)) { |
| 129 if (this.loadStatus_[this.userInfo_.activeUser] == |
| 130 InvitationStore.LoadStatus_.DONE) { |
| 131 cr.dispatchSimpleEvent( |
| 132 this, InvitationStore.EventType.INVITATION_SEARCH_DONE); |
| 133 } |
| 134 return; |
| 135 } |
| 136 |
| 137 this.loadStatus_[this.userInfo_.activeUser] = |
| 138 InvitationStore.LoadStatus_.IN_PROGRESS; |
| 139 this.cloudPrintInterface_.invites(this.userInfo_.activeUser); |
| 140 }, |
| 141 |
| 142 /** |
| 143 * Accepts or rejects the {@code invitation}, based on {@code accept} value. |
| 144 * @param {!print_preview.Invitation} invitation Invitation to process. |
| 145 * @param {boolean} accept Whether to accept this invitation. |
| 146 */ |
| 147 processInvitation: function(invitation, accept) { |
| 148 if (!!this.invitationInProgress_) |
| 149 return; |
| 150 this.invitationInProgress_ = invitation; |
| 151 this.cloudPrintInterface_.processInvite(invitation, accept); |
| 152 }, |
| 153 |
| 154 /** |
| 155 * Removes processed invitation from the internal storage. |
| 156 * @param {!print_preview.Invitation} invitation Processed invitation. |
| 157 * @private |
| 158 */ |
| 159 invitationProcessed_: function(invitation) { |
| 160 if (this.invitations_.hasOwnProperty(invitation.account)) { |
| 161 this.invitations_[invitation.account] = |
| 162 this.invitations_[invitation.account].filter(function(i) { |
| 163 return i != invitation; |
| 164 }); |
| 165 } |
| 166 if (this.invitationInProgress_ == invitation) |
| 167 this.invitationInProgress_ = null; |
| 168 }, |
| 169 |
| 170 /** |
| 171 * Called when printer sharing invitations are fetched. |
| 172 * @param {Event} event Contains the list of invitations. |
| 173 * @private |
| 174 */ |
| 175 onCloudPrintInvitesDone_: function(event) { |
| 176 this.loadStatus_[event.user] = InvitationStore.LoadStatus_.DONE; |
| 177 this.invitations_[event.user] = event.invitations; |
| 178 |
| 179 cr.dispatchSimpleEvent( |
| 180 this, InvitationStore.EventType.INVITATION_SEARCH_DONE); |
| 181 }, |
| 182 |
| 183 /** |
| 184 * Called when printer sharing invitations fetch has failed. |
| 185 * @param {Event} event Contains the reason of failure. |
| 186 * @private |
| 187 */ |
| 188 onCloudPrintInvitesFailed_: function(event) { |
| 189 this.loadStatus_[event.user] = InvitationStore.LoadStatus_.FAILED; |
| 190 }, |
| 191 |
| 192 /** |
| 193 * Called when printer sharing invitation was processed successfully. |
| 194 * @param {Event} event Contains detailed information about the invite and |
| 195 * newly accepted destination. |
| 196 * @private |
| 197 */ |
| 198 onCloudPrintProcessInviteDone_: function(event) { |
| 199 this.invitationProcessed_(event.invitation); |
| 200 cr.dispatchSimpleEvent( |
| 201 this, InvitationStore.EventType.INVITATION_PROCESSED); |
| 202 }, |
| 203 |
| 204 /** |
| 205 * Called when /printer call completes. Updates the specified destination's |
| 206 * print capabilities. |
| 207 * @param {Event} event Contains detailed information about the |
| 208 * destination. |
| 209 * @private |
| 210 */ |
| 211 onCloudPrintProcessInviteFailed_: function(event) { |
| 212 this.invitationProcessed_(event.invitation); |
| 213 // TODO: Display an error. |
| 214 cr.dispatchSimpleEvent( |
| 215 this, InvitationStore.EventType.INVITATION_PROCESSED); |
| 216 } |
| 217 }; |
| 218 |
| 219 // Export |
| 220 return { |
| 221 InvitationStore: InvitationStore |
| 222 }; |
| 223 }); |
OLD | NEW |