400 lines
14 KiB
C++
400 lines
14 KiB
C++
#include <EXTERN.h> /* from the Perl distribution */
|
|
|
|
#ifdef WNT
|
|
#include <tools/prewin.h>
|
|
#include "perl.h"
|
|
#include <tools/postwin.h>
|
|
#else
|
|
#include "perl.h"
|
|
#endif
|
|
#undef Copy /* from Perl handy.h */
|
|
|
|
#include "XmlBuildList.hxx"
|
|
|
|
#ifdef __cplusplus
|
|
# define EXTERN_C extern "C"
|
|
#else
|
|
# define EXTERN_C extern
|
|
#endif
|
|
|
|
static PerlInterpreter *my_perl; /*** The Perl interpreter ***/
|
|
|
|
EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
|
|
static void xs_init (pTHX);
|
|
static void dl_init (pTHX);
|
|
|
|
static void xs_init(pTHX)
|
|
{
|
|
char *file = __FILE__;
|
|
dXSUB_SYS;
|
|
{
|
|
/* DynaLoader is a special case */
|
|
newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
|
|
}
|
|
}
|
|
|
|
static void dl_init(pTHX)
|
|
{
|
|
char *file = __FILE__;
|
|
dTARG;
|
|
dSP;
|
|
/* Dynamicboot strapping code*/
|
|
SAVETMPS;
|
|
targ=sv_newmortal();
|
|
FREETMPS;
|
|
/* end Dynamic bootstrapping code */
|
|
}
|
|
|
|
FullByteStringList::FullByteStringList()
|
|
: FullByteStingListImpl(),
|
|
nRef (0)
|
|
{
|
|
}
|
|
|
|
FullByteStringList::~FullByteStringList()
|
|
{
|
|
ByteString* pStr = First();
|
|
while (pStr)
|
|
{
|
|
delete pStr;
|
|
pStr = Next();
|
|
}
|
|
}
|
|
|
|
ULONG FullByteStringList::GetPos (ByteString& rStr)
|
|
{
|
|
ULONG nCurPos = GetCurPos();
|
|
ULONG nPos = 0;
|
|
ByteString* pStr = First();
|
|
while (pStr)
|
|
{
|
|
if (*pStr == rStr)
|
|
{
|
|
GetObject (nCurPos);
|
|
return nPos;
|
|
}
|
|
pStr = Next();
|
|
nPos ++;
|
|
}
|
|
GetObject (nCurPos);
|
|
return LIST_ENTRY_NOTFOUND;
|
|
}
|
|
|
|
FullByteStringListWrapper& FullByteStringListWrapper::operator=( const FullByteStringListWrapper& rFullByteStringListWrapper )
|
|
{
|
|
if (pStringList)
|
|
if (pStringList->GetRef() == 0)
|
|
delete pStringList;
|
|
else
|
|
pStringList->DecRef();
|
|
|
|
pStringList = rFullByteStringListWrapper.GetStringList();
|
|
if (pStringList)
|
|
pStringList->IncRef();
|
|
return *this;
|
|
}
|
|
|
|
FullByteStringListWrapper::~FullByteStringListWrapper ()
|
|
{
|
|
if (pStringList)
|
|
{
|
|
if (pStringList->GetRef() == 0)
|
|
delete pStringList;
|
|
else
|
|
pStringList->DecRef();
|
|
}
|
|
}
|
|
|
|
//
|
|
// Function initializes Perl
|
|
// ATTENTION: No check built in - YET TO DO
|
|
//
|
|
void XmlBuildList::initPerl(const char* ModulePath) {
|
|
if (PerlInitialized)
|
|
return;
|
|
my_perl = perl_alloc();
|
|
if (!my_perl)
|
|
throw XmlBuildListException("Cannot initialize perl");
|
|
perl_construct(my_perl);
|
|
char* embedding[] = {"", "-e", "0"};
|
|
int exitstatus = perl_parse(my_perl, xs_init, 3, embedding, (char **)NULL);
|
|
if (!exitstatus) {
|
|
dl_init(aTHX);
|
|
exitstatus = perl_run(my_perl);
|
|
}
|
|
//perl_run(my_perl);
|
|
// Create a variable (s. perlguts)
|
|
SV* sv = get_sv("main::module_path", TRUE);
|
|
sv_setpv(sv, ModulePath);
|
|
eval_pv("use lib $main::module_path; use XMLBuildListParser;", FALSE);
|
|
checkOperationSuccess();
|
|
eval_pv("$main::build_lst_obj = XMLBuildListParser->new();", FALSE);
|
|
checkOperationSuccess();
|
|
eval_pv("@array = ();", FALSE);
|
|
checkOperationSuccess();
|
|
PerlInitialized = TRUE;
|
|
};
|
|
|
|
// Function proves if the $@ perl variable is set, if yes -
|
|
// last operation was unsuccessfull -> throws exception
|
|
void XmlBuildList::checkOperationSuccess() {
|
|
char* op_result = SvPV_nolen(get_sv("main::@", FALSE));
|
|
if (strcmp(op_result, ""))
|
|
throw XmlBuildListException(op_result);
|
|
}
|
|
|
|
//
|
|
// Function generates a regular array with NULL as last element
|
|
// from the Perl-object @array
|
|
//
|
|
FullByteStringList* XmlBuildList::extractArray() {
|
|
FullByteStringList* pStringList = new FullByteStringList();
|
|
AV* theArrayObj = get_av("main::array", FALSE);
|
|
I32 arrayLength = av_len(theArrayObj); // $#array value
|
|
if (arrayLength == -1)
|
|
return pStringList;
|
|
|
|
SV** string_ptr;
|
|
char* pStoredString;
|
|
// populate vector with strings (char*)
|
|
for (int i = 0; i <= arrayLength; i++) {
|
|
string_ptr = av_fetch(theArrayObj, i, NULL);
|
|
//pStoredString = savepv(SvPV_nolen(*string_ptr));
|
|
pStoredString = SvPV_nolen(*string_ptr);
|
|
ByteString* pStr = new ByteString(pStoredString);
|
|
pStringList->Insert(pStr, LIST_APPEND);
|
|
};
|
|
return pStringList;
|
|
};
|
|
|
|
|
|
char* XmlBuildList::getError() {
|
|
eval_pv("$main::string1 = $main::build_lst_obj->getError();", FALSE);
|
|
checkOperationSuccess();
|
|
return SvPV_nolen(get_sv("main::string1", FALSE));
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
XmlBuildList::XmlBuildList(const ByteString& rModulePath)
|
|
/*****************************************************************************/
|
|
: PerlInitialized (FALSE)
|
|
{
|
|
initPerl(rModulePath.GetBuffer());
|
|
string_obj1 = get_sv("main::string1", TRUE);
|
|
string_obj2 = get_sv("main::string2", TRUE);
|
|
string_obj3 = get_sv("main::string3", TRUE);
|
|
if (!(string_obj1 && string_obj2 && string_obj3))
|
|
throw XmlBuildListException("Cannot initialize Perl string objects");
|
|
};
|
|
|
|
//
|
|
// Function uninitializes Perl
|
|
//
|
|
/*****************************************************************************/
|
|
XmlBuildList::~XmlBuildList()
|
|
/*****************************************************************************/
|
|
{
|
|
if (!PerlInitialized)
|
|
return;
|
|
perl_destruct(my_perl);
|
|
perl_free(my_perl);
|
|
PerlInitialized = FALSE;
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
void XmlBuildList::loadXMLFile(const ByteString& rBuildList)
|
|
/*****************************************************************************/
|
|
{
|
|
sv_setpv(string_obj1, rBuildList.GetBuffer());
|
|
eval_pv("$main::string2 = $main::build_lst_obj->loadXMLFile($main::string1);", FALSE);
|
|
checkOperationSuccess();
|
|
if(!SvTRUE(string_obj2)) {
|
|
const char* Message = getError();
|
|
throw XmlBuildListException(Message);
|
|
};
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
FullByteStringListWrapper XmlBuildList::getProducts()
|
|
/*****************************************************************************/
|
|
{
|
|
eval_pv("@array = $main::build_lst_obj->getProducts();", FALSE);
|
|
checkOperationSuccess();
|
|
FullByteStringList* pList = extractArray();
|
|
return FullByteStringListWrapper(pList);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
FullByteStringListWrapper XmlBuildList::getJobDirectories(const ByteString& rJobType, const ByteString& rJobPlatform)
|
|
/*****************************************************************************/
|
|
{
|
|
sv_setpv(string_obj1, rJobType.GetBuffer());
|
|
sv_setpv(string_obj2, rJobPlatform.GetBuffer());
|
|
eval_pv("@array = $main::build_lst_obj->getJobDirectories($main::string1, $main::string2);", FALSE);
|
|
checkOperationSuccess();
|
|
FullByteStringList* pList = extractArray();
|
|
return FullByteStringListWrapper(pList);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
FullByteStringListWrapper XmlBuildList::getModuleDependencies(const ByteString& rProduct, const ByteString& rDependencyType)
|
|
/*****************************************************************************/
|
|
{
|
|
FullByteStringList* pProducts = new FullByteStringList();
|
|
FullByteStringListWrapper aProducts (pProducts);
|
|
if (rProduct != "")
|
|
aProducts.Insert (new ByteString(rProduct), LIST_APPEND);
|
|
return getModuleDependencies(aProducts, rDependencyType);
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
FullByteStringListWrapper XmlBuildList::getModuleDependencies(FullByteStringListWrapper& rProducts, const ByteString& rDependencyType)
|
|
/*****************************************************************************/
|
|
{
|
|
eval_pv("@products = ();", FALSE);
|
|
checkOperationSuccess();
|
|
AV* theArrayObj = get_av("main::products", FALSE);
|
|
FullByteStringList* pProducts = rProducts.GetStringList();
|
|
ByteString* pStr = pProducts->First();
|
|
while (pStr)
|
|
{
|
|
sv_setpv(string_obj2, pStr->GetBuffer());
|
|
av_push(theArrayObj, string_obj2);
|
|
pStr = pProducts->Next();
|
|
}
|
|
|
|
sv_setpv(string_obj1, rDependencyType.GetBuffer());
|
|
eval_pv("@array = $main::build_lst_obj->getModuleDependencies(\\@products, $main::string1);", FALSE);
|
|
checkOperationSuccess();
|
|
FullByteStringList* pList = extractArray();
|
|
return FullByteStringListWrapper(pList);
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
FullByteStringListWrapper XmlBuildList::getJobBuildReqs(const ByteString& rJobDir, const ByteString& rBuildReqPlatform)
|
|
/*****************************************************************************/
|
|
{
|
|
sv_setpv(string_obj1, rJobDir.GetBuffer());
|
|
sv_setpv(string_obj2, rBuildReqPlatform.GetBuffer());
|
|
eval_pv("@array = $main::build_lst_obj->getJobBuildReqs($main::string1, $main::string2);", FALSE);
|
|
checkOperationSuccess();
|
|
FullByteStringList* pList = extractArray();
|
|
return FullByteStringListWrapper(pList);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
ByteString XmlBuildList::getModuleDepType(const ByteString& rDepModuleName)
|
|
/*****************************************************************************/
|
|
{
|
|
sv_setpv(string_obj1, rDepModuleName.GetBuffer());
|
|
eval_pv("$main::string1 = $main::build_lst_obj->getModuleDepType($main::string1);", FALSE);
|
|
checkOperationSuccess();
|
|
char* pString = SvPV_nolen(get_sv("main::string1", FALSE));
|
|
ByteString sDependencyType(pString);
|
|
return sDependencyType;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
sal_Bool XmlBuildList::hasModuleDepType(FullByteStringListWrapper& rProducts, const ByteString& rDependencyType)
|
|
/*****************************************************************************/
|
|
{
|
|
FullByteStringListWrapper aDepencendModules = getModuleDependencies(rProducts, rDependencyType);
|
|
if (aDepencendModules.Count()>0)
|
|
{
|
|
return sal_True;
|
|
}
|
|
return sal_False;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
FullByteStringListWrapper XmlBuildList::getModuleDepTypes(FullByteStringListWrapper& rProducts)
|
|
/*****************************************************************************/
|
|
{
|
|
FullByteStringList * pList = new FullByteStringList();
|
|
|
|
ByteString aDepType = ByteString( DEP_MD_SIMPLE_STR );
|
|
bool bHasType = hasModuleDepType(rProducts, aDepType);
|
|
if (bHasType)
|
|
pList->Insert(new ByteString (aDepType));
|
|
|
|
aDepType = ByteString(DEP_MD_ALWAYS_STR);
|
|
bHasType = hasModuleDepType(rProducts, aDepType);
|
|
if (bHasType)
|
|
pList->Insert(new ByteString (aDepType));
|
|
|
|
aDepType = ByteString(DEP_MD_FORCE_STR);
|
|
bHasType = hasModuleDepType(rProducts, aDepType);
|
|
if (bHasType)
|
|
pList->Insert(new ByteString (aDepType));
|
|
|
|
return FullByteStringListWrapper (pList);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
FullByteStringListWrapper XmlBuildList::getModuleProducts(const ByteString& rDepModuleName)
|
|
/*****************************************************************************/
|
|
{
|
|
sv_setpv(string_obj1, rDepModuleName.GetBuffer());
|
|
eval_pv("@array = $main::build_lst_obj->getModuleProducts($main::string1);", FALSE);
|
|
checkOperationSuccess();
|
|
FullByteStringList* pList = extractArray();
|
|
return FullByteStringListWrapper(pList);
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
ByteString XmlBuildList::getModuleName()
|
|
/*****************************************************************************/
|
|
{
|
|
eval_pv("$main::string1 = $main::build_lst_obj->getModuleName();", FALSE);
|
|
checkOperationSuccess();
|
|
char* pString = SvPV_nolen(get_sv("main::string1", FALSE));
|
|
ByteString sModuleName(pString);
|
|
return sModuleName;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
FullByteStringListWrapper XmlBuildList::getDirDependencies(const ByteString& rJobDir, const ByteString& rJobType, const ByteString& rJobPlatform)
|
|
/*****************************************************************************/
|
|
{
|
|
sv_setpv(string_obj1, rJobDir.GetBuffer());
|
|
sv_setpv(string_obj2, rJobType.GetBuffer());
|
|
sv_setpv(string_obj3, rJobPlatform.GetBuffer());
|
|
eval_pv("@array = $main::build_lst_obj->getDirDependencies($main::string1, $main::string2, $main::string3);", FALSE);
|
|
checkOperationSuccess();
|
|
FullByteStringList* pList = extractArray();
|
|
return FullByteStringListWrapper(pList);
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
FullByteStringListWrapper XmlBuildList::getJobTypes(const ByteString& rJobDir)
|
|
/*****************************************************************************/
|
|
{
|
|
sv_setpv(string_obj1, rJobDir.GetBuffer());
|
|
eval_pv("@array = $main::build_lst_obj->getJobTypes($main::string1);", FALSE);
|
|
checkOperationSuccess();
|
|
FullByteStringList* pList = extractArray();
|
|
return FullByteStringListWrapper(pList);
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
FullByteStringListWrapper XmlBuildList::getJobPlatforms(const ByteString& rJobDir)
|
|
/*****************************************************************************/
|
|
{
|
|
sv_setpv(string_obj1, rJobDir.GetBuffer());
|
|
eval_pv("@array = $main::build_lst_obj->getJobPlatforms($main::string1);", FALSE);
|
|
checkOperationSuccess();
|
|
FullByteStringList* pList = extractArray();
|
|
return FullByteStringListWrapper(pList);
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
FullByteStringListWrapper XmlBuildList::getJobBuildReqPlatforms(const ByteString& rJobDir, const ByteString& rBuildReqName)
|
|
/*****************************************************************************/
|
|
{
|
|
sv_setpv(string_obj1, rJobDir.GetBuffer());
|
|
sv_setpv(string_obj2, rBuildReqName.GetBuffer());
|
|
eval_pv("@array = $main::build_lst_obj->getJobBuildReqPlatforms($main::string1, $main::string2);", FALSE);
|
|
checkOperationSuccess();
|
|
FullByteStringList* pList = extractArray();
|
|
return FullByteStringListWrapper(pList);
|
|
};
|