blob: 166b39aa7ebed85f79adfbe4337b28740a9393ed [file] [log] [blame]
/*
* Copyright (C) 2021 The Android Open Source Project
*
* 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.
*/
#pragma once
#include "LruSet.h"
#include "StringUtils.h"
#include "Wrap.h"
namespace android::mediametrics {
/*
* ValidateId is used to check whether the log session id is properly formed
* and has been registered (i.e. from the Java MediaMetricsManagerService).
*
* The default memory window to track registered ids is set to SINGLETON_LRU_SET_SIZE.
*
* This class is not thread-safe, but the singleton returned by get() uses LockWrap<>
* to ensure thread-safety.
*/
class ValidateId {
mediametrics::LruSet<std::string> mIdSet;
size_t mInvalidIds = 0; // count invalid ids encountered.
public:
/** Creates a ValidateId object with size memory window. */
explicit ValidateId(size_t size) : mIdSet{size} {}
/** Returns a string dump of recent contents and stats. */
std::string dump() const;
/**
* Registers the id string.
*
* If id string is malformed (not 16 Base64Url chars), it is ignored.
* Once registered, calling validateId() will return id (instead of the empty string).
* ValidateId may "forget" the id after not encountering it within the past N ids,
* where N is the size set in the constructor.
*
* param id string (from MediaMetricsManagerService).
*/
void registerId(const std::string& id);
/**
* Returns the empty string if id string is malformed (not 16 Base64Url chars)
* or if id string has not been seen (in the recent size ids);
* otherwise it returns the same id parameter.
*
* \param id string (to be sent to statsd).
*/
const std::string& validateId(const std::string& id);
/** Singleton set size */
static inline constexpr size_t SINGLETON_LRU_SET_SIZE = 2000;
using LockedValidateId = mediametrics::LockWrap<ValidateId>;
/**
* Returns a singleton locked ValidateId object that is thread-safe using LockWrap<>.
*
* The Singleton ValidateId object is created with size LRU_SET_SIZE (during first call).
*/
static inline LockedValidateId& get() {
static LockedValidateId privateSet{SINGLETON_LRU_SET_SIZE};
return privateSet;
}
};
} // namespace android::mediametrics