Home | History | Annotate | Download | only in data
      1 // Copyright (c) 2012 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    * Print destination data object that holds data for both local and cloud
     10    * destinations.
     11    * @param {string} id ID of the destination.
     12    * @param {!print_preview.Destination.Type} type Type of the destination.
     13    * @param {!print_preview.Destination.Origin} origin Origin of the
     14    *     destination.
     15    * @param {string} displayName Display name of the destination.
     16    * @param {boolean} isRecent Whether the destination has been used recently.
     17    * @param {!print_preview.Destination.ConnectionStatus} connectionStatus
     18    *     Connection status of the print destination.
     19    * @param {{tags: Array.<string>,
     20    *          isOwned: ?boolean,
     21    *          lastAccessTime: ?number,
     22    *          isTosAccepted: ?boolean}=} opt_params Optional parameters for the
     23    *     destination.
     24    * @constructor
     25    */
     26   function Destination(id, type, origin, displayName, isRecent,
     27                        connectionStatus, opt_params) {
     28     /**
     29      * ID of the destination.
     30      * @type {string}
     31      * @private
     32      */
     33     this.id_ = id;
     34 
     35     /**
     36      * Type of the destination.
     37      * @type {!print_preview.Destination.Type}
     38      * @private
     39      */
     40     this.type_ = type;
     41 
     42     /**
     43      * Origin of the destination.
     44      * @type {!print_preview.Destination.Origin}
     45      * @private
     46      */
     47     this.origin_ = origin;
     48 
     49     /**
     50      * Display name of the destination.
     51      * @type {string}
     52      * @private
     53      */
     54     this.displayName_ = displayName;
     55 
     56     /**
     57      * Whether the destination has been used recently.
     58      * @type {boolean}
     59      * @private
     60      */
     61     this.isRecent_ = isRecent;
     62 
     63     /**
     64      * Tags associated with the destination.
     65      * @type {!Array.<string>}
     66      * @private
     67      */
     68     this.tags_ = (opt_params && opt_params.tags) || [];
     69 
     70     /**
     71      * Print capabilities of the destination.
     72      * @type {print_preview.Cdd}
     73      * @private
     74      */
     75     this.capabilities_ = null;
     76 
     77     /**
     78      * Whether the destination is owned by the user.
     79      * @type {boolean}
     80      * @private
     81      */
     82     this.isOwned_ = (opt_params && opt_params.isOwned) || false;
     83 
     84     /**
     85      * Cache of destination location fetched from tags.
     86      * @type {?string}
     87      * @private
     88      */
     89     this.location_ = null;
     90 
     91     /**
     92      * Connection status of the destination.
     93      * @type {!print_preview.Destination.ConnectionStatus}
     94      * @private
     95      */
     96     this.connectionStatus_ = connectionStatus;
     97 
     98     /**
     99      * Number of milliseconds since the epoch when the printer was last
    100      * accessed.
    101      * @type {number}
    102      * @private
    103      */
    104     this.lastAccessTime_ = (opt_params && opt_params.lastAccessTime) ||
    105                            Date.now();
    106 
    107     /**
    108      * Whether the user has accepted the terms-of-service for the print
    109      * destination. Only applies to the FedEx Office cloud-based printer.
    110      * {@code} null if terms-of-service does not apply to the print destination.
    111      * @type {?boolean}
    112      * @private
    113      */
    114     this.isTosAccepted_ = (opt_params && opt_params.isTosAccepted) || false;
    115   };
    116 
    117   /**
    118    * Prefix of the location destination tag.
    119    * @type {string}
    120    * @const
    121    */
    122   Destination.LOCATION_TAG_PREFIX = '__cp__printer-location=';
    123 
    124   /**
    125    * Enumeration of Google-promoted destination IDs.
    126    * @enum {string}
    127    */
    128   Destination.GooglePromotedId = {
    129     DOCS: '__google__docs',
    130     FEDEX: '__google__fedex',
    131     SAVE_AS_PDF: 'Save as PDF'
    132   };
    133 
    134   /**
    135    * Enumeration of the types of destinations.
    136    * @enum {string}
    137    */
    138   Destination.Type = {
    139     GOOGLE: 'google',
    140     LOCAL: 'local',
    141     MOBILE: 'mobile'
    142   };
    143 
    144   /**
    145    * Enumeration of the origin types for cloud destinations.
    146    * @enum {string}
    147    */
    148   Destination.Origin = {
    149     LOCAL: 'local',
    150     COOKIES: 'cookies',
    151     PROFILE: 'profile',
    152     DEVICE: 'device'
    153   };
    154 
    155   /**
    156    * Enumeration of the connection statuses of printer destinations.
    157    * @enum {string}
    158    */
    159   Destination.ConnectionStatus = {
    160     DORMANT: 'DORMANT',
    161     OFFLINE: 'OFFLINE',
    162     ONLINE: 'ONLINE',
    163     UNKNOWN: 'UNKNOWN'
    164   };
    165 
    166   /**
    167    * Enumeration of relative icon URLs for various types of destinations.
    168    * @enum {string}
    169    * @private
    170    */
    171   Destination.IconUrl_ = {
    172     CLOUD: 'images/printer.png',
    173     CLOUD_SHARED: 'images/printer_shared.png',
    174     LOCAL: 'images/printer.png',
    175     MOBILE: 'images/mobile.png',
    176     MOBILE_SHARED: 'images/mobile_shared.png',
    177     THIRD_PARTY: 'images/third_party.png',
    178     PDF: 'images/pdf.png',
    179     DOCS: 'images/google_doc.png',
    180     FEDEX: 'images/third_party_fedex.png'
    181   };
    182 
    183   Destination.prototype = {
    184     /** @return {string} ID of the destination. */
    185     get id() {
    186       return this.id_;
    187     },
    188 
    189     /** @return {!print_preview.Destination.Type} Type of the destination. */
    190     get type() {
    191       return this.type_;
    192     },
    193 
    194     /**
    195      * @return {!print_preview.Destination.Origin} Origin of the destination.
    196      */
    197     get origin() {
    198       return this.origin_;
    199     },
    200 
    201     /** @return {string} Display name of the destination. */
    202     get displayName() {
    203       return this.displayName_;
    204     },
    205 
    206     /** @return {boolean} Whether the destination has been used recently. */
    207     get isRecent() {
    208       return this.isRecent_;
    209     },
    210 
    211     /**
    212      * @param {boolean} isRecent Whether the destination has been used recently.
    213      */
    214     set isRecent(isRecent) {
    215       this.isRecent_ = isRecent;
    216     },
    217 
    218     /**
    219      * @return {boolean} Whether the user owns the destination. Only applies to
    220      *     cloud-based destinations.
    221      */
    222     get isOwned() {
    223       return this.isOwned_;
    224     },
    225 
    226     /** @return {boolean} Whether the destination is local or cloud-based. */
    227     get isLocal() {
    228       return this.origin_ == Destination.Origin.LOCAL;
    229     },
    230 
    231     /**
    232      * @return {string} The location of the destination, or an empty string if
    233      *     the location is unknown.
    234      */
    235     get location() {
    236       if (this.location_ == null) {
    237         for (var tag, i = 0; tag = this.tags_[i]; i++) {
    238           if (tag.indexOf(Destination.LOCATION_TAG_PREFIX) == 0) {
    239             this.location_ = tag.substring(
    240                 Destination.LOCATION_TAG_PREFIX.length) || '';
    241             break;
    242           }
    243         }
    244       }
    245       return this.location_;
    246     },
    247 
    248     /** @return {!Array.<string>} Tags associated with the destination. */
    249     get tags() {
    250       return this.tags_.slice(0);
    251     },
    252 
    253     /** @return {print_preview.Cdd} Print capabilities of the destination. */
    254     get capabilities() {
    255       return this.capabilities_;
    256     },
    257 
    258     /**
    259      * @param {!print_preview.Cdd} capabilities Print capabilities of the
    260      *     destination.
    261      */
    262     set capabilities(capabilities) {
    263       this.capabilities_ = capabilities;
    264     },
    265 
    266     /**
    267      * @return {!print_preview.Destination.ConnectionStatus} Connection status
    268      *     of the print destination.
    269      */
    270     get connectionStatus() {
    271       return this.connectionStatus_;
    272     },
    273 
    274     /**
    275      * @param {!print_preview.Destination.ConnectionStatus} status Connection
    276      *     status of the print destination.
    277      */
    278     set connectionStatus(status) {
    279       this.connectionStatus_ = status;
    280     },
    281 
    282     /**
    283      * @return {number} Number of milliseconds since the epoch when the printer
    284      *     was last accessed.
    285      */
    286     get lastAccessTime() {
    287       return this.lastAccessTime_;
    288     },
    289 
    290     /** @return {string} Relative URL of the destination's icon. */
    291     get iconUrl() {
    292       if (this.id_ == Destination.GooglePromotedId.DOCS) {
    293         return Destination.IconUrl_.DOCS;
    294       } else if (this.id_ == Destination.GooglePromotedId.FEDEX) {
    295         return Destination.IconUrl_.FEDEX;
    296       } else if (this.id_ == Destination.GooglePromotedId.SAVE_AS_PDF) {
    297         return Destination.IconUrl_.PDF;
    298       } else if (this.isLocal) {
    299         return Destination.IconUrl_.LOCAL;
    300       } else if (this.type_ == Destination.Type.MOBILE && this.isOwned_) {
    301         return Destination.IconUrl_.MOBILE;
    302       } else if (this.type_ == Destination.Type.MOBILE) {
    303         return Destination.IconUrl_.MOBILE_SHARED;
    304       } else if (this.isOwned_) {
    305         return Destination.IconUrl_.CLOUD;
    306       } else {
    307         return Destination.IconUrl_.CLOUD_SHARED;
    308       }
    309     },
    310 
    311     /**
    312      * @return {?boolean} Whether the user has accepted the terms-of-service of
    313      *     the print destination or {@code null} if a terms-of-service does not
    314      *     apply.
    315      */
    316     get isTosAccepted() {
    317       return this.isTosAccepted_;
    318     },
    319 
    320     /**
    321      * @param {?boolean} Whether the user has accepted the terms-of-service of
    322      *     the print destination or {@code null} if a terms-of-service does not
    323      *     apply.
    324      */
    325     set isTosAccepted(isTosAccepted) {
    326       this.isTosAccepted_ = isTosAccepted;
    327     },
    328 
    329     /**
    330      * Matches a query against the destination.
    331      * @param {string} query Query to match against the destination.
    332      * @return {boolean} {@code true} if the query matches this destination,
    333      *     {@code false} otherwise.
    334      */
    335     matches: function(query) {
    336       return this.displayName_.toLowerCase().indexOf(
    337           query.toLowerCase().trim()) != -1;
    338     }
    339   };
    340 
    341   /**
    342    * The CDD (Cloud Device Description) describes the capabilities of a print
    343    * destination.
    344    *
    345    * @typedef {{
    346    *   version: string,
    347    *   printer: {
    348    *     vendor_capability: !Array.<{Object}>,
    349    *     collate: {default: boolean=}=,
    350    *     color: {
    351    *       option: !Array.<{
    352    *         type: string=,
    353    *         vendor_id: string=,
    354    *         custom_display_name: string=,
    355    *         is_default: boolean=
    356    *       }>
    357    *     }=,
    358    *     copies: {default: number=, max: number=}=,
    359    *     duplex: {option: !Array.<{type: string=, is_default: boolean=}>}=,
    360    *     page_orientation: {
    361    *       option: !Array.<{type: string=, is_default: boolean=}>
    362    *     }=
    363    *   }
    364    * }}
    365    */
    366   var Cdd = Object;
    367 
    368   // Export
    369   return {
    370     Destination: Destination,
    371     Cdd: Cdd
    372   };
    373 });
    374