Twitch SDK (Internal)
component.h
Go to the documentation of this file.
1 /********************************************************************************************
2 * Twitch Broadcasting SDK
3 *
4 * This software is supplied under the terms of a license agreement with Twitch Interactive, Inc. and
5 * may not be copied or used except in accordance with the terms of that agreement
6 * Copyright (c) 2012-2016 Twitch Interactive, Inc.
7 *********************************************************************************************/
8 
9 #pragma once
10 
13 #include "twitchsdk/core/tracer.h"
14 
15 #include <map>
16 #include <mutex>
17 
18 namespace ttv
19 {
20  class IComponent;
21  class Component;
22  class UserComponent;
23  class ComponentContainer;
24  class TaskRunner;
25  class Task;
26  class User;
27  class IMutex;
28 }
29 
30 
32 {
33 public:
34  enum class State
35  {
39  Inert,
40  };
41 
42  virtual State GetState() const = 0;
43 
44  virtual TTV_ErrorCode Initialize() = 0;
45  virtual void Update() = 0;
46  virtual TTV_ErrorCode Shutdown() = 0;
47 };
48 
49 
50 class ttv::Component : public IComponent
51 {
52 protected:
53  Component();
54 
55 public:
56  virtual ~Component();
57 
58  virtual std::string GetLoggerName() const = 0;
59 
60  virtual void SetTaskRunner(std::shared_ptr<TaskRunner> taskRunner);
61  std::shared_ptr<TaskRunner> GetTaskRunner() { return mTaskRunner; }
62 
63  // IComponent implementation
64  virtual State GetState() const override;
65  virtual TTV_ErrorCode Initialize() override;
66  virtual void Update() override;
67  virtual TTV_ErrorCode Shutdown() override;
68 
69 protected:
70  TTV_ErrorCode StartTask(std::shared_ptr<Task> task);
71  void CompleteTask(Task* task);
72  bool IsTaskRunning(Task* task) const;
73  virtual void SetState(State state);
74  virtual void SetClientState(State state);
75  virtual void SetServerState(State state);
76  virtual bool CheckShutdown();
77  virtual void CompleteShutdown();
78 
80  std::shared_ptr<TaskRunner> mTaskRunner;
81  std::vector<std::shared_ptr<Task>> mRunningTasks;
82  mutable std::mutex mTaskMutex;
84 };
85 
86 
88 {
89 public:
90  UserComponent(const std::shared_ptr<User>& user);
91 
92  virtual TTV_ErrorCode Initialize() override;
93 
94 protected:
95  class UserListener : public IUserListener
96  {
97  public:
99 
100  // IUserListener implementation
101  virtual void OnUserLogInComplete(User* source, TTV_ErrorCode ec) override;
102  virtual void OnUserLogOutComplete(User* source, TTV_ErrorCode ec) override;
103  virtual void OnUserInfoFetchComplete(User* source, TTV_ErrorCode ec) override;
104  virtual void OnUserAuthenticationIssue(User* source, std::shared_ptr<const OAuthToken> oauthToken, TTV_ErrorCode ec) override;
105 
106  private:
108  };
109 
110  // IUserListener implementation
111  virtual void OnUserLogInComplete(TTV_ErrorCode ec);
112  virtual void OnUserLogOutComplete(TTV_ErrorCode ec);
113  virtual void OnUserInfoFetchComplete(TTV_ErrorCode ec);
114  virtual void OnUserAuthenticationIssue(std::shared_ptr<const OAuthToken> oauthToken, TTV_ErrorCode ec);
115 
116  virtual void CompleteShutdown() override;
117  void Log(TTV_MessageLevel level, const char* format, ...);
118 
119  std::weak_ptr<User> mUser;
120  bool mOAuthIssue;
121 
122 private:
123  std::shared_ptr<UserListener> mUserListener;
124 };
125 
126 
127 
129 {
130 public:
132  virtual ~ComponentContainer();
133 
134  // Component overrides
135  virtual TTV_ErrorCode Initialize() override;
136  virtual void Update() override;
137  virtual TTV_ErrorCode Shutdown() override;
138  virtual std::string GetLoggerName() const override;
139 
140  virtual TTV_ErrorCode AddComponent(std::shared_ptr<IComponent> component);
141  virtual TTV_ErrorCode RemoveComponent(std::shared_ptr<IComponent> component);
142  virtual TTV_ErrorCode DisposeComponent(std::shared_ptr<IComponent> component);
143 
144  virtual TTV_ErrorCode SetComponent(const std::string& name, std::shared_ptr<IComponent> component);
145  virtual TTV_ErrorCode GetComponent(const std::string& name, std::shared_ptr<IComponent>& result);
146  virtual TTV_ErrorCode RemoveComponent(const std::string& name);
147  virtual TTV_ErrorCode DisposeComponent(const std::string& name);
148 
152  bool ContainsComponent(std::shared_ptr<IComponent> component) const;
153 
154  template<typename T>
155  std::shared_ptr<T> GetComponentAs(const std::string& name)
156  {
157  std::shared_ptr<T> result;
158  std::shared_ptr<IComponent> component;
159  TTV_ErrorCode ec = GetComponent(name, component);
160 
161  if (TTV_SUCCEEDED(ec) && component != nullptr)
162  {
163  result = std::static_pointer_cast<T>(component);
164  }
165 
166  return result;
167  }
168 
169  template<typename T>
170  std::shared_ptr<T> GetComponent()
171  {
172  std::shared_ptr<T> result;
173  std::shared_ptr<IComponent> component;
174  TTV_ErrorCode ec = GetComponent(T::GetComponentName(), component);
175 
176  if (TTV_SUCCEEDED(ec) && component != nullptr)
177  {
178  result = std::static_pointer_cast<T>(component);
179  }
180 
181  return result;
182  }
183 
184 protected:
185  // Component overrides
186  virtual bool CheckShutdown() override;
187  virtual void CompleteShutdown() override;
188 
189  std::shared_ptr<IMutex> mMutex;
190  std::vector<std::shared_ptr<IComponent>> mComponents;
191  std::map<std::string, std::shared_ptr<IComponent>> mComponentMap;
192 
193  std::vector<std::shared_ptr<IComponent>> mDisposeComponents;
194 };
Definition: task.h:19
std::map< std::string, std::shared_ptr< IComponent > > mComponentMap
Definition: component.h:191
State
Definition: component.h:34
std::mutex mTaskMutex
Definition: component.h:82
TTV_MessageLevel
Definition: tracingtypes.h:14
Definition: component.h:128
std::shared_ptr< IMutex > mMutex
Definition: component.h:189
std::shared_ptr< UserListener > mUserListener
Definition: component.h:123
std::vector< std::shared_ptr< IComponent > > mDisposeComponents
Definition: component.h:193
virtual State GetState() const =0
Definition: userlistener.h:24
JSON (JavaScript Object Notation).
Definition: adsapi.h:16
std::vector< std::shared_ptr< Task > > mRunningTasks
Definition: component.h:81
UserComponent * mOwner
Definition: component.h:107
ClientServerValue< State > mState
Definition: component.h:79
#define TTV_SUCCEEDED(ec)
Definition: errortypes.h:230
uint64_t mShutdownTimeMilliseconds
Definition: component.h:83
std::shared_ptr< T > GetComponentAs(const std::string &name)
Definition: component.h:155
std::shared_ptr< TaskRunner > mTaskRunner
Definition: component.h:80
std::vector< std::shared_ptr< IComponent > > mComponents
Definition: component.h:190
Definition: component.h:31
Definition: component.h:50
uint32_t TTV_ErrorCode
Definition: errortypes.h:30
Definition: component.h:87
virtual TTV_ErrorCode Shutdown()=0
std::shared_ptr< T > GetComponent()
Definition: component.h:170
virtual TTV_ErrorCode Initialize()=0
Definition: component.h:95
The component doesn&#39;t require shutting down.
virtual void Update()=0
std::shared_ptr< TaskRunner > GetTaskRunner()
Definition: component.h:61
unique_ptr< DesiredType > static_pointer_cast(unique_ptr< CurrentType > &&currentPointer)
Definition: cpp11transition.h:25
Definition: user.h:33
bool mOAuthIssue
Whether or not the internal updates of the component are on hold because of an issue with the OAuth t...
Definition: component.h:120
std::weak_ptr< User > mUser
Definition: component.h:119