summaryrefslogtreecommitdiffstats
path: root/templates/feature/agl-profile-hud
diff options
context:
space:
mode:
authorduerpei <duep.fnst@fujitsu.com>2022-02-28 16:08:10 +0800
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>2022-03-05 19:18:16 +0000
commit381e2a9405ed939c5774d9c582298c661139d0c5 (patch)
tree312bfbf8f80d4e58c8ac8e3625f0e1b74559f711 /templates/feature/agl-profile-hud
parentd009fa0c42042a0b7d069779852953621e46469b (diff)
Fix potential memory leakmarlin_12.93.0marlin/12.93.012.93.0
Bug-AGL:SPEC-4259 Signed-off-by: duerpei <duep.fnst@fujitsu.com> Change-Id: I4be57103eee67d64893baccf878d2dbebd1f9cf5 Reviewed-on: https://gerrit.automotivelinux.org/gerrit/c/AGL/meta-agl/+/27219 Reviewed-by: Marius Vlad <marius.vlad@collabora.com> Reviewed-by: Naoto YAMAGUCHI <naoto.yamaguchi@aisin.co.jp> Reviewed-by: Jan-Simon Moeller <jsmoeller@linuxfoundation.org> Tested-by: Jenkins Job builder account ci-image-build: Jenkins Job builder account ci-image-boot-test: Jenkins Job builder account
Diffstat (limited to 'templates/feature/agl-profile-hud')
0 files changed, 0 insertions, 0 deletions
='#n93'>93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
/*
 * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
 *
 * 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 <json-c/json.h>
#include "wm_client.hpp"
#include "hmi-debug.h"

#define INVALID_SURFACE_ID 0

using std::string;
using std::vector;

namespace wm
{

static const vector<string> kWMEvents = {
    // Private event for applications
    "syncDraw", "flushDraw", "visible", "invisible", "active", "inactive", "error"};
static const vector<string> kErrorDescription = {
    "unknown-error"};

static const char kKeyDrawingName[] = "drawing_name";
static const char kKeyrole[] = "role";
static const char kKeyError[] = "error";
static const char kKeyErrorDesc[] = "kErrorDescription";

WMClient::WMClient(const string &appid, unsigned layer, unsigned surface, const string &role)
    : id(appid), layer(layer),
      role2surface(0)
{
    role2surface[role] = surface;
    for (auto x : kWMEvents)
    {
#if GTEST_ENABLED
        string ev = x;
#else
        afb_event ev = afb_daemon_make_event(x.c_str());
#endif
        event2list[x] = ev;
    }
}

WMClient::WMClient(const string &appid, const string &role)
    : id(appid),
      layer(0),
      role2surface(0),
      event2list(0)
{
    role2surface[role] = INVALID_SURFACE_ID;
    for (auto x : kWMEvents)
    {
#if GTEST_ENABLED
        string ev = x;
#else
        afb_event ev = afb_daemon_make_event(x.c_str());
#endif
        event2list[x] = ev;
    }
}

WMClient::~WMClient()
{
}

string WMClient::appID() const
{
    return this->id;
}

unsigned WMClient::surfaceID(const string &role) const
{
    if (0 == this->role2surface.count(role))
    {
        return INVALID_SURFACE_ID;
    }
    return this->role2surface.at(role);
}

std::string WMClient::role(unsigned surface) const
{
    for(const auto& x : this->role2surface)
    {
        if(x.second == surface)
        {
            return x.first;
        }
    }
    return std::string("");
}

unsigned WMClient::layerID() const
{
    return this->layer;
}

/**
 * Set layerID the client belongs to
 *
 * This function set layerID the client belongs to.
 * But this function may not used because the layer should be fixed at constructor.
 * So this function will be used to change layer by some reasons.
 *
 * @param     unsigned[in] layerID
 * @return    None
 * @attention WMClient can't have multiple layer
 */
void WMClient::registerLayer(unsigned layer)
{
    this->layer = layer;
}

/**
 * Add the pair of role and surface to the client
 *
 * This function set the pair of role and surface to the client.
 * This function is used for the client which has multi surfaces.
 * If the model and relationship for role and surface(layer)
 * is changed, this function will be changed
 * Current Window Manager doesn't use this function.
 *
 * @param     string[in] role
 * @param     unsigned[in] surface
 * @return    true
 */
bool WMClient::addSurface(const string &role, unsigned surface)
{
    HMI_DEBUG("wm", "Add role %s with surface %d", role.c_str(), surface);
    if (0 != this->role2surface.count(role))
    {
        HMI_NOTICE("wm", "override surfaceID %d with %d", this->role2surface[role], surface);
    }
    this->role2surface[role] = surface;
    return true;
}

bool WMClient::removeSurfaceIfExist(unsigned surface)
{
    bool ret = false;
    for (auto &x : this->role2surface)
    {
        if (surface == x.second)
        {
            HMI_INFO("wm", "Remove surface from client %s: role %s, surface: %d",
                                this->id.c_str(), x.first.c_str(), x.second);
            this->role2surface.erase(x.first);
            ret = true;
            break;
        }
    }
    return ret;
}

bool WMClient::removeRole(const string &role)
{
    bool ret = false;
    if (this->role2surface.count(role) != 0)
    {
        this->role2surface.erase(role);
        ret = true;
    }
    return ret;
}

#if GTEST_ENABLED
bool WMClient::subscribe(afb_req req, const string &evname)
{
    if(evname != kKeyError){
        HMI_DEBUG("wm", "error is only enabeled for now");
        return false;
    }
    int ret = afb_req_subscribe(req, this->event2list[evname]);
    if (ret)
    {
        HMI_DEBUG("wm", "Failed to subscribe %s", evname.c_str());
        return false;
    }
    return true;
}

void WMClient::emitError(WM_CLIENT_ERROR_EVENT ev)
{
    if (!afb_event_is_valid(this->event2list[kKeyError])){
        HMI_ERROR("wm", "event err is not valid");
        return;
    }
    json_object *j = json_object_new_object();
    json_object_object_add(j, kKeyError, json_object_new_int(ev));
    json_object_object_add(j, kKeyErrorDesc, json_object_new_string(kErrorDescription[ev].c_str()));
    HMI_DEBUG("wm", "error: %d, description:%s", ev, kErrorDescription[ev].c_str());

    int ret = afb_event_push(this->event2list[kKeyError], j);
    if (ret != 0)
    {
        HMI_DEBUG("wm", "afb_event_push failed: %m");
    }
}
#endif

void WMClient::dumpInfo()
{
    DUMP("APPID : %s", id.c_str());
    DUMP("  LAYER : %d", layer);
    for (const auto &x : this->role2surface)
    {
        DUMP("  ROLE  : %s , SURFACE : %d", x.first.c_str(), x.second);
    }
}

} // namespace wm