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 5cr.define('cloudprint', function() { 6 'use strict'; 7 8 /** Namespace which contains a method to parse cloud destinations directly. */ 9 function CloudDestinationParser() {}; 10 11 /** 12 * Enumeration of cloud destination field names. 13 * @enum {string} 14 * @private 15 */ 16 CloudDestinationParser.Field_ = { 17 LAST_ACCESS: 'accessTime', 18 CAPABILITIES: 'capabilities', 19 CONNECTION_STATUS: 'connectionStatus', 20 DISPLAY_NAME: 'displayName', 21 ID: 'id', 22 IS_TOS_ACCEPTED: 'isTosAccepted', 23 TAGS: 'tags', 24 TYPE: 'type' 25 }; 26 27 /** 28 * Special tag that denotes whether the destination has been recently used. 29 * @type {string} 30 * @const 31 * @private 32 */ 33 CloudDestinationParser.RECENT_TAG_ = '^recent'; 34 35 /** 36 * Special tag that denotes whether the destination is owned by the user. 37 * @type {string} 38 * @const 39 * @private 40 */ 41 CloudDestinationParser.OWNED_TAG_ = '^own'; 42 43 /** 44 * Enumeration of cloud destination types that are supported by print preview. 45 * @enum {string} 46 * @private 47 */ 48 CloudDestinationParser.CloudType_ = { 49 ANDROID: 'ANDROID_CHROME_SNAPSHOT', 50 DOCS: 'DOCS', 51 IOS: 'IOS_CHROME_SNAPSHOT' 52 }; 53 54 /** 55 * Parses a destination from JSON from a Google Cloud Print search or printer 56 * response. 57 * @param {!Object} json Object that represents a Google Cloud Print search or 58 * printer response. 59 * @param {!print_preview.Destination.Origin} origin The origin of the 60 * response. 61 * @return {!print_preview.Destination} Parsed destination. 62 */ 63 CloudDestinationParser.parse = function(json, origin) { 64 if (!json.hasOwnProperty(CloudDestinationParser.Field_.ID) || 65 !json.hasOwnProperty(CloudDestinationParser.Field_.TYPE) || 66 !json.hasOwnProperty(CloudDestinationParser.Field_.DISPLAY_NAME)) { 67 throw Error('Cloud destination does not have an ID or a display name'); 68 } 69 var id = json[CloudDestinationParser.Field_.ID]; 70 var tags = json[CloudDestinationParser.Field_.TAGS] || []; 71 var connectionStatus = 72 json[CloudDestinationParser.Field_.CONNECTION_STATUS] || 73 print_preview.Destination.ConnectionStatus.UNKNOWN; 74 var optionalParams = { 75 tags: tags, 76 isOwned: arrayContains(tags, CloudDestinationParser.OWNED_TAG_), 77 lastAccessTime: parseInt( 78 json[CloudDestinationParser.Field_.LAST_ACCESS], 10) || Date.now(), 79 isTosAccepted: (id == print_preview.Destination.GooglePromotedId.FEDEX) ? 80 json[CloudDestinationParser.Field_.IS_TOS_ACCEPTED] : null, 81 cloudID: id 82 }; 83 var cloudDest = new print_preview.Destination( 84 id, 85 CloudDestinationParser.parseType_( 86 json[CloudDestinationParser.Field_.TYPE]), 87 origin, 88 json[CloudDestinationParser.Field_.DISPLAY_NAME], 89 arrayContains(tags, CloudDestinationParser.RECENT_TAG_) /*isRecent*/, 90 connectionStatus, 91 optionalParams); 92 if (json.hasOwnProperty(CloudDestinationParser.Field_.CAPABILITIES)) { 93 cloudDest.capabilities = /*@type {!print_preview.Cdd}*/ ( 94 json[CloudDestinationParser.Field_.CAPABILITIES]); 95 } 96 return cloudDest; 97 }; 98 99 /** 100 * Parses the destination type. 101 * @param {string} typeStr Destination type given by the Google Cloud Print 102 * server. 103 * @return {!print_preview.Destination.Type} Destination type. 104 * @private 105 */ 106 CloudDestinationParser.parseType_ = function(typeStr) { 107 if (typeStr == CloudDestinationParser.CloudType_.ANDROID || 108 typeStr == CloudDestinationParser.CloudType_.IOS) { 109 return print_preview.Destination.Type.MOBILE; 110 } else if (typeStr == CloudDestinationParser.CloudType_.DOCS) { 111 return print_preview.Destination.Type.GOOGLE_PROMOTED; 112 } else { 113 return print_preview.Destination.Type.GOOGLE; 114 } 115 }; 116 117 // Export 118 return { 119 CloudDestinationParser: CloudDestinationParser 120 }; 121}); 122