From 382c6e728da5624fbe5b3ec1ec6ce0a6faaa836e Mon Sep 17 00:00:00 2001
From: Alexander Mueller <alexander.mueller@hs.uni-hamburg.de>
Date: Tue, 18 Nov 2003 11:24:47 +0000
Subject: [PATCH] %[ER: 34]%

---
 .gitattributes                               |   1 -
 MAC/GCF/_CoreComps/PA/src/GPA_Controller.cc  |  14 +-
 MAC/GCF/_CoreComps/PA/src/GPA_Controller.h   |   2 -
 MAC/GCF/_CoreComps/PA/src/GPA_Main.cc        |   1 -
 MAC/GCF/_CoreComps/PA/src/Makefile.am        |   3 +-
 MAC/GCF/_CoreComps/PA/src/apc1.xml           |  16 --
 MAC/GCF/_CoreComps/PML/Makefile              |  45 -----
 MAC/GCF/_CoreComps/SAL/src/GCF_PVChar.cc     |  44 +++++
 MAC/GCF/_CoreComps/SAL/src/GCF_PVChar.h      |  47 +++++
 MAC/GCF/_CoreComps/SAL/src/GCF_PVDynArr.cc   |  83 ++++++++
 MAC/GCF/_CoreComps/SAL/src/GCF_PVDynArr.h    |  53 +++++
 MAC/GCF/_CoreComps/SAL/src/GCF_PVInteger.cc  |  44 +++++
 MAC/GCF/_CoreComps/SAL/src/GCF_PVInteger.h   |  46 +++++
 MAC/GCF/_CoreComps/SAL/src/GCF_PVString.cc   |  44 +++++
 MAC/GCF/_CoreComps/SAL/src/GCF_PVString.h    |  46 +++++
 MAC/GCF/_CoreComps/SAL/src/GCF_PVUnsigned.cc |  44 +++++
 MAC/GCF/_CoreComps/SAL/src/GCF_PVUnsigned.h  |  46 +++++
 MAC/GCF/_CoreComps/SAL/src/GSA_Service.cc    | 198 ++++++++++++++++---
 MAC/GCF/_CoreComps/SAL/src/Makefile.am       |  12 +-
 MAC/GCF/_CoreComps/SAL/test/Makefile.am      |   3 +-
 MAC/GCF/_CoreComps/TM/test/Makefile.am       |   3 +-
 21 files changed, 684 insertions(+), 111 deletions(-)
 delete mode 100644 MAC/GCF/_CoreComps/PA/src/apc1.xml
 delete mode 100644 MAC/GCF/_CoreComps/PML/Makefile
 create mode 100644 MAC/GCF/_CoreComps/SAL/src/GCF_PVChar.cc
 create mode 100644 MAC/GCF/_CoreComps/SAL/src/GCF_PVChar.h
 create mode 100644 MAC/GCF/_CoreComps/SAL/src/GCF_PVDynArr.cc
 create mode 100644 MAC/GCF/_CoreComps/SAL/src/GCF_PVDynArr.h
 create mode 100644 MAC/GCF/_CoreComps/SAL/src/GCF_PVInteger.cc
 create mode 100644 MAC/GCF/_CoreComps/SAL/src/GCF_PVInteger.h
 create mode 100644 MAC/GCF/_CoreComps/SAL/src/GCF_PVString.cc
 create mode 100644 MAC/GCF/_CoreComps/SAL/src/GCF_PVString.h
 create mode 100644 MAC/GCF/_CoreComps/SAL/src/GCF_PVUnsigned.cc
 create mode 100644 MAC/GCF/_CoreComps/SAL/src/GCF_PVUnsigned.h

diff --git a/.gitattributes b/.gitattributes
index ca4fdafad9a..f8bbda663ad 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -141,7 +141,6 @@ MAC/GCF/_CoreComps/PA/Makefile.am -text svneol=native#application/octet-stream
 MAC/GCF/_CoreComps/PA/configure.in -text svneol=native#application/octet-stream
 MAC/GCF/_CoreComps/PA/src/Makefile.am -text svneol=native#application/octet-stream
 MAC/GCF/_CoreComps/PA/src/PA_Protocol.prot -text svneol=native#application/octet-stream
-MAC/GCF/_CoreComps/PML/Makefile -text svneol=native#application/octet-stream
 MAC/GCF/_CoreComps/PML/Makefile.am -text svneol=native#application/octet-stream
 MAC/GCF/_CoreComps/PML/configure.in -text svneol=native#application/octet-stream
 MAC/GCF/_CoreComps/PML/src/Makefile.am -text svneol=native#application/octet-stream
diff --git a/MAC/GCF/_CoreComps/PA/src/GPA_Controller.cc b/MAC/GCF/_CoreComps/PA/src/GPA_Controller.cc
index d99ce659652..df24d3095a2 100644
--- a/MAC/GCF/_CoreComps/PA/src/GPA_Controller.cc
+++ b/MAC/GCF/_CoreComps/PA/src/GPA_Controller.cc
@@ -305,12 +305,10 @@ void GPAController::apcLoaded(TPAResult result)
   {
     result = _usecountManager.setDefaults(*propsFromAPC);
   } 
-#ifdef PML
   GCFEvent* pEvent = _requestManager.getOldestRequest();
   PALoadapcEvent* pLoadapcE = static_cast<PALoadapcEvent*> (pEvent);
   PAApcloadedEvent e(pLoadapcE->seqnr, result);
   sendAPCActionResponse(e);
-#endif
 }  
 
 void GPAController::unloadAPC(char* actionData)
@@ -428,14 +426,4 @@ void GPAController::unpackAPCActionData(char* pActionData)
   unsigned int scopeNameLength(0);
   sscanf(pScopeData, "%03x", &scopeNameLength);
   _curScope.assign(pScopeData + 3, scopeNameLength);
-}
-
-void GPAController::loadAPCTest()
-{
-  const list<TAPCProperty>* propsFromAPC;
-  _apc.load("/home/mueller/workspace/LOFAR/MAC/GCF/CoreComps/PA/src/apc1.xml", "receptor1");
-  propsFromAPC = &_apc.getProperties();
-  TPAResult result = _usecountManager.incrementUsecount(*propsFromAPC);
-  if (!_usecountManager.waitForAsyncResponses())
-    result = _usecountManager.setDefaults(*propsFromAPC);
-}
+}
\ No newline at end of file
diff --git a/MAC/GCF/_CoreComps/PA/src/GPA_Controller.h b/MAC/GCF/_CoreComps/PA/src/GPA_Controller.h
index 87feb72da3b..d4408860562 100644
--- a/MAC/GCF/_CoreComps/PA/src/GPA_Controller.h
+++ b/MAC/GCF/_CoreComps/PA/src/GPA_Controller.h
@@ -41,8 +41,6 @@ class GPAController : public GCFTask
 		GPAController();
 		virtual ~GPAController();
   
-    void loadAPCTest();
-
 	private: // GPAUsecountManager call back methods
     friend class GPAUsecountManager;
 		void propertiesCreated(list<string>& propList);
diff --git a/MAC/GCF/_CoreComps/PA/src/GPA_Main.cc b/MAC/GCF/_CoreComps/PA/src/GPA_Main.cc
index 83211780bdf..311620594d7 100644
--- a/MAC/GCF/_CoreComps/PA/src/GPA_Main.cc
+++ b/MAC/GCF/_CoreComps/PA/src/GPA_Main.cc
@@ -29,7 +29,6 @@ int main(int argC, char *argV[])
   
   GPAController propertyAgent; 
   
-  propertyAgent.loadAPCTest(); 
   propertyAgent.start(); // make initial transition
   
   GCFTask::run();
diff --git a/MAC/GCF/_CoreComps/PA/src/Makefile.am b/MAC/GCF/_CoreComps/PA/src/Makefile.am
index 760454467be..022629d1d1b 100644
--- a/MAC/GCF/_CoreComps/PA/src/Makefile.am
+++ b/MAC/GCF/_CoreComps/PA/src/Makefile.am
@@ -1,7 +1,8 @@
 AUTOGEN = autogen
 SUFFIXES = .ph
 %.ph: %.prot
-	$(AUTOGEN) -L $(top_srcdir)/../../GCFCommon/autogen $<
+	$(AUTOGEN) -L $(top_srcdir)/../../GCFCommon/autogen $< && \
+	chmod a+w $@
 
 DOCHDRS	=	\
 	GPA_Controller.h \
diff --git a/MAC/GCF/_CoreComps/PA/src/apc1.xml b/MAC/GCF/_CoreComps/PA/src/apc1.xml
deleted file mode 100644
index cad1c870056..00000000000
--- a/MAC/GCF/_CoreComps/PA/src/apc1.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0"?>
-
-<receptor>
-  <status>
-    <MACDefault> true </MACDefault>
-    <MACType> BOOL_VAL </MACType>
-  </status>
-  <gain>
-    <MACType> FLOAT_VAL </MACType>
-    <MACDefault> -1.3 </MACDefault>
-  </gain>
-  <sn>
-    <MACType> FLOAT_VAL </MACType>
-    <MACDefault> 8432083.434345 </MACDefault>
-  </sn>
-</receptor>
diff --git a/MAC/GCF/_CoreComps/PML/Makefile b/MAC/GCF/_CoreComps/PML/Makefile
deleted file mode 100644
index 27146348789..00000000000
--- a/MAC/GCF/_CoreComps/PML/Makefile
+++ /dev/null
@@ -1,45 +0,0 @@
-lof_subdir = $(shell pwd | sed -e "s%[a-zA-Z0-9/.\-_]*LOFAR/%%g")
-back_dir = $(shell echo $(lof_subdir) | sed -e "s%/[^/]\+%/..%g" -e "s%^[^/]\+%..%")
-
-all:
-	cd ./build/gnu_debug && make && echo done
-
-all_opt:
-	cd ./build/gnu_opt && make && echo done
-
-all_dopt:
-	cd ./build/gnu_dopt && make && echo done
-
-check:
-	cd ./build/gnu_debug && make check && echo done
-
-aids:
-	cd ./build/gnu_debug && make aids && echo done
-
-clean:
-	cd ./build/gnu_debug && make clean && echo done
-
-distcd:
-	cd ./build/gnu_debug && make distclean && echo done
-
-.PHONY: config configure bootstrap
-
-bootstrap:
-	./cleanup && \
-	test -f bootstrap || (sed '$(back_dir)/bootstrap' -e "s%autoconf%$(back_dir)/autoconf%g" > bootstrap && chmod a+x bootstrap ) && \
-	test -d build || (mkdir build && mkdir build/gnu_debug) && \
-	./bootstrap && cd build/gnu_debug && export CC=gcc296 CXX=g++296 && ../../lofarconf && echo done
-
-configure:
-	test -d build || (mkdir build && mkdir build/gnu_debug) && \
-	cd build/gnu_debug && export CC=gcc296 CXX=g++296 && ../../lofarconf && echo done
-
-configure_opt:
-	test -f bootstrap || (sed '$(back_dir)/bootstrap' -e "s%autoconf%$(back_dir)/autoconf%g" > bootstrap && chmod a+x bootstrap ) && \
-	test -d build || (mkdir build && mkdir build/gnu_opt) && \
-	./bootstrap && cd build/gnu_opt && ../../lofarconf && echo done
-
-configure_dopt:
-	test -f bootstrap || (sed '$(back_dir)/bootstrap' -e "s%autoconf%$(back_dir)/autoconf%g" > bootstrap && chmod a+x bootstrap ) && \
-	test -d build || (mkdir build && mkdir build/gnu_dopt) && \
-	./bootstrap && cd build/gnu_dopt && ../../lofarconf && echo done
diff --git a/MAC/GCF/_CoreComps/SAL/src/GCF_PVChar.cc b/MAC/GCF/_CoreComps/SAL/src/GCF_PVChar.cc
new file mode 100644
index 00000000000..b3e3cfb1bb8
--- /dev/null
+++ b/MAC/GCF/_CoreComps/SAL/src/GCF_PVChar.cc
@@ -0,0 +1,44 @@
+//#  GCF_PVChar.cc: 
+//#
+//#  Copyright (C) 2002-2003
+//#  ASTRON (Netherlands Foundation for Research in Astronomy)
+//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//#  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 of the License, 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 this program; if not, write to the Free Software
+//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//#  $Id$
+
+
+#include "GCF_PVChar.h"
+
+/** No descriptions */
+GCFPValue* GCFPVChar::clone() const
+{
+  GCFPValue* pNewValue = new GCFPVChar(_value);
+  return pNewValue;
+}
+
+/** No descriptions */
+TSAResult GCFPVChar::copy(const GCFPValue& newVal)
+{
+  TSAResult result(SA_NO_ERROR);
+
+  if (newVal.getType() == getType())
+    _value = ((GCFPVChar *)&newVal)->getValue();
+  else
+    result = SA_DIFFERENT_TYPES;
+  
+  return result;
+}
diff --git a/MAC/GCF/_CoreComps/SAL/src/GCF_PVChar.h b/MAC/GCF/_CoreComps/SAL/src/GCF_PVChar.h
new file mode 100644
index 00000000000..a558c3a76e6
--- /dev/null
+++ b/MAC/GCF/_CoreComps/SAL/src/GCF_PVChar.h
@@ -0,0 +1,47 @@
+//#  GCF_PVChar.h: 
+//#
+//#  Copyright (C) 2002-2003
+//#  ASTRON (Netherlands Foundation for Research in Astronomy)
+//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//#  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 of the License, 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 this program; if not, write to the Free Software
+//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//#  $Id$
+
+#ifndef GCF_PVCHAR_H
+#define GCF_PVCHAR_H
+
+#include "GCF_PValue.h"
+
+class GCFPVChar : public GCFPValue  
+{
+  public:
+  	GCFPVChar(char val = 0) : GCFPValue(CHAR_VAL), _value(val) {;}
+  	virtual ~GCFPVChar() {;}
+    /** Write property of char value. */
+    inline void setValue( const char newVal) {_value = newVal;}
+    /** Read property of char value. */
+    inline char getValue() const {return _value;}
+    /** No descriptions */
+    virtual GCFPValue* clone() const;
+    /** No descriptions */
+    virtual TSAResult copy(const GCFPValue& value);
+  
+  private: // Private attributes
+    /**  */
+    char _value;
+};
+
+#endif
diff --git a/MAC/GCF/_CoreComps/SAL/src/GCF_PVDynArr.cc b/MAC/GCF/_CoreComps/SAL/src/GCF_PVDynArr.cc
new file mode 100644
index 00000000000..6880574ce5a
--- /dev/null
+++ b/MAC/GCF/_CoreComps/SAL/src/GCF_PVDynArr.cc
@@ -0,0 +1,83 @@
+//#  GCF_PVDynArr.cc: 
+//#
+//#  Copyright (C) 2002-2003
+//#  ASTRON (Netherlands Foundation for Research in Astronomy)
+//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//#  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 of the License, 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 this program; if not, write to the Free Software
+//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//#  $Id$
+
+
+#include "GCF_PVDynArr.h"
+
+GCFPVDynArr::GCFPVDynArr(TMACValueType itemType, const GCFPValueArray& val) :
+  GCFPValue((TMACValueType) (DYNARR_VAL | itemType))
+{
+  assert(itemType != DYNARR_VAL);
+  setValue(val);
+}
+
+GCFPVDynArr::GCFPVDynArr(TMACValueType itemType) :
+  GCFPValue((TMACValueType) (DYNARR_VAL | itemType))
+{
+  assert(itemType != DYNARR_VAL);
+}
+
+GCFPVDynArr::~GCFPVDynArr()
+{
+  cleanup();
+}
+
+void GCFPVDynArr::setValue(const GCFPValueArray& newVal)
+{
+  cleanup();
+  for (GCFPValueArray::const_iterator iter = newVal.begin();
+       iter != newVal.end(); ++iter)
+  {
+    if ((*iter)->getType() == (getType() & ~DYNARR_VAL))
+      _values.push_back((*iter)->clone());
+  }
+}
+
+/** No descriptions */
+GCFPValue* GCFPVDynArr::clone() const
+{
+  GCFPValue* pNewValue = new GCFPVDynArr(getType(), _values);
+  return pNewValue;
+}
+
+/** No descriptions */
+TSAResult GCFPVDynArr::copy(const GCFPValue& newVal)
+{
+  TSAResult result(SA_NO_ERROR);
+
+  if (newVal.getType() == getType())
+    setValue(((GCFPVDynArr*)&newVal)->getValue());
+  else
+    result = SA_DIFFERENT_TYPES;
+  
+  return result;
+}
+
+void GCFPVDynArr::cleanup()
+{
+  for (GCFPValueArray::iterator iter = _values.begin();
+       iter != _values.end(); ++iter)
+  {
+    delete *iter;  
+  }
+  _values.clear();
+}
diff --git a/MAC/GCF/_CoreComps/SAL/src/GCF_PVDynArr.h b/MAC/GCF/_CoreComps/SAL/src/GCF_PVDynArr.h
new file mode 100644
index 00000000000..bf5438fd4d2
--- /dev/null
+++ b/MAC/GCF/_CoreComps/SAL/src/GCF_PVDynArr.h
@@ -0,0 +1,53 @@
+//#  GCF_PVDynArr.h: 
+//#
+//#  Copyright (C) 2002-2003
+//#  ASTRON (Netherlands Foundation for Research in Astronomy)
+//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//#  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 of the License, 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 this program; if not, write to the Free Software
+//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//#  $Id$
+
+#ifndef GCF_PVDYNARR_H
+#define GCF_PVDYNARR_H
+
+#include "GCF_PValue.h"
+#include <Common/lofar_vector.h>
+
+typedef vector<GCFPValue*> GCFPValueArray;
+
+class GCFPVDynArr : public GCFPValue
+{
+  public:
+  	GCFPVDynArr(TMACValueType itemType, const GCFPValueArray& val);
+    GCFPVDynArr(TMACValueType itemType);
+  	virtual ~GCFPVDynArr();
+    /** Write property of list value_. */
+    virtual void setValue(const GCFPValueArray& newVal);
+    /** Read property of list value_. */
+    virtual inline const GCFPValueArray& getValue() const {return _values;}
+    /** No descriptions */
+    virtual GCFPValue* clone() const;
+    /** No descriptions */
+    virtual TSAResult copy(const GCFPValue& value);
+  
+  private: // help members
+    void cleanup();
+    
+  private: // Private attributes
+    /**  */
+    GCFPValueArray _values;
+};
+#endif
diff --git a/MAC/GCF/_CoreComps/SAL/src/GCF_PVInteger.cc b/MAC/GCF/_CoreComps/SAL/src/GCF_PVInteger.cc
new file mode 100644
index 00000000000..b33d6561b11
--- /dev/null
+++ b/MAC/GCF/_CoreComps/SAL/src/GCF_PVInteger.cc
@@ -0,0 +1,44 @@
+//#  GCF_PVInteger.cc: 
+//#
+//#  Copyright (C) 2002-2003
+//#  ASTRON (Netherlands Foundation for Research in Astronomy)
+//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//#  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 of the License, 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 this program; if not, write to the Free Software
+//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//#  $Id$
+
+
+#include "GCF_PVInteger.h"
+
+/** No descriptions */
+GCFPValue* GCFPVInteger::clone() const
+{
+  GCFPValue* pNewValue = new GCFPVInteger(_value);
+  return pNewValue;
+}
+
+/** No descriptions */
+TSAResult GCFPVInteger::copy(const GCFPValue& newVal)
+{
+  TSAResult result(SA_NO_ERROR);
+
+  if (newVal.getType() == getType())
+    _value = ((GCFPVInteger *)&newVal)->getValue();
+  else
+    result = SA_DIFFERENT_TYPES;
+  
+  return result;
+}
diff --git a/MAC/GCF/_CoreComps/SAL/src/GCF_PVInteger.h b/MAC/GCF/_CoreComps/SAL/src/GCF_PVInteger.h
new file mode 100644
index 00000000000..0d8759592bc
--- /dev/null
+++ b/MAC/GCF/_CoreComps/SAL/src/GCF_PVInteger.h
@@ -0,0 +1,46 @@
+//#  GCF_PVInteger.h: 
+//#
+//#  Copyright (C) 2002-2003
+//#  ASTRON (Netherlands Foundation for Research in Astronomy)
+//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//#  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 of the License, 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 this program; if not, write to the Free Software
+//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//#  $Id$
+
+#ifndef GCF_PVINTEGER_H
+#define GCF_PVINTEGER_H
+
+#include "GCF_PValue.h"
+
+class GCFPVInteger : public GCFPValue
+{
+  public:
+  	GCFPVInteger(int val = 0) : GCFPValue(INTEGER_VAL), _value(val) {;}
+  	virtual ~GCFPVInteger() {;}
+    /** Write property of integer value_. */
+    virtual inline void setValue( const int newVal) {_value = newVal;}
+    /** Read property of integer value_. */
+    virtual inline int getValue() const {return _value;}
+    /** No descriptions */
+    virtual GCFPValue* clone() const;
+    /** No descriptions */
+    virtual TSAResult copy(const GCFPValue& value);
+ 
+  private: // Private attributes
+    /**  */
+    int _value;
+};
+#endif
diff --git a/MAC/GCF/_CoreComps/SAL/src/GCF_PVString.cc b/MAC/GCF/_CoreComps/SAL/src/GCF_PVString.cc
new file mode 100644
index 00000000000..a789dd63194
--- /dev/null
+++ b/MAC/GCF/_CoreComps/SAL/src/GCF_PVString.cc
@@ -0,0 +1,44 @@
+//#  GCF_PVString.cc: 
+//#
+//#  Copyright (C) 2002-2003
+//#  ASTRON (Netherlands Foundation for Research in Astronomy)
+//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//#  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 of the License, 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 this program; if not, write to the Free Software
+//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//#  $Id$
+
+
+#include "GCF_PVString.h"
+
+/** No descriptions */
+GCFPValue* GCFPVString::clone() const
+{
+  GCFPValue* pNewValue = new GCFPVString(_value);
+  return pNewValue;
+}
+
+/** No descriptions */
+TSAResult GCFPVString::copy(const GCFPValue& newVal)
+{
+  TSAResult result(SA_NO_ERROR);
+
+  if (newVal.getType() == getType())
+    _value = ((GCFPVString *)&newVal)->getValue();
+  else
+    result = SA_DIFFERENT_TYPES;
+  
+  return result;
+}
diff --git a/MAC/GCF/_CoreComps/SAL/src/GCF_PVString.h b/MAC/GCF/_CoreComps/SAL/src/GCF_PVString.h
new file mode 100644
index 00000000000..c701bcf49e4
--- /dev/null
+++ b/MAC/GCF/_CoreComps/SAL/src/GCF_PVString.h
@@ -0,0 +1,46 @@
+//#  GCF_PVString.h: 
+//#
+//#  Copyright (C) 2002-2003
+//#  ASTRON (Netherlands Foundation for Research in Astronomy)
+//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//#  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 of the License, 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 this program; if not, write to the Free Software
+//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//#  $Id$
+
+#ifndef GCF_PVSTRING_H
+#define GCF_PVSTRING_H
+
+#include "GCF_PValue.h"
+
+class GCFPVString : public GCFPValue
+{
+  public:
+  	GCFPVString(string val = "") : GCFPValue(STRING_VAL), _value(val) {;}
+  	virtual ~GCFPVString() {;}
+    /** Write property of string value. */
+    virtual inline void setValue(const string newVal) {_value = newVal;}
+    /** Read property of string value. */
+    virtual inline const string& getValue() const {return _value;}
+    /** No descriptions */
+    virtual GCFPValue* clone() const;
+    /** No descriptions */
+    virtual TSAResult copy(const GCFPValue& value);
+ 
+  private: // Private attributes
+    /**  */
+    string _value;
+};
+#endif
diff --git a/MAC/GCF/_CoreComps/SAL/src/GCF_PVUnsigned.cc b/MAC/GCF/_CoreComps/SAL/src/GCF_PVUnsigned.cc
new file mode 100644
index 00000000000..0a9f656e3e7
--- /dev/null
+++ b/MAC/GCF/_CoreComps/SAL/src/GCF_PVUnsigned.cc
@@ -0,0 +1,44 @@
+//#  GCF_PVUnsigned.cc: 
+//#
+//#  Copyright (C) 2002-2003
+//#  ASTRON (Netherlands Foundation for Research in Astronomy)
+//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//#  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 of the License, 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 this program; if not, write to the Free Software
+//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//#  $Id$
+
+
+#include "GCF_PVUnsigned.h"
+
+/** No descriptions */
+GCFPValue* GCFPVUnsigned::clone() const
+{
+  GCFPValue* pNewValue = new GCFPVUnsigned(_value);
+  return pNewValue;
+}
+
+/** No descriptions */
+TSAResult GCFPVUnsigned::copy(const GCFPValue& newVal)
+{
+  TSAResult result(SA_NO_ERROR);
+
+  if (newVal.getType() == getType())
+    _value = ((GCFPVUnsigned *)&newVal)->getValue();
+  else
+    result = SA_DIFFERENT_TYPES;
+  
+  return result;
+}
diff --git a/MAC/GCF/_CoreComps/SAL/src/GCF_PVUnsigned.h b/MAC/GCF/_CoreComps/SAL/src/GCF_PVUnsigned.h
new file mode 100644
index 00000000000..eb599f612ab
--- /dev/null
+++ b/MAC/GCF/_CoreComps/SAL/src/GCF_PVUnsigned.h
@@ -0,0 +1,46 @@
+//#  GCF_PVUnsigned.h: 
+//#
+//#  Copyright (C) 2002-2003
+//#  ASTRON (Netherlands Foundation for Research in Astronomy)
+//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//#  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 of the License, 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 this program; if not, write to the Free Software
+//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//#  $Id$
+
+#ifndef GCF_PVUNSIGNED_H
+#define GCF_PVUNSIGNED_H
+
+#include "GCF_PValue.h"
+
+class GCFPVUnsigned : public GCFPValue
+{
+  public:
+  	GCFPVUnsigned(unsigned int val = 0) : GCFPValue(UNSIGNED_VAL), _value(val) {;}
+  	virtual ~GCFPVUnsigned() {;}
+    /** Write property of unsigned value. */
+    virtual inline void setValue( const unsigned int newVal) {_value = newVal;}
+    /** Read property of unsigned value. */
+    virtual inline unsigned int getValue() const {return _value;}
+    /** No descriptions */
+    virtual GCFPValue* clone() const;
+    /** No descriptions */
+    virtual TSAResult copy(const GCFPValue& value);
+ 
+  private: // Private attributes
+    /**  */
+    unsigned int _value;
+};
+#endif
diff --git a/MAC/GCF/_CoreComps/SAL/src/GSA_Service.cc b/MAC/GCF/_CoreComps/SAL/src/GSA_Service.cc
index 8bccb6124b7..b7dcba0482f 100644
--- a/MAC/GCF/_CoreComps/SAL/src/GSA_Service.cc
+++ b/MAC/GCF/_CoreComps/SAL/src/GSA_Service.cc
@@ -26,7 +26,12 @@
 #include "GSA_SCADAHandler.h"
 
 #include "GCF_PVBool.h"
+#include "GCF_PVChar.h"
+#include "GCF_PVInteger.h"
+#include "GCF_PVUnsigned.h"
 #include "GCF_PVDouble.h"
+#include "GCF_PVString.h"
+#include "GCF_PVDynArr.h"
 
 #include <DpMsgAnswer.hxx>            
 #include <DpMsgHotLink.hxx>           
@@ -36,6 +41,11 @@
 #include <ErrClass.hxx>
 #include <Manager.hxx>
 #include <FloatVar.hxx>
+#include <CharVar.hxx>
+#include <TextVar.hxx>
+#include <IntegerVar.hxx>
+#include <UIntegerVar.hxx>
+#include <DynVar.hxx>
 
 GSAService::GSAService() : _pWFA(0)
 {
@@ -604,22 +614,27 @@ TSAResult GSAService::convertPVSSToMAC(const Variable& variable,
     else
       result = SA_VARIABLE_WRONG_TYPE;
   }
-/*  else if (typeName == "BIT32_VAL")
-  {
-    *pMacValue = new GCFPVBit32(((Bit32Var *)&variable)->getValue());
-  }
   else if (typeName == "CHAR_VAL")
   {
-    *pMacValue = new GCFPVChar(((CharVar *)&variable)->getValue());
+    if (variable.isA() == CHAR_VAR)
+      *pMacValue = new GCFPVChar(((CharVar *)&variable)->getValue());
+    else
+      result = SA_VARIABLE_WRONG_TYPE;
   }
   else if (typeName == "UNSIGNED_VAL")
   {
-    *pMacValue = new GCFPVUnsigned(((UIntegerVar *)&variable)->getValue());
+    if (variable.isA() == UINTEGER_VAR)
+      *pMacValue = new GCFPVUnsigned(((UIntegerVar *)&variable)->getValue());
+    else
+      result = SA_VARIABLE_WRONG_TYPE;
   }
   else if (typeName == "INTEGER_VAL")
   {
-    *pMacValue = new GCFVPInteger(((IntegerVar *)&variable)->getValue());
-  }*/
+    if (variable.isA() == INTEGER_VAR)
+      *pMacValue = new GCFPVInteger(((IntegerVar *)&variable)->getValue());
+    else
+      result = SA_VARIABLE_WRONG_TYPE;
+  }
   else if (typeName == "FLOAT_VAL")
   {
     if (variable.isA() == FLOAT_VAR)
@@ -627,9 +642,76 @@ TSAResult GSAService::convertPVSSToMAC(const Variable& variable,
     else
       result = SA_VARIABLE_WRONG_TYPE;     
   }
-/*  else if (typeName == "STRING_VAL")
+  else if (typeName == "STRING_VAL")
   {
-    *pMacValue = new GCFPVString(((TextVar *)&variable)->getValue());
+    if (variable.isA() == TEXT_VAR)
+      *pMacValue = new GCFPVString(((TextVar *)&variable)->getValue());
+    else
+      result = SA_VARIABLE_WRONG_TYPE;     
+  }
+  else if (typeName.ncmp("DYN", 3))
+  {
+    const DynVar* pDynVar = static_cast<const DynVar*>(&variable);
+    if (pDynVar)
+    {
+      GCFPValueArray arrayTo;
+      GCFPValue* pItemValue(0);
+      GCFPValue::TMACValueType type(GCFPValue::DYNARR_VAL);
+      // the type for the new FPValue must be determined 
+      // separate, because the array could be empty
+      switch (DynVar::getItemType(pDynVar->isA()))
+      {
+        case BIT_VAR:
+          type = (GCFPValue::TMACValueType) (type | GCFPValue::BOOL_VAL);
+          break;
+        case CHAR_VAR:
+          type = (GCFPValue::TMACValueType) (type | GCFPValue::CHAR_VAL);
+          break;
+        case INTEGER_VAR:
+          type = (GCFPValue::TMACValueType) (type | GCFPValue::INTEGER_VAL);
+          break;
+        case UINTEGER_VAR:
+          type = (GCFPValue::TMACValueType) (type | GCFPValue::UNSIGNED_VAL);
+          break;
+        case FLOAT_VAR:
+          type = (GCFPValue::TMACValueType) (type | GCFPValue::DOUBLE_VAL);
+          break;
+        case TEXT_VAR:
+          type = (GCFPValue::TMACValueType) (type | GCFPValue::STRING_VAL);
+          break;
+      }
+      for (Variable* pVar = pDynVar->getFirst();
+           pVar; pVar = pDynVar->getNext())
+      {
+        switch (pVar->isA())
+        {
+          case BIT_VAR:
+            pItemValue = new GCFPVBool(((BitVar*)pVar)->getValue());
+            break;
+          case CHAR_VAR:
+            pItemValue = new GCFPVChar(((CharVar*)pVar)->getValue());
+            break;
+          case INTEGER_VAR:
+            pItemValue = new GCFPVInteger(((IntegerVar*)pVar)->getValue());
+            break;
+          case UINTEGER_VAR:
+            pItemValue = new GCFPVUnsigned(((UIntegerVar*)pVar)->getValue());
+            break;
+          case FLOAT_VAR:
+            pItemValue = new GCFPVDouble(((FloatVar*)pVar)->getValue());
+            break;
+          case TEXT_VAR:
+            pItemValue = new GCFPVString(((TextVar*)pVar)->getValue());
+            break;
+        }
+        arrayTo.push_back(pItemValue);
+      }
+      *pMacValue = new GCFPVDynArr(type, arrayTo);
+    }
+  }
+/*  else if (typeName == "BIT32_VAL")
+  {
+    *pMacValue = new GCFPVBit32(((Bit32Var *)&variable)->getValue());
   }
   else if (typeName == "REF_VAL")
   {
@@ -657,40 +739,98 @@ TSAResult GSAService::convertMACToPVSS(const GCFPValue& macValue,
   switch (macValue.getType())
   {
     case GCFPValue::BOOL_VAL:
-      *pVar = new BitVar(((GCFPVBool *)&macValue)->getValue());
-      break;
-/*    case GCFPValue::BIT32_VAL:
-      *pVar = new Bit32Var(((GCFPVBit32 *)&macValue)->getValue());
+      *pVar = new BitVar(((GCFPVBool*)&macValue)->getValue());
       break;
     case GCFPValue::CHAR_VAL:
-      *pVar = new CharVar(((GCFPVChar *)&macValue)->getValue());
+      *pVar = new CharVar(((GCFPVChar*)&macValue)->getValue());
       break;
     case GCFPValue::UNSIGNED_VAL:
-      *pVar = new UIntegerVar(((GCFPVUnsigned *)&macValue)->getValue());
+      *pVar = new UIntegerVar(((GCFPVUnsigned*)&macValue)->getValue());
       break;
     case GCFPValue::INTEGER_VAL:
-      *pVar = new IntegerVar(((GCFVPInteger *)&macValue)->getValue());
-      break;*/      
+      *pVar = new IntegerVar(((GCFPVInteger*)&macValue)->getValue());
+      break;
     case GCFPValue::DOUBLE_VAL:
-      *pVar = new FloatVar(((GCFPVDouble *)&macValue)->getValue());
+      *pVar = new FloatVar(((GCFPVDouble*)&macValue)->getValue());
       break;
-/*    case GCFPValue::STRING_VAL:
-      *pVar = new TextVar(((GCFPVString *)&macValue)->getValue());
+    case GCFPValue::STRING_VAL:
+      *pVar = new TextVar(((GCFPVString*)&macValue)->getValue().c_str());
       break;
-    case GCFPValue::REF_VAL:
-      *pVar = new TextVar(((GCFPVRef *)&macValue)->getValue());
+/*    case GCFPValue::REF_VAL:
+      *pVar = new TextVar(((GCFPVRef*)&macValue)->getValue());
       break;
     case GCFPValue::BLOB_VAL:
-      *pVar = new BlobVar(((GCFPVBlob *)&macValue)->getValue());
+      *pVar = new BlobVar(((GCFPVBlob*)&macValue)->getValue());
       break;
     case GCFPValue::DATETIME_VAL:
-      *pVar = new TimeVar(((GCFPVDateTime *)&macValue)->getValue());
+      *pVar = new TimeVar(((GCFPVDateTime*)&macValue)->getValue());
+      break;
+    case GCFPValue::BIT32_VAL:
+      *pVar = new Bit32Var(((GCFPVBit32 *)&macValue)->getValue());
       break;*/
     default:
-      LOFAR_LOG_ERROR(SAL_STDOUT_LOGGER, (
-          "Type of MAC value is unknown: '%d'", 
-          macValue.getType()));
-      result = SA_MACTYPE_UNKNOWN;
+      if (macValue.getType() > GCFPValue::DYNARR_VAL && 
+          macValue.getType() <= (GCFPValue::DYNARR_VAL & GCFPValue::STRING_VAL))
+      {        
+        Variable* pItemValue;
+        VariableType type(NOTYPE_VAR);
+        // the type for the new FPValue must be determined 
+        // separat, because the array could be empty
+        switch (macValue.getType() & ~GCFPValue::DYNARR_VAL)
+        {
+          case GCFPValue::BOOL_VAL:
+            type = BIT_VAR;
+            break;
+          case GCFPValue::CHAR_VAL:
+            type = CHAR_VAR;
+            break;
+          case GCFPValue::INTEGER_VAL:
+            type = INTEGER_VAR;
+            break;
+          case GCFPValue::UNSIGNED_VAL:
+            type = UINTEGER_VAR;
+            break;
+          case GCFPValue::DOUBLE_VAL:
+            type = FLOAT_VAR;
+            break;
+          case GCFPValue::STRING_VAL:
+            type = TEXT_VAR;
+            break;
+        }
+        *pVar = new DynVar(type);
+        GCFPValue* pValue;
+        const GCFPValueArray& arrayFrom = ((GCFPVDynArr*)&macValue)->getValue();
+        for (GCFPValueArray::const_iterator iter = arrayFrom.begin();
+             iter != arrayFrom.end(); ++iter)
+        {
+          pValue = (*iter);
+          switch (pValue->getType())
+          {
+            case GCFPValue::BOOL_VAL:
+              pItemValue  = new BitVar(((GCFPVBool*)pValue)->getValue());
+              break;
+            case GCFPValue::CHAR_VAL:
+              pItemValue  = new CharVar(((GCFPVChar*)pValue)->getValue());
+              break;
+            case GCFPValue::INTEGER_VAL:
+              pItemValue  = new IntegerVar(((GCFPVInteger*)pValue)->getValue());
+              break;
+            case GCFPValue::UNSIGNED_VAL:
+              pItemValue  = new UIntegerVar(((GCFPVUnsigned*)pValue)->getValue());
+              break;
+            case GCFPValue::DOUBLE_VAL:
+              pItemValue  = new FloatVar(((GCFPVDouble*)pValue)->getValue());
+              break;
+            case GCFPValue::STRING_VAL:
+              pItemValue  = new TextVar(((GCFPVString*)pValue)->getValue().c_str());
+              break;
+          }
+          if (pItemValue)
+            ((DynVar *)(*pVar))->append(*pItemValue);
+        }
+      }
+      else
+        result = SA_MACTYPE_UNKNOWN;
       break;
   }  
   
diff --git a/MAC/GCF/_CoreComps/SAL/src/Makefile.am b/MAC/GCF/_CoreComps/SAL/src/Makefile.am
index a3cc4385dd5..ae9be6076c1 100644
--- a/MAC/GCF/_CoreComps/SAL/src/Makefile.am
+++ b/MAC/GCF/_CoreComps/SAL/src/Makefile.am
@@ -7,7 +7,12 @@ DOCHDRS	=	\
 	GCF_PValue.h \
 	GCF_PVBool.h \
 	GCF_PVDouble.h \
-	GAS_Defines.h
+	GCF_PVInteger.h \
+	GCF_PVUnsigned.h \
+	GCF_PVString.h \
+	GCF_PVChar.h \
+	GCF_PVDynArr.h \
+	GSA_Defines.h
     
 lib_LTLIBRARIES 	= libsal.la
 
@@ -19,6 +24,11 @@ libsal_la_SOURCES= $(DOCHDRS) \
 	GCF_PVBool.cc \
 	GCF_PValue.cc \
 	GCF_PVDouble.cc \
+	GCF_PVInteger.cc \
+	GCF_PVUnsigned.cc \
+	GCF_PVString.cc \
+	GCF_PVChar.cc \
+	GCF_PVDynArr.cc \
 	GSA_WaitForAnswer.cc
 
 include $(lofar_sharedir)/Makefile.common
diff --git a/MAC/GCF/_CoreComps/SAL/test/Makefile.am b/MAC/GCF/_CoreComps/SAL/test/Makefile.am
index d3849621311..4f9dc887157 100644
--- a/MAC/GCF/_CoreComps/SAL/test/Makefile.am
+++ b/MAC/GCF/_CoreComps/SAL/test/Makefile.am
@@ -13,7 +13,8 @@ ping_DEPENDENCIES	= $(LOFAR_DEPEND)
 AUTOGEN = autogen
 SUFFIXES = .ph
 %.ph: %.prot
-	$(AUTOGEN) -L $(top_srcdir)/../../GCFCommon/autogen $<
+	$(AUTOGEN) -L $(top_srcdir)/../../GCFCommon/autogen $< && \
+	chmod a+w $@
 
 BUILT_SOURCES = \
 	Echo_Protocol.ph
diff --git a/MAC/GCF/_CoreComps/TM/test/Makefile.am b/MAC/GCF/_CoreComps/TM/test/Makefile.am
index ad894d2a9de..b1c55963992 100644
--- a/MAC/GCF/_CoreComps/TM/test/Makefile.am
+++ b/MAC/GCF/_CoreComps/TM/test/Makefile.am
@@ -13,7 +13,8 @@ ping_DEPENDENCIES	= ../src/libtm.la $(LOFAR_DEPEND)
 AUTOGEN = autogen
 SUFFIXES = .ph
 %.ph: %.prot
-	$(AUTOGEN) -L $(top_srcdir)/../../GCFCommon/autogen $<
+	$(AUTOGEN) -L $(top_srcdir)/../../GCFCommon/autogen $< && \
+	chmod a+w $@
 
 BUILT_SOURCES = \
 	Echo_Protocol.ph
-- 
GitLab