public void add(HTSMessage message) { _tunerDataHelper.addTunerInfo(message); lock (_data) { if (_data.ContainsKey(message.getInt("channelId"))) { int channelID = message.getInt("channelId"); HTSMessage storedMessage = _data[channelID]; if (storedMessage != null) { foreach (KeyValuePair<string, object> entry in message) { if (storedMessage.containsField(entry.Key)) { storedMessage.removeField(entry.Key); } storedMessage.putField(entry.Key, entry.Value); } } else { _logger.Error("[TVHclient] ChannelDataHelper: update for channelID '" + channelID + "' but no initial data found!"); } } else { if (message.containsField("channelNumber") && message.getInt("channelNumber") > 0) // use only channels with number > 0 { _data.Add(message.getInt("channelId"), message); } } } }
private void ProcessResponse(HTSMessage response) { if (response.containsField("seq")) { int seqNo = response.getInt("seq"); if (_responseHandlers.TryGetValue(seqNo, out TaskCompletionSource <HTSMessage> currHTSResponseHandler)) { _responseHandlers.Remove(seqNo); currHTSResponseHandler.TrySetResult(response); } else { _logger.Fatal("[TVHclient] MessageDistributor: HTSResponseHandler for seq = '" + seqNo + "' not found!"); } } else { // auto update messages if (_listener != null) { _listener.onMessage(response); } } }
public Boolean authenticate(String username, String password) { _logger.Info("[TVHclient] HTSConnectionAsync.authenticate: start"); HTSMessage helloMessage = new HTSMessage(); helloMessage.Method = "hello"; helloMessage.putField("clientname", _clientName); helloMessage.putField("clientversion", _clientVersion); helloMessage.putField("htspversion", HTSMessage.HTSP_VERSION); helloMessage.putField("username", username); LoopBackResponseHandler loopBackResponseHandler = new LoopBackResponseHandler(); sendMessage(helloMessage, loopBackResponseHandler); HTSMessage helloResponse = loopBackResponseHandler.getResponse(); if (helloResponse != null) { _serverProtocolVersion = helloResponse.getInt("htspversion"); _servername = helloResponse.getString("servername"); _serverversion = helloResponse.getString("serverversion"); byte[] salt = helloResponse.getByteArray("challenge"); byte[] digest = SHA1helper.GenerateSaltedSHA1(password, salt); HTSMessage authMessage = new HTSMessage(); authMessage.Method = "authenticate"; authMessage.putField("username", username); authMessage.putField("digest", digest); sendMessage(authMessage, loopBackResponseHandler); HTSMessage authResponse = loopBackResponseHandler.getResponse(); if (authResponse != null) { Boolean auth = authResponse.getInt("noaccess", 0) != 1; if (auth) { HTSMessage getDiskSpaceMessage = new HTSMessage(); getDiskSpaceMessage.Method = "getDiskSpace"; sendMessage(getDiskSpaceMessage, loopBackResponseHandler); HTSMessage diskSpaceResponse = loopBackResponseHandler.getResponse(); if (diskSpaceResponse != null) { _diskSpace = (diskSpaceResponse.getLong("freediskspace") / BytesPerGiga) + "GB / " + (diskSpaceResponse.getLong("totaldiskspace") / BytesPerGiga) + "GB"; } HTSMessage enableAsyncMetadataMessage = new HTSMessage(); enableAsyncMetadataMessage.Method = "enableAsyncMetadata"; sendMessage(enableAsyncMetadataMessage, null); } _logger.Info("[TVHclient] HTSConnectionAsync.authenticate: authenticated = " + auth); return(auth); } } _logger.Error("[TVHclient] HTSConnectionAsync.authenticate: no hello response"); return(false); }
public void addTunerInfo(HTSMessage tunerMessage) { lock(_data) { string channelID = "" + tunerMessage.getInt("channelId"); if (_data.ContainsKey(channelID)) { _data.Remove(channelID); } _data.Add(channelID, tunerMessage); } }
private void MessageDistributor() { Boolean threadOk = true; while (_connected && threadOk) { if (_messageDistributorThreadTokenSource.IsCancellationRequested) { return; } try { HTSMessage response = _receivedMessagesQueue.Dequeue(); if (response.containsField("seq")) { int seqNo = response.getInt("seq"); if (_responseHandlers.ContainsKey(seqNo)) { HTSResponseHandler currHTSResponseHandler = _responseHandlers[seqNo]; if (currHTSResponseHandler != null) { _responseHandlers.Remove(seqNo); currHTSResponseHandler.handleResponse(response); } } else { _logger.LogCritical("[TVHclient] HTSConnectionAsync.MessageDistributor: HTSResponseHandler for seq = '{seq}' not found", seqNo); } } else { // auto update messages if (_listener != null) { _listener.onMessage(response); } } } catch (Exception ex) { threadOk = false; if (_listener != null) { _listener.onError(ex); } else { _logger.LogError(ex, "[TVHclient] HTSConnectionAsync.MessageBuilder: exception caught, but no error listener is configured"); } } } }
private void MessageDistributor() { Boolean threadOk = true; while (_connected && threadOk) { try { HTSMessage response = _receivedMessagesQueue.Dequeue(); if (response.containsField("seq")) { int seqNo = response.getInt("seq"); if (_responseHandlers.ContainsKey(seqNo)) { HTSResponseHandler currHTSResponseHandler = _responseHandlers[seqNo]; if (currHTSResponseHandler != null) { _responseHandlers.Remove(seqNo); currHTSResponseHandler.handleResponse(response); } } else { _logger.Fatal("[TVHclient] MessageDistributor: HTSResponseHandler for seq = '" + seqNo + "' not found!"); } } else { // auto update messages if (_listener != null) { _listener.onMessage(response); } } } catch (ThreadAbortException) { threadOk = false; Thread.ResetAbort(); } catch (Exception ex) { if (_listener != null) { _listener.onError(ex); } else { _logger.ErrorException("[TVHclient] MessageBuilder caught exception : {0} but no error listener is configured!!!", ex, ex.ToString()); } } } }
public Boolean authenticate(String username, String password) { _logger.LogDebug("[TVHclient] HTSConnectionAsync.authenticate: start"); HTSMessage helloMessage = new HTSMessage(); helloMessage.Method = "hello"; helloMessage.putField("clientname", _clientName); helloMessage.putField("clientversion", _clientVersion); helloMessage.putField("htspversion", HTSMessage.HTSP_VERSION); helloMessage.putField("username", username); LoopBackResponseHandler loopBackResponseHandler = new LoopBackResponseHandler(); sendMessage(helloMessage, loopBackResponseHandler); HTSMessage helloResponse = loopBackResponseHandler.getResponse(); if (helloResponse != null) { if (helloResponse.containsField("htspversion")) { _serverProtocolVersion = helloResponse.getInt("htspversion"); } else { _serverProtocolVersion = -1; _logger.LogDebug("[TVHclient] HTSConnectionAsync.authenticate: hello didn't include required field 'htspversion' - htsp incorrectly implemented by tvheadend"); } if (helloResponse.containsField("servername")) { _servername = helloResponse.getString("servername"); } else { _servername = "n/a"; _logger.LogDebug("[TVHclient] HTSConnectionAsync.authenticate: hello didn't include required field 'servername' - htsp incorrectly implemented by tvheadend"); } if (helloResponse.containsField("serverversion")) { _serverversion = helloResponse.getString("serverversion"); } else { _serverversion = "n/a"; _logger.LogDebug("[TVHclient] HTSConnectionAsync.authenticate: hello didn't include required field 'serverversion' - htsp incorrectly implemented by tvheadend"); } byte[] salt = null; if (helloResponse.containsField("challenge")) { salt = helloResponse.getByteArray("challenge"); } else { salt = new byte[0]; _logger.LogInformation("[TVHclient] HTSConnectionAsync.authenticate: hello didn't include required field 'challenge' - htsp incorrectly implemented by tvheadend"); } byte[] digest = SHA1helper.GenerateSaltedSHA1(password, salt); HTSMessage authMessage = new HTSMessage(); authMessage.Method = "authenticate"; authMessage.putField("username", username); authMessage.putField("digest", digest); sendMessage(authMessage, loopBackResponseHandler); HTSMessage authResponse = loopBackResponseHandler.getResponse(); if (authResponse != null) { Boolean auth = authResponse.getInt("noaccess", 0) != 1; if (auth) { HTSMessage getDiskSpaceMessage = new HTSMessage(); getDiskSpaceMessage.Method = "getDiskSpace"; sendMessage(getDiskSpaceMessage, loopBackResponseHandler); HTSMessage diskSpaceResponse = loopBackResponseHandler.getResponse(); if (diskSpaceResponse != null) { long freeDiskSpace = -1; long totalDiskSpace = -1; if (diskSpaceResponse.containsField("freediskspace")) { freeDiskSpace = diskSpaceResponse.getLong("freediskspace") / BytesPerGiga; } else { _logger.LogDebug("[TVHclient] HTSConnectionAsync.authenticate: getDiskSpace didn't include required field 'freediskspace' - htsp incorrectly implemented by tvheadend"); } if (diskSpaceResponse.containsField("totaldiskspace")) { totalDiskSpace = diskSpaceResponse.getLong("totaldiskspace") / BytesPerGiga; } else { _logger.LogDebug("[TVHclient] HTSConnectionAsync.authenticate: getDiskSpace didn't include required field 'totaldiskspace' - htsp incorrectly implemented by tvheadend"); } _diskSpace = freeDiskSpace + "GB / " + totalDiskSpace + "GB"; } HTSMessage enableAsyncMetadataMessage = new HTSMessage(); enableAsyncMetadataMessage.Method = "enableAsyncMetadata"; sendMessage(enableAsyncMetadataMessage, null); } _logger.LogDebug("[TVHclient] HTSConnectionAsync.authenticate: authenticated = {m}", auth); return(auth); } } _logger.LogError("[TVHclient] HTSConnectionAsync.authenticate: no hello response"); return(false); }