#pragma once
/*
* Copyright (C) 2005-2015 Team Kodi
* http://kodi.tv
*
* This Program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This Program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Kodi; see the file COPYING. If not, see
* .
*
*/
#include "xbmc_addon_types.h"
#include
#include
#include
class DllSetting
{
public:
enum SETTING_TYPE { NONE=0, CHECK, SPIN };
DllSetting(SETTING_TYPE t, const char *n, const char *l)
{
id = NULL;
label = NULL;
if (n)
{
id = new char[strlen(n)+1];
strcpy(id, n);
}
if (l)
{
label = new char[strlen(l)+1];
strcpy(label, l);
}
current = 0;
type = t;
}
DllSetting(const DllSetting &rhs) // copy constructor
{
id = NULL;
label = NULL;
if (rhs.id)
{
id = new char[strlen(rhs.id)+1];
strcpy(id, rhs.id);
}
if (rhs.label)
{
label = new char[strlen(rhs.label)+1];
strcpy(label, rhs.label);
}
current = rhs.current;
type = rhs.type;
for (unsigned int i = 0; i < rhs.entry.size(); i++)
{
char *lab = new char[strlen(rhs.entry[i]) + 1];
strcpy(lab, rhs.entry[i]);
entry.push_back(lab);
}
}
~DllSetting()
{
delete[] id;
delete[] label;
for (unsigned int i=0; i < entry.size(); i++)
delete[] entry[i];
}
void AddEntry(const char *label)
{
if (!label || type != SPIN) return;
char *lab = new char[strlen(label) + 1];
strcpy(lab, label);
entry.push_back(lab);
}
// data members
SETTING_TYPE type;
char* id;
char* label;
int current;
std::vector entry;
};
class DllUtils
{
public:
static unsigned int VecToStruct(std::vector &vecSet, ADDON_StructSetting*** sSet)
{
*sSet = NULL;
if (vecSet.empty())
return 0;
unsigned int uiElements=0;
*sSet = (ADDON_StructSetting**)malloc(vecSet.size()*sizeof(ADDON_StructSetting*));
for(unsigned int i=0;iid = NULL;
(*sSet)[i]->label = NULL;
uiElements++;
if (vecSet[i].id && vecSet[i].label)
{
(*sSet)[i]->id = strdup(vecSet[i].id);
(*sSet)[i]->label = strdup(vecSet[i].label);
(*sSet)[i]->type = vecSet[i].type;
(*sSet)[i]->current = vecSet[i].current;
(*sSet)[i]->entry_elements = 0;
(*sSet)[i]->entry = NULL;
if(vecSet[i].type == DllSetting::SPIN && !vecSet[i].entry.empty())
{
(*sSet)[i]->entry = (char**)malloc(vecSet[i].entry.size()*sizeof(char**));
for(unsigned int j=0;j 0)
{
(*sSet)[i]->entry[j] = strdup(vecSet[i].entry[j]);
(*sSet)[i]->entry_elements++;
}
}
}
}
}
return uiElements;
}
static void StructToVec(unsigned int iElements, ADDON_StructSetting*** sSet, std::vector *vecSet)
{
if(iElements == 0)
return;
vecSet->clear();
for(unsigned int i=0;itype, (*sSet)[i]->id, (*sSet)[i]->label);
if((*sSet)[i]->type == DllSetting::SPIN)
{
for(unsigned int j=0;j<(*sSet)[i]->entry_elements;j++)
{
vSet.AddEntry((*sSet)[i]->entry[j]);
}
}
vSet.current = (*sSet)[i]->current;
vecSet->push_back(vSet);
}
}
static void FreeStruct(unsigned int iElements, ADDON_StructSetting*** sSet)
{
if(iElements == 0)
return;
for(unsigned int i=0;itype == DllSetting::SPIN)
{
for(unsigned int j=0;j<(*sSet)[i]->entry_elements;j++)
{
free((*sSet)[i]->entry[j]);
}
free((*sSet)[i]->entry);
}
free((*sSet)[i]->id);
free((*sSet)[i]->label);
free((*sSet)[i]);
}
free(*sSet);
}
};