pianod2
multisource multiuser scriptable networked music player
pandoracomm.h
Go to the documentation of this file.
1 
9 #pragma once
10 
11 #include <config.h>
12 
13 #include <string>
14 
15 #include <ctime>
16 
17 #include <parsnip/parsnip.h>
18 
19 #include "logging.h"
20 #include "httpclient.h"
21 #include "blowfish.h"
22 
23 #include "pandoramessages.h"
24 
25 namespace Pandora {
27  enum class Status {
28  Ok,
35  BadRequest = 400,
36  Unauthorized = 401,
37  StreamingViolation = 429,
38  BadGateway = 502,
39  PandoraError0 = 999,
40  PandoraReadOnlyMode = 1000,
41  InvalidAuthToken = 1001,
44  UserNotAuthorized = 1004,
45  StationLimitReached = 1005,
46  NoSuchStation = 1006,
48  DeviceNotAllowed = 1009,
49  PartnerNotAuthorized = 1010,
50  InvalidUsername = 1011,
51  InvalidPassword = 1012,
53  };
54 
55  const std::string status_strerror (Status status);
56 
57  class UserFeatures {
58  public:
59  int inactivity_timeout{86400};
62  int max_stations{0};
63  bool adverts{true};
64  bool replays{false};
65  bool hifi_audio_encoding{false};
66  bool is_subscriber{false};
67  };
68 
73  class Communication {
74  private:
75  enum class State {
77  Initialized,
79  Failed
80  };
81 
83  const bool automatic_protocol_parameters {false};
84  std::string username;
85  std::string password;
86  std::string proxy;
87 
88  std::string partner_auth_token;
89  std::string partner_id;
90  std::string user_auth_token;
91  std::string listener_id;
93 
95  time_t lockout_until{0};
96  time_t session_expiration{0};
97 
99 
101 
105 
106  Status performRequest (Request &request);
108 
109  public:
110  Communication (const std::string &name, const std::string &pass, const std::string &prox,
111  const JSONProtocolParameters &proto_params);
112  Status execute (Request &request, bool retry_if_auth_required = true);
113  Status partnerAuthenticate(); // Should be private, but used to check if able to initialize.
114  void resetState ();
115 
116  Parsnip::Data persist () const;
117  void restore (const Parsnip::Data &data);
118 
119  inline time_t retryTime() const {
120  return lockout_until;
121  }
122  inline const UserFeatures &getFeatures() const {
123  return features;
124  }
125  inline const time_t offlineUntil () const {
126  return lockout_until;
127  }
128  inline const time_t sessionExpires () const {
129  return session_expiration;
130  }
131  inline const bool isFailed() const {
132  return state == State::Failed;
133  }
134  };
135 
136 } // namespace Pandora
Bruce Schneier's Blowfish Encryption.
Definition: blowfish.h:12
Definition: httpclient.h:20
Pandora communication class.
Definition: pandoracomm.h:73
JSONProtocolParameters protocol
Definition: pandoracomm.h:82
std::string username
Definition: pandoracomm.h:84
State state
Definition: pandoracomm.h:100
BlowFish encryptor
Definition: pandoracomm.h:103
HttpClient http_client
Definition: pandoracomm.h:102
std::string password
Definition: pandoracomm.h:85
const bool automatic_protocol_parameters
Definition: pandoracomm.h:83
Status performRequest(Request &request)
Perform an API request.
Definition: pandoracomm.cpp:163
Status execute(Request &request, bool retry_if_auth_required=true)
Execute an HTTP request.
Definition: pandoracomm.cpp:309
time_t session_expiration
Time at which session expires from inactivity.
Definition: pandoracomm.h:96
BlowFish decryptor
Definition: pandoracomm.h:104
std::string user_auth_token
Authorization token, retrieved during login.
Definition: pandoracomm.h:90
std::string listener_id
Definition: pandoracomm.h:91
Status partnerAuthenticate()
Authenticate with Pandora.
Definition: pandoracomm.cpp:266
Communication(const std::string &name, const std::string &pass, const std::string &prox, const JSONProtocolParameters &proto_params)
Construct a new communicator given the user's name and password, and an optional proxy server.
Definition: pandoracomm.cpp:146
void restore(const Parsnip::Data &data)
Restore communication settings.
Definition: pandoracomm.cpp:401
std::string proxy
Definition: pandoracomm.h:86
time_t retryTime() const
Definition: pandoracomm.h:119
time_t lockout_until
Time until which communications are blocked/automatically fail.
Definition: pandoracomm.h:95
Status authenticate()
Authenticate with Pandora.
Definition: pandoracomm.cpp:283
UserFeatures features
User capabilities, retrieved from login response.
Definition: pandoracomm.h:98
void resetState()
Definition: pandoracomm.cpp:293
std::string partner_auth_token
Partner authorization token, for JSON protocol.
Definition: pandoracomm.h:88
const time_t sessionExpires() const
Definition: pandoracomm.h:128
State
Definition: pandoracomm.h:75
@ Initialized
Partner login not yet performed.
@ Authenticated
Partner login complete, user not yet authenticated.
int sequential_failures
Number of failed transactions without successes.
Definition: pandoracomm.h:94
Parsnip::Data persist() const
Persist communication settings.
Definition: pandoracomm.cpp:395
time_t synctime_offset
Definition: pandoracomm.h:92
std::string partner_id
Definition: pandoracomm.h:89
const time_t offlineUntil() const
Definition: pandoracomm.h:125
const UserFeatures & getFeatures() const
Definition: pandoracomm.h:122
const bool isFailed() const
Definition: pandoracomm.h:131
Pandora request class.
Definition: pandoramessages.h:39
Definition: pandoracomm.h:57
bool hifi_audio_encoding
Definition: pandoracomm.h:65
int max_stations
Definition: pandoracomm.h:62
int station_skip_limit
Definition: pandoracomm.h:61
int daily_skip_limit
Definition: pandoracomm.h:60
bool replays
Definition: pandoracomm.h:64
bool adverts
Definition: pandoracomm.h:63
int inactivity_timeout
Definition: pandoracomm.h:59
bool is_subscriber
Definition: pandoracomm.h:66
Generic data type.
Definition: parsnip.h:81
HTTP client request provider.
Debug/event logging interface.
Pandora source, player and related datatype specializations.
Definition: pandora.h:32
Status
Communication completion statuses.
Definition: pandoracomm.h:27
const std::string status_strerror(Status status)
Return a string corresponding to a Pandora communication status.
Definition: pandoracomm.cpp:54
Pandora messages.
Parsnip serialization.
Definition: pandoraparameters.h:18