From fdea545415f63c9b3dba8af9badb698f4d23e670 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Thu, 3 Dec 2020 15:51:58 +0100 Subject: [PATCH] Allow apps to register their share providers from outside MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- lib/private/Share20/Manager.php | 4 ++++ lib/private/Share20/ProviderFactory.php | 23 +++++++++++++++++++++++ lib/public/Share/IManager.php | 6 ++++++ lib/public/Share/IProviderFactory.php | 6 ++++++ 4 files changed, 39 insertions(+) diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php index e9895edf95..9f2d885f4f 100644 --- a/lib/private/Share20/Manager.php +++ b/lib/private/Share20/Manager.php @@ -1887,6 +1887,10 @@ class Manager implements IManager { return true; } + public function registerShareProvider(string $shareProviderClass): void { + $this->factory->registerProvider($shareProviderClass); + } + public function getAllShares(): iterable { $providers = $this->factory->getAllProviders(); diff --git a/lib/private/Share20/ProviderFactory.php b/lib/private/Share20/ProviderFactory.php index 2d4c4e6d40..933125c10b 100644 --- a/lib/private/Share20/ProviderFactory.php +++ b/lib/private/Share20/ProviderFactory.php @@ -44,6 +44,7 @@ use OCP\EventDispatcher\IEventDispatcher; use OCP\IServerContainer; use OCP\Share\IProviderFactory; use OCP\Share\IShare; +use OCP\Share\IShareProvider; /** * Class ProviderFactory @@ -67,6 +68,10 @@ class ProviderFactory implements IProviderFactory { /** @var \OCA\Talk\Share\RoomShareProvider */ private $roomShareProvider = null; + private $registeredShareProviders = []; + + private $shareProviders = []; + /** * IProviderFactory constructor. * @@ -76,6 +81,10 @@ class ProviderFactory implements IProviderFactory { $this->serverContainer = $serverContainer; } + public function registerProvider(string $shareProviderClass): void { + $this->registeredShareProviders[] = $shareProviderClass; + } + /** * Create the default share provider. * @@ -257,6 +266,10 @@ class ProviderFactory implements IProviderFactory { */ public function getProvider($id) { $provider = null; + if (isset($this->shareProviders[$id])) { + return $this->shareProviders[$id]; + } + if ($id === 'ocinternal') { $provider = $this->defaultShareProvider(); } elseif ($id === 'ocFederatedSharing') { @@ -269,6 +282,16 @@ class ProviderFactory implements IProviderFactory { $provider = $this->getRoomShareProvider(); } + foreach ($this->registeredShareProviders as $shareProvider) { + /** @var IShareProvider $instance */ + $instance = $this->serverContainer->get($shareProvider); + $this->shareProviders[$instance->identifier()] = $instance; + } + + if (isset($this->shareProviders[$id])) { + $provider = $this->shareProviders[$id]; + } + if ($provider === null) { throw new ProviderException('No provider with id .' . $id . ' found.'); } diff --git a/lib/public/Share/IManager.php b/lib/public/Share/IManager.php index cc2ec45cc9..635ccc1483 100644 --- a/lib/public/Share/IManager.php +++ b/lib/public/Share/IManager.php @@ -416,6 +416,12 @@ interface IManager { */ public function shareProviderExists($shareType); + /** + * @param string $shareProviderClass + * @since 21.0.0 + */ + public function registerShareProvider(string $shareProviderClass): void; + /** * @Internal * diff --git a/lib/public/Share/IProviderFactory.php b/lib/public/Share/IProviderFactory.php index 27218497e5..480837404f 100644 --- a/lib/public/Share/IProviderFactory.php +++ b/lib/public/Share/IProviderFactory.php @@ -53,4 +53,10 @@ interface IProviderFactory { * @since 11.0.0 */ public function getAllProviders(); + + /** + * @since 21.0.0 + * @param string $shareProvier + */ + public function registerProvider(string $shareProvier): void; }