Apache Celix  2.3.0
An implementation of the OSGi specification adapted to C and C++
UseServiceBuilder.h
Go to the documentation of this file.
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements. See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership. The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing,
13  * software distributed under the License is distributed on an
14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15  * KIND, either express or implied. See the License for the
16  * specific language governing permissions and limitations
17  * under the License.
18  */
19 
20 #pragma once
21 
22 #include <string>
23 #include <vector>
24 #include <memory>
25 
26 #include "celix/Filter.h"
27 #include "celix/Bundle.h"
28 #include "celix/Properties.h"
29 
30 namespace celix {
49  template<typename I>
51  private:
52  friend class BundleContext;
53 
54  //NOTE private to prevent move so that a build() call cannot be forgotten
55  UseServiceBuilder(UseServiceBuilder&&) noexcept = default;
56  public:
57  explicit UseServiceBuilder(std::shared_ptr<celix_bundle_context_t> _cCtx, std::string_view _name, bool _useSingleService = true) :
58  cCtx{std::move(_cCtx)},
59  name{_name},
60  useSingleService{_useSingleService} {
61  }
62 
63  UseServiceBuilder& operator=(UseServiceBuilder&&) = delete;
64  UseServiceBuilder(const UseServiceBuilder&) = delete;
65  UseServiceBuilder operator=(const UseServiceBuilder&) = delete;
66 
74  UseServiceBuilder& setFilter(std::string_view f) { filter = celix::Filter{f}; return *this; }
75 
79  UseServiceBuilder& setFilter(celix::Filter f) { filter = std::move(f); return *this; }
80 
90  template <typename Rep, typename Period>
91  UseServiceBuilder& setTimeout(std::chrono::duration<Rep, Period> duration) {
92  auto micro = std::chrono::duration_cast<std::chrono::microseconds>(duration).count();
93  timeoutInSeconds = micro / 1000000;
94  return *this;
95  }
96 
103  UseServiceBuilder& addUseCallback(std::function<void(I&)> cb) {
104  callbacks.emplace_back(std::move(cb));
105  return *this;
106  }
107 
116  UseServiceBuilder& addUseCallback(std::function<void(I&, const celix::Properties&)> cb) {
117  callbacksWithProperties.emplace_back(std::move(cb));
118  return *this;
119  }
120 
130  UseServiceBuilder& addUseCallback(std::function<void(I&, const celix::Properties&, const celix::Bundle&)> cb) {
131  callbacksWithOwner.emplace_back(std::move(cb));
132  return *this;
133  }
134 
147  std::size_t build() {
149  opts.filter.serviceName = name.empty() ? nullptr : name.c_str();
150  opts.filter.ignoreServiceLanguage = true;
151  opts.filter.filter = filter.empty() ? nullptr : filter.getFilterCString();
152  opts.filter.versionRange = versionRange.empty() ? nullptr : versionRange.c_str();
153  opts.waitTimeoutInSeconds = timeoutInSeconds;
154  opts.callbackHandle = this;
155  opts.useWithOwner = [](void* data, void *voidSvc, const celix_properties_t* cProps, const celix_bundle_t* cBnd) {
156  auto* builder = static_cast<UseServiceBuilder<I>*>(data);
157  auto* svc = static_cast<I*>(voidSvc);
158  const Bundle bnd{const_cast<celix_bundle_t*>(cBnd)};
159  auto props = celix::Properties::wrap(cProps);
160  for (const auto& func : builder->callbacks) {
161  func(*svc);
162  }
163  for (const auto& func : builder->callbacksWithProperties) {
164  func(*svc, *props);
165  }
166  for (const auto& func : builder->callbacksWithOwner) {
167  func(*svc, *props, bnd);
168  }
169  };
170 
171  if (useSingleService) {
172  bool called = celix_bundleContext_useServiceWithOptions(cCtx.get(), &opts);
173  return called ? 1 : 0;
174  } else {
175  return celix_bundleContext_useServicesWithOptions(cCtx.get(), &opts);
176  }
177  }
178  private:
179  const std::shared_ptr<celix_bundle_context_t> cCtx;
180  const std::string name;
181  const bool useSingleService;
182  double timeoutInSeconds{0};
183  celix::Filter filter{};
184  std::string versionRange{};
185  std::vector<std::function<void(I&)>> callbacks{};
186  std::vector<std::function<void(I&, const celix::Properties&)>> callbacksWithProperties{};
187  std::vector<std::function<void(I&, const celix::Properties&, const celix::Bundle&)>> callbacksWithOwner{};
188  };
189 }
Bundle.h
celix::BundleContext
The bundle context is used to interact with the Celix framework.
Definition: BundleContext.h:52
celix::UseServiceBuilder
Fluent builder API to use a service or services.
Definition: UseServiceBuilder.h:50
celix
Definition: Bundle.h:26
celix::UseServiceBuilder::build
std::size_t build()
"Builds" the UseServiceBuild.
Definition: UseServiceBuilder.h:147
celix::UseServiceBuilder::setTimeout
UseServiceBuilder & setTimeout(std::chrono::duration< Rep, Period > duration)
Sets a optional timeout.
Definition: UseServiceBuilder.h:91
celix_bundleContext_useServiceWithOptions
bool celix_bundleContext_useServiceWithOptions(celix_bundle_context_t *ctx, const celix_service_use_options_t *opts)
Use the highest ranking service satisfying the provided service filter options using the provided cal...
celix_service_use_options
Service Use Options used to fine tune which services to use and which callbacks to use.
Definition: celix_bundle_context.h:736
celix::UseServiceBuilder::setFilter
UseServiceBuilder & setFilter(std::string_view f)
Set filter to be used to select a service.
Definition: UseServiceBuilder.h:74
celix::UseServiceBuilder::setFilter
UseServiceBuilder & setFilter(celix::Filter f)
Set filter to be used to matching services.
Definition: UseServiceBuilder.h:79
celix::Bundle
An installed bundle in the Celix framework.
Definition: Bundle.h:47
celix::UseServiceBuilder::addUseCallback
UseServiceBuilder & addUseCallback(std::function< void(I &, const celix::Properties &, const celix::Bundle &)> cb)
Adds a use callback function which will be called when the UseServiceBuilder is "build".
Definition: UseServiceBuilder.h:130
celix::UseServiceBuilder::addUseCallback
UseServiceBuilder & addUseCallback(std::function< void(I &, const celix::Properties &)> cb)
Adds a use callback function which will be called when the UseServiceBuilder is "build".
Definition: UseServiceBuilder.h:116
celix_bundleContext_useServicesWithOptions
size_t celix_bundleContext_useServicesWithOptions(celix_bundle_context_t *ctx, const celix_service_use_options_t *opts)
Use the services with the provided service filter options using the provided callback.
celix::dm::Properties
celix::Properties Properties
Definition: Properties.h:25
celix::UseServiceBuilder::operator=
UseServiceBuilder & operator=(UseServiceBuilder &&)=delete
celix::UseServiceBuilder::addUseCallback
UseServiceBuilder & addUseCallback(std::function< void(I &)> cb)
Adds a use callback function which will be called when the UseServiceBuilder is "build".
Definition: UseServiceBuilder.h:103