blob: 3f8bba6820f55e56dc4d1602ce3793da89644010 [file] [log] [blame]
// Copyright 2021 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "sensorhelper.hpp"
#include "main.hpp"
#include <unistd.h>
#include <cassert>
#include <fstream>
#include <functional>
#include <sstream>
#include <string>
#include <vector>
extern SensorSnapshot* g_sensor_snapshot;
extern DBusConnectionSnapshot* g_connection_snapshot;
std::vector<std::string> MySplit(const std::string& s)
{
int idx = 0, prev_idx = 0;
std::vector<std::string> ret;
while (idx <= static_cast<int>(s.size()))
{
if (idx == static_cast<int>(s.size()) || s[idx] == '/')
{
if (idx > prev_idx)
{
ret.push_back(s.substr(prev_idx, idx - prev_idx));
}
prev_idx = idx + 1;
}
idx++;
}
return ret;
}
// Example: /xyz/openbmc_project/sensors/temperature/powerseq_temp
bool IsSensorObjectPath(const std::string& s)
{
std::vector<std::string> sections = MySplit(s);
if (sections.size() == 5 && sections[0] == "xyz" &&
sections[1] == "openbmc_project" && sections[2] == "sensors")
{
return true;
}
else
{
return false;
}
}
// Example: /xyz/openbmc_project/sensors/temperature/powerseq_temp/chassis
bool IsSensorObjectPathWithAssociation(const std::string& s,
std::string* sensor_obj_path)
{
std::vector<std::string> sections = MySplit(s);
if (sections.size() == 6)
{
size_t idx = s.rfind('/');
return IsSensorObjectPath(s.substr(0, idx));
}
else
{
return false;
}
}
bool IsUniqueName(const std::string& x)
{
if (x.empty())
return false;
if (x[0] != ':')
return false;
if (x[0] == ':')
{
for (int i = 1; i < int(x.size()); i++)
{
const char ch = x[i];
if (ch >= '0' || ch <= '9')
continue;
else if (ch == '.')
continue;
else
return false;
}
}
return true;
}
std::vector<std::string> FindAllObjectPathsForService(
const std::string& service,
std::function<void(const std::string&, const std::vector<std::string>&)>
on_interface_cb)
{
// Not available for PCAP replay, only valid with actual DBus capture
assert(false);
}
bool IsWhitespace(const char c)
{
if (c == ' ' || c == '\r' || c == '\n')
return true;
else
return false;
}
std::string Trim(const std::string& s)
{
const int N = int(s.size());
int idx0 = 0, idx1 = int(N - 1);
while (idx0 < N && IsWhitespace(s[idx0]))
idx0++;
while (idx1 >= 0 && IsWhitespace(s[idx1]))
idx1--;
if (idx0 >= N || idx1 < 0)
return "";
return s.substr(idx0, idx1 - idx0 + 1);
}