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