lorgnette: add support for brother5 driver

This driver is loaded as a DLC package and follows the standard DLC
logic for scanner drivers in lorgnette.

BUG=b:496201239
TEST=manual

Change-Id: I3ea3edd59a9bb5a1b2636708c5b898320c85c2d9
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/7855659
Commit-Queue: Paul Moy <pmoy@chromium.org>
Tested-by: Paul Moy <pmoy@chromium.org>
Reviewed-by: Benjamin Gordon <bmgordon@chromium.org>
diff --git a/lorgnette/dlc_client.cc b/lorgnette/dlc_client.cc
index 9eb0c02..17df31d 100644
--- a/lorgnette/dlc_client.cc
+++ b/lorgnette/dlc_client.cc
@@ -4,13 +4,13 @@
 
 #include "lorgnette/dlc_client.h"
 
+#include <string>
+
 #include <base/functional/bind.h>
 #include <brillo/errors/error.h>
 #include <chromeos/constants/lorgnette_dlc.h>
 #include <dlcservice/proto_bindings/dlcservice.pb.h>
 
-#include <string>
-
 #include "base/files/file_path.h"
 #include "base/strings/strcat.h"
 #include "base/task/single_thread_task_runner.h"
@@ -18,8 +18,9 @@
 namespace lorgnette {
 
 DlcClient::DlcClient()
-    : supported_dlc_ids_(std::set<std::string>(
-          {kSaneBackendsPfuDlcId, kSaneBackendsCanonDlcId})) {}
+    : supported_dlc_ids_(
+          std::set<std::string>({kSaneBackendsPfuDlcId, kSaneBackendsCanonDlcId,
+                                 kSaneBackendsBrother5DlcId})) {}
 
 void DlcClient::Init(
     std::unique_ptr<org::chromium::DlcServiceInterfaceProxyInterface>
diff --git a/lorgnette/init/lorgnette.conf b/lorgnette/init/lorgnette.conf
index c16d456..48d1ac8 100644
--- a/lorgnette/init/lorgnette.conf
+++ b/lorgnette/init/lorgnette.conf
@@ -28,6 +28,12 @@
   # pass --clean.
   systemd-tmpfiles --create --remove --clean \
     /usr/lib/tmpfiles.d/50-lorgnette.conf
+
+  # Run DLC-specific tmpfiles clauses, if they exist.
+  BROTHER5="/usr/lib/tmpfiles.d/70-brother5.conf"
+  if [ -f "${BROTHER5}" ]; then
+    systemd-tmpfiles --create --remove --clean "${BROTHER5}"
+  fi
 end script
 
 exec syslog-cat --identifier="${UPSTART_JOB}" -- \
diff --git a/lorgnette/usb/usb_device.cc b/lorgnette/usb/usb_device.cc
index 5eb826d..cfebde3 100644
--- a/lorgnette/usb/usb_device.cc
+++ b/lorgnette/usb/usb_device.cc
@@ -24,6 +24,10 @@
 
 const char kScannerTypeMFP[] = "multi-function peripheral";  // Matches SANE.
 
+// Scanners requiring the sane-backends-brother5 DLC.
+std::set<VidPid> kScannersRequiringSaneBackendsBrother5Dlc = {{0x04f9, 0x0706},
+                                                              {0x04f9, 0x0459}};
+
 // Scanners requiring the sane-backends-pfu DLC.
 std::set<VidPid> kScannersRequiringSaneBackendsPfuDlc = {
     {0x04c5, 0x132e}, {0x04c5, 0x15fc}, {0x04c5, 0x15ff},
@@ -53,6 +57,8 @@
                 &default_dlc_backend_scanners_);
   SetScannerIds(kScannerRequiringSaneBackendsCanonDlc, kSaneBackendsCanonDlcId,
                 &default_dlc_backend_scanners_);
+  SetScannerIds(kScannersRequiringSaneBackendsBrother5Dlc,
+                kSaneBackendsBrother5DlcId, &default_dlc_backend_scanners_);
   dlc_backend_scanners_ = &default_dlc_backend_scanners_;
 }
 
diff --git a/system_api/constants/lorgnette_dlc.h b/system_api/constants/lorgnette_dlc.h
index d6f5d69..dd71cd7 100644
--- a/system_api/constants/lorgnette_dlc.h
+++ b/system_api/constants/lorgnette_dlc.h
@@ -16,6 +16,9 @@
 // ID of the sane-backends-canon DLC.
 inline constexpr char kSaneBackendsCanonDlcId[] = "sane-backends-canon";
 
+// ID of the sane-backends-brother5 DLC.
+inline constexpr char kSaneBackendsBrother5DlcId[] = "sane-backends-brother5";
+
 }  // namespace lorgnette
 
 #endif  // SYSTEM_API_CONSTANTS_LORGNETTE_DLC_H_