19dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann/* 29dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * (c) Copyright 2016 Mopria Alliance, Inc. 39dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * (c) Copyright 2016 The Android Open Source Project 49dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * 59dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * Licensed under the Apache License, Version 2.0 (the "License"); 69dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * you may not use this file except in compliance with the License. 79dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * You may obtain a copy of the License at 89dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * 99dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * http://www.apache.org/licenses/LICENSE-2.0 109dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * 119dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * Unless required by applicable law or agreed to in writing, software 129dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * distributed under the License is distributed on an "AS IS" BASIS, 139dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * See the License for the specific language governing permissions and 159dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * limitations under the License. 169dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann */ 179dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann 18bfaa47233215996b8554a4b7a1a7b36bb3eaf607Philip P. Moltmannpackage com.android.printservice.recommendation.plugin.mdnsFilter; 199dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann 209dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport android.annotation.NonNull; 219dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport android.net.nsd.NsdServiceInfo; 229dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann 239dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport java.nio.charset.StandardCharsets; 249dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport java.util.Map; 259dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport java.util.Set; 269dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann 279dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann/** 289dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * Utils for dealing with mDNS attributes 299dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann */ 30bfaa47233215996b8554a4b7a1a7b36bb3eaf607Philip P. Moltmannclass MDNSUtils { 319dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann public static final String ATTRIBUTE_TY = "ty"; 329dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann public static final String ATTRIBUTE_PRODUCT = "product"; 339dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann public static final String ATTRIBUTE_USB_MFG = "usb_mfg"; 349dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann public static final String ATTRIBUTE_MFG = "mfg"; 359dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann 369dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann /** 379dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * Check if the service has any of a set of vendor names. 389dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * 399dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * @param serviceInfo The service 409dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * @param vendorNames The vendors 419dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * 429dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * @return true iff the has any of the set of vendor names 439dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann */ 449dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann public static boolean isVendorPrinter(@NonNull NsdServiceInfo serviceInfo, 459dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann @NonNull Set<String> vendorNames) { 469dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann for (Map.Entry<String, byte[]> entry : serviceInfo.getAttributes().entrySet()) { 479dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann // keys are case insensitive 489dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann String key = entry.getKey().toLowerCase(); 499dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann 509dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann switch (key) { 519dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann case ATTRIBUTE_TY: 529dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann case ATTRIBUTE_PRODUCT: 539dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann case ATTRIBUTE_USB_MFG: 549dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann case ATTRIBUTE_MFG: 559dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann if (entry.getValue() != null) { 569dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann if (containsVendor(new String(entry.getValue(), StandardCharsets.UTF_8), 579dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann vendorNames)) { 589dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann return true; 599dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann } 609dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann } 619dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann break; 629dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann default: 639dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann break; 649dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann } 659dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann } 669dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann 679dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann return false; 689dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann } 699dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann 709dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann /** 719dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * Check if the attribute matches any of the vendor names, ignoring capitalization. 729dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * 739dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * @param attr The attribute 749dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * @param vendorNames The vendor names 759dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * 769dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * @return true iff the attribute matches any of the vendor names 779dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann */ 789dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann private static boolean containsVendor(@NonNull String attr, @NonNull Set<String> vendorNames) { 799dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann for (String name : vendorNames) { 809dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann if (containsString(attr.toLowerCase(), name.toLowerCase())) { 819dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann return true; 829dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann } 839dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann } 849dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann return false; 859dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann } 869dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann 879dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann /** 889dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * Check if a string in another string. 899dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * 909dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * @param container The string that contains the string 919dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * @param contained The string that is contained 929dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * 939dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * @return true if the string is contained in the other 949dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann */ 959dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann private static boolean containsString(@NonNull String container, @NonNull String contained) { 969dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann return container.equalsIgnoreCase(contained) || container.contains(contained + " "); 979dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann } 989dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann} 99