#######################################################################################
# Script sed for migrating from AFB_BINDING_VERSION 2 to AFB_BINDING_VERSION 3
# See http://docs.automotivelinux.org/docs/apis_services/en/dev/reference/af-binder/afb-migration-to-ibinding-v3.html
#######################################################################################
# update the version
# ------------------
s:\(\<AFB_BINDING_VERSION[[:blank:]]\{1,\}\)2\>:\13:
# update common types
# -------------------
s:\<\(struct[[:blank:]]\{1,\}\)\{0,1\}afb_req\>:afb_req_t:g
s:\<\(struct[[:blank:]]\{1,\}\)\{0,1\}afb_event\>:afb_event_t:g
s:\<\(struct[[:blank:]]\{1,\}\)\{0,1\}afb_verb_v2\>:afb_verb_t:g
s:\<\(struct[[:blank:]]\{1,\}\)\{0,1\}afb_binding_v2\>:afb_binding_t:g
# update common names
# -------------------
s:\<afbBindingV2\>:afbBindingExport:g
# very special
# ------------
s:( *afb_req_t *) *{ *NULL *, *NULL *}:NULL:g
# special dynapi
# --------------
s:\(\<AFB_BINDING_VERSION[[:blank:]]\{1,\}\)0\>:\13:
/^[[:blank:]]*# *define *\<AFB_BINDING_WANT_DYNAPI\>/d
s:\<\(struct[[:blank:]]\{1,\}\)\{0,1\}afb_dynapi\>\([[:blank:]]*\)\*:afb_api_t\2:g
s:\<\(struct[[:blank:]]\{1,\}\)\{0,1\}afb_request\>\([[:blank:]]*\)\*:afb_req_t\2:g
s:\<\(struct[[:blank:]]\{1,\}\)\{0,1\}afb_eventid\>\([[:blank:]]*\)\*:afb_event_t\2:g
s:\<afb_request_:afb_req_:g
s:\<afb_dynapi_:afb_api_:g
s:\<afb_eventid_:afb_event_:g
s:\<AFB_DYNAPI_:AFB_API_:g
s:\<AFB_REQUEST_:AFB_REQ_:g
s:\<afbBindingVdyn\>:afbBindingV3entry:g
s:\<dynapi\>:api:g
s:\<eventid\>:event:g
s:\<afb_api_make_eventid\>:afb_api_make_event:g
s:\<afb_api_new_api\>:-!&:g
s:\<afb_api_sub_verb\>:afb_api_del_verb:g
# update legacy calls
# ------------------
s:\<afb_req_subcall\(_req\)\>:afb_req_subcall_legacy:g
s:\<afb_req_subcall_sync\>:afb_req_subcall_sync_legacy:g
s:\<afb_api_call\>:afb_api_call_legacy:g
s:\<afb_api_call_sync\>:afb_api_call_sync_legacy:g
s:\<afb_req_store\>:afb_req_addref:g
s:\<afb_req_unstore\> *( *\(.*\) *):\1:g
# optional but activated by default
# ---------------------------------
s:\<afb_daemon_get_\(event_loop\|user_bus\|system_bus\)[ \t]*(:afb_api_get_\1(afbBindingV3root:g
s:\<afb_daemon_\([a-z_0-9]* *(\):afb_api_\1afbBindingV3root, :g
s:\<afb_service_call_\([a-z_0-9]*\)\( *(\):afb_api_\1_legacy\2afbBindingV3root, :g
s:\<afb_service_\([a-z_0-9]* *(\):afb_api_\1afbBindingV3root, :g
s:\<AFB_\(\(ERROR\|WARNING\|NOTICE\|INFO\|DEBUG\)\> *(\):AFB_API_\1afbBindingV3root, :g
# special app-controller
# ----------------------
s:\<_\(AFB_SYSLOG_LEVEL_[A-Z]*\)_\>:\1:g
# UNSAFES (uncomment it if optimistic)
# --------------
#s:\<afb_req_fail\(_[fv]\)\{0,1\}\>\( *([^,]*\):afb_req_reply\1\2, NULL:g
#s:\<afb_req_success\(_[fv]\)\{0,1\}\>\( *([^,]*,[^,]*\):afb_req_reply\1\2, NULL:g
#
#s:\<afb_api_add_verb\>/*
* Copyright (C) 2018 "IoT.bzh"
* Author Jonathan Aillet <jonathan.aillet@iot.bzh>
*
* 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.
*/
#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <wrap-json.h>
#include <afb/afb-binding.h>
#include "4a-hal-utilities-data.h"
#include "4a-hal-utilities-alsa-data.h"
/*******************************************************************************
* Specfic Hal controller streams data handling functions *
******************************************************************************/
struct CtlHalMixerData *HalUtlAddMixerDataToMixerDataList(struct CtlHalMixerData **firstMixerData)
{
struct CtlHalMixerData *currentMixerData;
if(! firstMixerData)
return NULL;
currentMixerData = *firstMixerData;
if(! currentMixerData) {
currentMixerData = (struct CtlHalMixerData *) calloc(1, sizeof(struct CtlHalMixerData));
if(! currentMixerData)
return NULL;
*firstMixerData = currentMixerData;
}
else {
while(currentMixerData->next)
currentMixerData = currentMixerData->next;
currentMixerData->next = calloc(1, sizeof(struct CtlHalMixerData));
if(! currentMixerData)
return NULL;
currentMixerData = currentMixerData->next;
}
return currentMixerData;
}
int8_t HalUtlRemoveSelectedMixerData(struct CtlHalMixerData **firstMixerData, struct CtlHalMixerData *mixerDataToRemove)
{
struct CtlHalMixerData *currentMixerData, *matchingMixerData;
if(! firstMixerData || ! mixerDataToRemove)
return -1;
currentMixerData = *firstMixerData;
if(currentMixerData == mixerDataToRemove) {
*firstMixerData = currentMixerData->next;
matchingMixerData = currentMixerData;
}
else {
while(currentMixerData && currentMixerData->next != mixerDataToRemove)
currentMixerData = currentMixerData->next;
if(currentMixerData) {
matchingMixerData = currentMixerData->next;
currentMixerData->next = currentMixerData->next->next;
}
else {
return -2;
}
}
free(matchingMixerData->verb);
free(matchingMixerData->verbToCall);
free(matchingMixerData->streamCardId);
free(matchingMixerData);
return 0;
}
int64_t HalUtlRemoveAllMixerData(struct CtlHalMixerData **firstMixerData)
{
int8_t ret;
int64_t mixerDataRemoved = 0;
while(*firstMixerData) {
ret = HalUtlRemoveSelectedMixerData(firstMixerData, *firstMixerData);
if(ret)
return (int64_t) ret;
mixerDataRemoved++;
}
return mixerDataRemoved;
}
int64_t HalUtlGetNumberOfMixerDataInList(struct CtlHalMixerData **firstMixerData)
{
int64_t numberOfMixerData = 0;
struct CtlHalMixerData *currentMixerData;
if(! firstMixerData)
return -1;
currentMixerData = *firstMixerData;
while(currentMixerData) {
currentMixerData = currentMixerData->next;
numberOfMixerData++;
}
return numberOfMixerData;
}
struct CtlHalMixerData *HalUtlSearchMixerDataByProperties(struct CtlHalMixerData **firstMixerData, char *verb, char *verbToCall, char *streamCardId)
{
struct CtlHalMixerData *currentMixerData;
if(! firstMixerData || ! verb)
return NULL;
currentMixerData = *firstMixerData;
while(currentMixerData) {
if((! strcmp(verb, currentMixerData->verb)) &&
(! strcmp(verbToCall, currentMixerData->verbToCall)) &&
(! strcmp(streamCardId, currentMixerData->streamCardId)))
return currentMixerData;
currentMixerData = currentMixerData->next;
}
return NULL;
}
/*******************************************************************************
* Specfic Hal data handling functions *
******************************************************************************/
struct SpecificHalData *HalUtlAddHalApiToHalList(struct SpecificHalData **firstHalData)
{
struct SpecificHalData *currentApi;
if(! firstHalData)
return NULL;
currentApi = *firstHalData;
if(! currentApi) {
currentApi = (struct SpecificHalData *) calloc(1, sizeof(struct SpecificHalData));
if(! currentApi)
return NULL;
*firstHalData = currentApi;
}
else {
while(currentApi->next)
currentApi = currentApi->next;
currentApi->next = calloc(1, sizeof(struct SpecificHalData));
if(! currentApi)
return NULL;
currentApi = currentApi->next;
}
return currentApi;
}
int8_t HalUtlRemoveSelectedHalFromList(struct SpecificHalData **firstHalData, struct SpecificHalData *apiToRemove)
{
struct SpecificHalData *currentApi, *matchingApi;
if(! firstHalData || ! apiToRemove)
return -1;
currentApi = *firstHalData;
if(currentApi == apiToRemove) {
*firstHalData = currentApi->next;
matchingApi = currentApi;
}
else {
while(currentApi && currentApi->next != apiToRemove)
currentApi = currentApi->next;
if(currentApi) {
matchingApi = currentApi->next;
currentApi->next = currentApi->next->next;
}
else {
return -2;
}
}
free(matchingApi->apiName);
free(matchingApi->sndCardPath);
free(matchingApi->info);
free(matchingApi->author);
free(matchingApi->version);
free(matchingApi->date);
if(matchingApi->internal) {
HalUtlRemoveAllMixerData(&matchingApi->ctlHalSpecificData->ctlHalStreamsData);
HalUtlRemoveAllMixerData(&matchingApi->ctlHalSpecificData->ctlHalPlaybacksData);
HalUtlRemoveAllMixerData(&matchingApi->ctlHalSpecificData->ctlHalCapturesData);
HalUtlFreeAlsaCtlsMap(matchingApi->ctlHalSpecificData->ctlHalAlsaMapT);
free(matchingApi->ctlHalSpecificData);
}
free(matchingApi);
return 0;
}
int64_t HalUtlRemoveAllHalFromList(struct SpecificHalData **firstHalData)
{
int8_t ret;
int64_t CtlHalApiRemoved = 0;
while(*firstHalData) {
ret = HalUtlRemoveSelectedHalFromList(firstHalData, *firstHalData);
if(ret)
return (int64_t) ret;
CtlHalApiRemoved++;
}
return CtlHalApiRemoved;
}
int64_t HalUtlGetNumberOfHalInList(struct SpecificHalData **firstHalData)
{
int64_t numberOfCtlHal = 0;
struct SpecificHalData *currentApi;
if(! firstHalData)
return -1;
currentApi = *firstHalData;
while(currentApi) {
currentApi = currentApi->next;
numberOfCtlHal++;
}
return numberOfCtlHal;
}
struct SpecificHalData *HalUtlSearchHalDataByApiName(struct SpecificHalData **firstHalData, char *apiName)
{
struct SpecificHalData *currentApi;
if(! firstHalData || ! apiName)
return NULL;
currentApi = *firstHalData;
while(currentApi) {
if(! strcmp(apiName, currentApi->apiName))
return currentApi;
currentApi = currentApi->next;
}
return NULL;
}
struct SpecificHalData *HalUtlSearchReadyHalDataByCarId(struct SpecificHalData **firstHalData, int cardId)
{
struct SpecificHalData *currentApi;
if(! firstHalData)
return NULL;
currentApi = *firstHalData;
while(currentApi) {
if(currentApi->status == HAL_STATUS_READY && currentApi->sndCardId == cardId)
return currentApi;
currentApi = currentApi->next;
}
return NULL;
}
/*******************************************************************************
* Hal Manager data handling functions *
******************************************************************************/
uint8_t HalUtlInitializeHalMgrData(afb_api_t apiHandle, struct HalMgrData *HalMgrGlobalData, char *apiName, char *info)
{
if(! apiHandle || ! HalMgrGlobalData || ! apiName || ! info)
return -1;
// Allocate and fill apiName and info strings
HalMgrGlobalData->apiName = strdup(apiName);
if(! HalMgrGlobalData->apiName)
return -2;
HalMgrGlobalData->info = strdup(info);
if(! HalMgrGlobalData->apiName)
return -3;
HalMgrGlobalData->apiHandle = apiHandle;
return 0;
}
void HalUtlRemoveHalMgrData(struct HalMgrData *HalMgrGlobalData)
{
if(! HalMgrGlobalData)
return;
if(HalMgrGlobalData->first)
HalUtlRemoveAllHalFromList(&HalMgrGlobalData->first);
free(HalMgrGlobalData->apiName);
free(HalMgrGlobalData->info);
free(HalMgrGlobalData);
}