summaryrefslogtreecommitdiffstats
path: root/xbmc/network/AirPlayServer.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/network/AirPlayServer.h')
-rw-r--r--xbmc/network/AirPlayServer.h108
1 files changed, 108 insertions, 0 deletions
diff --git a/xbmc/network/AirPlayServer.h b/xbmc/network/AirPlayServer.h
new file mode 100644
index 0000000..986616b
--- /dev/null
+++ b/xbmc/network/AirPlayServer.h
@@ -0,0 +1,108 @@
+/*
+ * Many concepts and protocol specification in this code are taken from
+ * the Boxee project. http://www.boxee.tv
+ *
+ * Copyright (C) 2011-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#pragma once
+
+#include "interfaces/IAnnouncer.h"
+#include "network/Network.h"
+#include "threads/CriticalSection.h"
+#include "threads/Thread.h"
+#include "utils/HttpParser.h"
+
+#include <map>
+#include <vector>
+
+#include <sys/socket.h>
+
+class CVariant;
+
+#define AIRPLAY_SERVER_VERSION_STR "101.28"
+
+class CAirPlayServer : public CThread, public ANNOUNCEMENT::IAnnouncer
+{
+public:
+ // IAnnouncer IF
+ void Announce(ANNOUNCEMENT::AnnouncementFlag flag,
+ const std::string& sender,
+ const std::string& message,
+ const CVariant& data) override;
+
+ //AirPlayServer impl.
+ static bool StartServer(int port, bool nonlocal);
+ static void StopServer(bool bWait);
+ static bool IsRunning();
+ static bool SetCredentials(bool usePassword, const std::string& password);
+ static bool IsPlaying(){ return m_isPlaying > 0;}
+ static void backupVolume();
+ static void restoreVolume();
+ static int m_isPlaying;
+
+protected:
+ void Process() override;
+
+private:
+ CAirPlayServer(int port, bool nonlocal);
+ ~CAirPlayServer() override;
+ bool SetInternalCredentials(bool usePassword, const std::string& password);
+ bool Initialize();
+ void Deinitialize();
+ void AnnounceToClients(int state);
+
+ class CTCPClient
+ {
+ public:
+ CTCPClient();
+ ~CTCPClient();
+ //Copying a CCriticalSection is not allowed, so copy everything but that
+ //when adding a member variable, make sure to copy it in CTCPClient::Copy
+ CTCPClient(const CTCPClient& client);
+ CTCPClient& operator=(const CTCPClient& client);
+ void PushBuffer(CAirPlayServer *host, const char *buffer,
+ int length, std::string &sessionId,
+ std::map<std::string, int> &reverseSockets);
+ void ComposeReverseEvent(std::string& reverseHeader, std::string& reverseBody, int state);
+
+ void Disconnect();
+
+ int m_socket;
+ struct sockaddr_storage m_cliaddr;
+ socklen_t m_addrlen;
+ CCriticalSection m_critSection;
+ int m_sessionCounter;
+ std::string m_sessionId;
+
+ private:
+ int ProcessRequest( std::string& responseHeader,
+ std::string& response);
+
+ void ComposeAuthRequestAnswer(std::string& responseHeader, std::string& responseBody);
+ bool checkAuthorization(const std::string& authStr, const std::string& method, const std::string& uri);
+ void Copy(const CTCPClient& client);
+
+ HttpParser* m_httpParser;
+ bool m_bAuthenticated;
+ int m_lastEvent;
+ std::string m_authNonce;
+ };
+
+ CCriticalSection m_connectionLock;
+ std::vector<CTCPClient> m_connections;
+ std::map<std::string, int> m_reverseSockets;
+ std::vector<SOCKET> m_ServerSockets;
+ int m_port;
+ bool m_nonlocal;
+ bool m_usePassword;
+ std::string m_password;
+ int m_origVolume;
+
+ static CCriticalSection ServerInstanceLock;
+ static CAirPlayServer *ServerInstance;
+};