our
$VERSION
=
'1.1.0'
;
sub
new {
my
%args
;
if
(
defined
(
$_
[1])){
%args
= %{
$_
[1]};
}
my
$self
={
error
=>
undef
,
errorString
=>
undef
,
perror
=>
undef
,
errorExtra
=>{
flags
=>{
1
=>
'zconf'
,
2
=>
'missingArg'
,
3
=>
'missingArg'
,
4
=>
'colon'
,
5
=>
'noPrefs'
,
6
=>
'lmFailed'
,
7
=>
'modDNE'
,
8
=>
'missingArg'
,
9
=>
'notBoolean'
,
}
},
};
bless
$self
;
if
(!
defined
(
$args
{set})) {
$self
->{set}=
undef
;
}
else
{
$self
->{set}=
$args
{set};
}
if
(!
defined
(
$args
{zconf})) {
$self
->{zconf}=ZConf->new();
if
(
defined
(
$self
->{zconf}->error)){
$self
->{perror}=1;
$self
->{error}=1;
$self
->{errorString}=
"Could not initiate ZConf. It failed with '"
.
$self
->{zconf}->error.
"', '"
.
$self
->{zconf}->errorString.
"'"
;
$self
->
warn
;
return
$self
;
}
}
else
{
$self
->{zconf}=
$args
{zconf};
}
$self
->{init} =
$self
->{zconf}->configExists(
"gui"
);
if
(
$self
->{zconf}->error ){
$self
->{perror}=1;
$self
->{error}=1;
$self
->{errorString}=
"Could not check if the config 'gu'i exists."
.
" It failed with '"
.
$self
->{zconf}->error.
"', '"
.
$self
->{zconf}->errorString.
"'"
;
$self
->
warn
;
return
$self
;
}
if
(
$self
->{init} ) {
$self
->{init}=
$self
->{zconf}->defaultSetExists(
'gui'
,
$self
->{set});
if
(
$self
->{zconf}->error){
$self
->{perror}=1;
$self
->{error}=1;
$self
->{errorString}=
"Could not check if the config 'gu'i exists."
.
" It failed with '"
.
$self
->{zconf}->error.
"', '"
.
$self
->{zconf}->errorString.
"'"
;
$self
->
warn
;
return
$self
;
}
}
if
( !
$self
->{init} ) {
$self
->init(
$self
->{set});
if
(
$self
->error ) {
warn
(
'ZConf-GUI new: init failed.'
);
}
else
{
$self
->{init}=1;
}
return
$self
;
}
$self
->{init}=
$self
->{zconf}->setExists(
'gui'
,
$self
->{set});
if
(
$self
->{zconf}->error ){
$self
->{perror}=1;
$self
->{error}=1;
$self
->{errorString}=
"defaultSetExists failed for 'gui'."
.
" It failed with '"
.
$self
->{zconf}->error.
"', '"
.
$self
->{zconf}->errorString.
"'"
;
$self
->
warn
;
return
$self
;
}
if
(!
$self
->{init}) {
$self
->init(
$self
->{set});
if
(
$self
->error ) {
$self
->{perror}=1;
warn
(
'ZConf-GUI new:4: Autoinit failed.'
);
}
else
{
$self
->{init}=1;
}
return
$self
;
}
if
(
$self
->{init}) {
$self
->{zconf}->
read
({
set
=>
$self
->{set},
config
=>
'gui'
});
}
else
{
}
return
$self
;
}
sub
getAppendOthers{
my
$self
=
$_
[0];
if
( !
$self
->errorblank ){
return
undef
;
}
my
%vars
=
$self
->{zconf}->regexVarGet(
'gui'
,
'^appendOthers$'
);
if
(
$self
->{zconf}->error ){
$self
->{error}=1;
$self
->{errorString}=
'ZConf error getting value "appendOthers" in "gui".'
.
' ZConf error="'
.
$self
->{zconf}->error.
'" '
.
'ZConf error string="'
.
$self
->{zconf}->errorString.
'"'
;
$self
->
warn
;
return
undef
;
}
if
(!
defined
(
$vars
{appendOthers})) {
return
1;
}
return
$vars
{appendOthers}
}
sub
getPreferred{
my
$self
=
$_
[0];
my
$module
=
$_
[1];
if
( !
$self
->errorblank ){
return
undef
;
}
if
(!
defined
(
$module
)) {
$self
->{errorString}=
'No module specified'
;
$self
->{error}=2;
$self
->
warn
;
return
undef
;
}
my
$module2
=
$module
;
$module2
=~s/\:\:/\//g;
my
%vars
=
$self
->{zconf}->regexVarGet(
'gui'
,
'^modules/'
.
quotemeta
(
$module2
).
'$'
);
if
(
$self
->{zconf}->error){
$self
->{error}=1;
$self
->{errorString}=
'ZConf error listing sets for the config "gui".'
.
' ZConf error="'
.
$self
->{zconf}->error.
'" '
.
'ZConf error string="'
.
$self
->{zconf}->errorString.
'"'
;
$self
->
warn
;
return
undef
;
}
if
(!
defined
(
$vars
{
'modules/'
.
$module2
})) {
%vars
=
$self
->{zconf}->regexVarGet(
'gui'
,
'^default$'
);
if
(
$self
->{zconf}->error){
$self
->{error}=1;
$self
->{errorString}=
'ZConf error listing sets for the config "gui".'
.
' ZConf error="'
.
$self
->{zconf}->error.
'" '
.
'ZConf error string="'
.
$self
->{zconf}->errorString.
'"'
;
$self
->
warn
;
return
undef
;
}
if
(!
defined
(
$vars
{
default
})) {
$self
->{error}=5;
$self
->{errorString}=
'No preferences for "'
.
$module
.
'" and there is no default'
;
$self
->
warn
;
return
undef
;
}
return
split
(/:/,
$vars
{
default
});
}
return
split
(/:/,
$vars
{
'modules/'
.
$module2
});
}
sub
getSet{
my
$self
=
$_
[0];
if
( !
$self
->errorblank ){
return
undef
;
}
my
$set
=
$self
->{zconf}->getSet(
'gui'
);
if
(
$self
->{zconf}->error){
$self
->{error}=1;
$self
->{errorString}=
'ZConf error getting the loaded set the config "gui".'
.
' ZConf error="'
.
$self
->{zconf}->error.
'" '
.
'ZConf error string="'
.
$self
->{zconf}->errorString.
'"'
;
$self
->
warn
;
return
undef
;
}
return
$set
;
}
sub
getUseX{
my
$self
=
$_
[0];
my
$module
=
$_
[1];
if
( !
$self
->errorblank ){
return
undef
;
}
if
(!
defined
(
$module
)) {
$self
->{error}=2;
$self
->{errorString}=
'No module specified'
;
$self
->
warn
;
return
undef
;
}
my
$module2
=
$module
;
$module2
=~s/\:\:/\//g;
my
%vars
=
$self
->{zconf}->regexVarGet(
'gui'
,
'^useX/'
.
quotemeta
(
$module2
).
'$'
);
if
(
$self
->{zconf}->error){
$self
->{error}=1;
$self
->{errorString}=
'ZConf error listing sets for the config "gui".'
.
' ZConf error="'
.
$self
->{zconf}->error.
'" '
.
'ZConf error string="'
.
$self
->{zconf}->errorString.
'"'
;
$self
->
warn
;
return
undef
;
}
if
(!
defined
(
$vars
{
'modules/'
.
$module2
})) {
return
1;
}
return
$vars
{
'modules/'
.
$module2
};
}
sub
hasPreferred{
my
$self
=
$_
[0];
my
$module
=
$_
[1];
if
( !
$self
->errorblank ){
return
undef
;
}
if
(!
defined
(
$module
)) {
$self
->{error}=2;
$self
->{errorString}=
'No module specified'
;
$self
->
warn
;
return
undef
;
}
my
%vars
=
$self
->{zconf}->regexVarGet(
'gui'
,
'^modules/'
.
quotemeta
(
$module
).
'$'
);
if
(
$self
->{zconf}->error ){
$self
->{error}=1;
$self
->{errorString}=
'ZConf error listing sets for the config "gui".'
.
' ZConf error="'
.
$self
->{zconf}->error.
'" '
.
'ZConf error string="'
.
$self
->{zconf}->errorString.
'"'
;
$self
->
warn
;
return
undef
;
}
if
(!
defined
(
$vars
{
'modules/'
.
$module
})) {
return
undef
;
}
return
1;
}
sub
init{
my
$self
=
$_
[0];
my
$set
=
$_
[1];
if
( !
$self
->errorblank ){
return
undef
;
}
my
$returned
=
$self
->{zconf}->configExists(
"gui"
);
if
(
$self
->{zconf}->error){
$self
->{error}=1;
$self
->{errorString}=
"Could not check if the config 'gui' exists."
.
" It failed with '"
.
$self
->{zconf}->error.
"', '"
.
$self
->{zconf}->errorString.
"'"
;
$self
->
warn
;
return
undef
;
}
if
(!
$returned
) {
$self
->{zconf}->createConfig(
"gui"
);
if
(
$self
->{zconf}->{error}) {
$self
->{error}=1;
$self
->{errorString}=
"Could not create the ZConf config 'gui'."
.
" It failed with '"
.
$self
->{zconf}->error.
"', '"
.
$self
->{zconf}->errorString.
"'"
;
$self
->
warn
;
return
undef
;
}
}
$self
->{zconf}->writeSetFromHash({
config
=>
"gui"
,
set
=>
$set
},
{
default
=>
"GTK:Curses"
,
appendOthers
=>
'1'
,
}
);
if
(
$self
->{zconf}->error ) {
$self
->{error}=1;
$self
->{errorString}=
"writeSetFromHash failed."
.
" It failed with '"
.
$self
->{zconf}->error.
"', '"
.
$self
->{zconf}->errorString.
"'"
;
$self
->
warn
;
return
undef
;
}
$self
->{zconf}->
read
({
config
=>
'gui'
,
set
=>
$set
});
if
(
$self
->{zconf}->error ) {
$self
->{error}=1;
$self
->{errorString}=
"read failed."
.
" It failed with '"
.
$self
->{zconf}->error.
"', '"
.
$self
->{zconf}->errorString.
"'"
;
$self
->
warn
;
return
undef
;
}
return
1;
}
sub
listAvailable{
my
$self
=
$_
[0];
my
$module
=
$_
[1];
if
( !
$self
->errorblank ){
return
undef
;
}
if
(!
defined
(
$module
)) {
$self
->{error}=2;
$self
->{errorString}=
'No module specified'
;
$self
->
warn
;
return
undef
;
}
my
$check
=
$module
.
'::GUI::'
;
my
$modules
=list_modules(
$check
,{
list_modules
=> 1});
if
( !
defined
(
$modules
) ) {
$self
->{error}=6;
$self
->{errorString}=
'list_modules failed'
;
$self
->
warn
;
return
undef
;
}
my
@mods
=
keys
(%{
$modules
});
my
$int
=0;
while
(
$mods
[
$int
]) {
$mods
[
$int
]=~s/^
$check
//;
$int
++;
}
return
@mods
;
}
sub
listModules{
my
$self
=
$_
[0];
if
( !
$self
->errorblank ){
return
undef
;
}
my
@modules
=
$self
->{zconf}->regexVarSearch(
'gui'
,
'^modules'
);
if
(
$self
->{zconf}->error ) {
$self
->{error}=1;
$self
->{errorString}=
"regexVarSearch failed."
.
" It failed with '"
.
$self
->{zconf}->error.
"', '"
.
$self
->{zconf}->errorString.
"'"
;
$self
->
warn
;
return
undef
;
}
my
$int
=0;
while
(
defined
(
$modules
[
$int
])) {
$modules
[
$int
]=~s/^modules\///;
$modules
[
$int
]=~s/\//\:\:/g;
$int
++;
}
return
@modules
;
}
sub
listSets{
my
$self
=
$_
[0];
if
( !
$self
->errorblank ){
return
undef
;
}
my
@sets
=
$self
->{zconf}->getAvailableSets(
'gui'
);
if
(
$self
->{zconf}->error){
$self
->{error}=1;
$self
->{errorString}=
'ZConf error listing sets for the config "gui".'
.
' ZConf error="'
.
$self
->{zconf}->error.
'" '
.
'ZConf error string="'
.
$self
->{zconf}->errorString.
'"'
;
$self
->
warn
;
return
undef
;
}
return
@sets
;
}
sub
readSet{
my
$self
=
$_
[0];
my
$set
=
$_
[1];
if
( !
$self
->errorblank ){
return
undef
;
}
$self
->{zconf}->
read
({
config
=>
'gui'
,
set
=>
$set
});
if
(
$self
->{zconf}->error ) {
$self
->{error}=1;
$self
->{errorString}=
'ZConf error reading the config "gui".'
.
' ZConf error="'
.
$self
->{zconf}->error.
'" '
.
'ZConf error string="'
.
$self
->{zconf}->errorString.
'"'
;
$self
->
warn
;
return
undef
;
}
return
1;
}
sub
rmPreferred{
my
$self
=
$_
[0];
my
$module
=
$_
[1];
if
( !
$self
->errorblank ){
return
undef
;
}
if
(!
defined
(
$module
)) {
$self
->{errorString}=
'No module specified'
;
$self
->{error}=2;
$self
->
warn
;
return
undef
;
}
my
$safemodule
=
quotemeta
(
$module
);
my
@deleted
=
$self
->{zconf}->regexVarDel(
'gui'
,
'^modules/'
.
$safemodule
.
'$'
);
if
(
$self
->{zconf}->error ) {
$self
->{error}=1;
$self
->{errorString}=
'ZConf error reading the config "gui".'
.
' ZConf error="'
.
$self
->{zconf}->error.
'" '
.
'ZConf error string="'
.
$self
->{zconf}->errorString.
'"'
;
$self
->
warn
;
return
undef
;
}
if
(
$deleted
[0] ne
'modules/'
.
$module
) {
$self
->{errorString}=
'"'
.
$module
.
' not matched"'
;
$self
->{error}=7;
$self
->
warn
;
return
undef
;
}
return
1;
}
sub
setAppendOthers{
my
$self
=
$_
[0];
my
$boolean
=
$_
[1];
if
( !
$self
->errorblank ){
return
undef
;
}
if
(!
defined
(
$boolean
)) {
$self
->{error}=8;
$self
->{errorString}=
'No value specified to set "appendOthers" to'
;
$self
->
warn
;
return
undef
;
}
if
(
$boolean
!~ /^[01]$/) {
$self
->{error}=9;
$self
->{errorString}=
'The value "'
.
$boolean
.
'" does not match /^[01]$/'
;
$self
->
warn
;
return
undef
;
}
$self
->{zconf}->setVar(
'gui'
,
'appendOther'
);
if
(
$self
->{zconf}->error){
$self
->{error}=1;
$self
->{errorString}=
'ZConf error setting "appendOthers" for "gui".'
.
' ZConf error="'
.
$self
->{zconf}->error.
'" '
.
'ZConf error string="'
.
$self
->{zconf}->errorString.
'"'
;
$self
->
warn
;
return
undef
;
}
$self
->{zconf}->writeSetFromLoadedConfig({
config
=>
'gui'
});
if
(
$self
->{zconf}->error){
$self
->{error}=1;
$self
->{errorString}=
'ZConf error saving config "gui".'
.
' ZConf error="'
.
$self
->{zconf}->error.
'" '
.
'ZConf error string="'
.
$self
->{zconf}->errorString.
'"'
;
$self
->
warn
;
return
undef
;
}
return
1;
}
sub
setPreferred{
my
$self
=
$_
[0];
my
$module
=
$_
[1];
my
$prefs
;
if
(
defined
(
$_
[2])) {
$prefs
=
$_
[2];
}
if
( !
$self
->errorblank ){
return
undef
;
}
if
(!
defined
(
$module
)) {
$self
->{error}=2;
$self
->{errorString}=
'No module specified'
;
$self
->
warn
;
return
undef
;
}
if
(!
defined
(@{
$prefs
}[0])) {
$self
->{error}=3;
$self
->{errorString}=
'No prefs specified'
;
$self
->
warn
;
return
undef
;
}
my
$int
=0;
while
(
defined
(@{
$prefs
}[
$int
])){
if
(@{
$prefs
}[
$int
] =~ /:/) {
$self
->{error}=4;
$self
->{errorString}=
'"'
.@{
$prefs
}[
$int
].
'" matched /:/'
;
$self
->
warn
;
return
undef
;
}
$int
++;
}
$module
=~s/::/\//g;
my
$joinedprefs
=
join
(
':'
, @{
$prefs
});
$self
->{zconf}->setVar(
'gui'
,
'modules/'
.
$module
,
$joinedprefs
);
if
(
$self
->{zconf}->error){
$self
->{error}=1;
$self
->{errorString}=
'ZConf error listing sets for the config "gui".'
.
' ZConf error="'
.
$self
->{zconf}->error.
'" '
.
'ZConf error string="'
.
$self
->{zconf}->errorString.
'"'
;
$self
->
warn
;
return
undef
;
}
$self
->{zconf}->writeSetFromLoadedConfig({
config
=>
'gui'
});
if
(
$self
->{zconf}->error){
$self
->{error}=1;
$self
->{errorString}=
'ZConf error saving config "gui".'
.
' ZConf error="'
.
$self
->{zconf}->error.
'" '
.
'ZConf error string="'
.
$self
->{zconf}->errorString.
'"'
;
$self
->
warn
;
return
undef
;
}
return
1;
}
sub
setUseX{
my
$self
=
$_
[0];
my
$module
=
$_
[1];
my
$useX
=
$_
[2];
if
( !
$self
->errorblank ){
return
undef
;
}
if
(!
defined
(
$module
)) {
$self
->{error}=2;
$self
->{errorString}=
'No module specified'
;
$self
->
warn
;
return
undef
;
}
if
(!
defined
(
$useX
)) {
$self
->{error}=3;
$self
->{errorString}=
'No prefs specified'
;
$self
->
warn
;
return
undef
;
}
$module
=~s/::/\//g;
$self
->{zconf}->setVar(
'gui'
,
'useX/'
.
$module
,
$useX
);
if
(
$self
->{zconf}->{error}){
$self
->{error}=1;
$self
->{errorString}=
'ZConf error listing sets for the config "gui".'
.
' ZConf error="'
.
$self
->{zconf}->error.
'" '
.
'ZConf error string="'
.
$self
->{zconf}->errorString.
'"'
;
$self
->
warn
;
return
undef
;
}
$self
->{zconf}->writeSetFromLoadedConfig({
config
=>
'gui'
});
return
1;
}
sub
termAvailable{
my
$self
=
$_
[0];
if
( !
$self
->errorblank ){
return
undef
;
}
if
(!
defined
(
$ENV
{TERM})) {
return
undef
;
}
return
1;
}
sub
Xavailable{
my
$self
=
$_
[0];
if
( !
$self
->errorblank ){
return
undef
;
}
if
(!
defined
(
$ENV
{DISPLAY})) {
return
undef
;
}
my
$command
=
'/bin/sh -c \'xhost 2> /dev/null > /dev/null\''
;
system
(
$command
);
my
$exitcode
=$? >> 8;
if
(
$exitcode
ne
'0'
){
return
undef
;
}
return
1;
}
sub
useX{
my
$self
=
$_
[0];
my
$module
=
$_
[1];
if
( !
$self
->errorblank ){
return
undef
;
}
if
(!
defined
(
$module
)) {
$self
->{error}=2;
$self
->{errorString}=
'No module specified'
;
$self
->
warn
;
return
undef
;
}
my
$useX
=
$self
->getUseX(
$module
);
if
(
$useX
) {
return
$self
->Xavailable;
}
return
undef
;
}
sub
which{
my
$self
=
$_
[0];
my
$module
=
$_
[1];
if
( !
$self
->errorblank ){
return
undef
;
}
if
(!
defined
(
$module
)) {
$self
->{error}=2;
$self
->{errorString}=
'No module specified'
;
$self
->
warn
;
return
undef
;
}
my
@prefs
=
$self
->getPreferred(
$module
);
my
$Xavailable
=
$self
->Xavailable();
my
$termAvailable
=
$self
->termAvailable();
my
@available
=
$self
->listAvailable(
$module
);
my
@usable
;
my
@preferred
=
$self
->getPreferred(
$module
);
my
$int
=0;
while
(
defined
(
$preferred
[
$int
])) {
my
$aint
=0;
my
$matched
=0;
while
((
defined
(
$available
[
$aint
])) && (!
$matched
)) {
if
(
$preferred
[
$int
] eq
$available
[
$aint
]) {
if
(
$Xavailable
) {
push
(
@usable
,
$preferred
[
$int
]);
$matched
=1;
}
else
{
if
(
$preferred
[
$int
]=~/^Term/) {
push
(
@usable
,
$preferred
[
$int
]);
}
if
(
$preferred
[
$int
]=~/^Curses/) {
push
(
@usable
,
$preferred
[
$int
]);
}
$matched
=1;
}
$aint
++;
}
$aint
++;
}
$int
++;
}
my
$ao
=
$self
->getAppendOthers;
if
(
$self
->error) {
$self
->warnString(
'getAppendOthers errored'
);
return
undef
;
}
if
(!
$ao
) {
return
@usable
;
}
$int
=0;
while
(
defined
(
$available
[
$int
])) {
my
$matched
=0;
my
$int2
=0;
while
(
$usable
[
$int2
]) {
if
(
$usable
[
$int2
] eq
$available
[
$int
]) {
$matched
=1;
}
$int2
++;
}
if
(!
$matched
) {
push
(
@usable
,
$available
[
$int
]);
}
$int
++;
}
return
@usable
;
}
1;