#define _POSIX_C_SOURCE 199509L
extern "C" {
+ #include <stdio.h>
#include <string.h>
}
ParamBlobRecord::~ParamBlobRecord()
{
- for(int k = 0 ; k < index ; k++) {
- delete ourValue[k];
- }
}
-epicsShareFunc aitEnum ParamRecord::bestExternalType() const
+epicsShareFunc aitEnum ParamBlobRecord::bestExternalType() const
{
return aitEnumUint32;
}
gddAppFuncTableStatus ParamBlobRecord::readValue(gdd &value)
{
- if(index == 1) {
- aitString stringValue = new aitString;
-
- stringValue = ourValue[0];
-
- value.putConvert(stringValue);
+ FILE *blob;
+ size_t size;
+ int retVal;
+
+ retVal = Param_getBlob(param, name, idx, &size, &blob);
+ index = 1 + (((unsigned int) size - 1) / sizeof(aitUint32));
+ if((retVal != 0) || (index == 0)) {
+ return S_cas_noRead;
} else {
- aitString *stringValue;
- stringValue = new aitString[index];
- for (int k = 0 ; k < index ; k++) {
- stringValue[k] = ourValue[k];
- }
+ aitUint32 *ourValue = new aitUint32[index];
+ fread(ourValue, sizeof(aitUint32), index, blob);
+ fclose(blob);
- value.putRef(stringValue);
+ value.putRef(ourValue);
}
return S_casApp_success;
caStatus ParamBlobRecord::scan()
{
- caStatus retVal;
- caServer *pCAS = this->getCAS();
+ FILE *blob;
+ size_t size;
+ int retVal;
+ ArrayDestructor *pDest;
- if(index == 1) {
- aitString stringValue = new aitString;
- val = new gddScalar(gddAppType_value, aitEnumString);
-
- stringValue = ourValue[0];
+ caServer *pCAS = this->getCAS();
- val->putConvert(stringValue);
+ retVal = Param_getBlob(param, name, idx, &size, &blob);
+ index = 1 + (((unsigned int) size - 1) / sizeof(aitUint32));
+ if((retVal != 0) || (index == 0)) {
+ return S_cas_noRead;
} else {
- aitString *stringValue;
+ aitUint32 *ourValue = new aitUint32[index];
+ fread(ourValue, sizeof(aitUint32), index, blob);
+ fclose(blob);
val = new gddAtomic(gddAppType_value, aitEnumString, 1, index);
- stringValue = new aitString[index];
- for (int k = 0 ; k < index ; k++) {
- stringValue[k] = ourValue[k];
- }
+ pDest = new ArrayDestructor;
- ArrayDestructor *pDest = new ArrayDestructor;
-
- val->putRef(stringValue, pDest);
+ val->putRef(ourValue, pDest);
}
val->setStat(epicsAlarmNone);
this->postEvent (select, *val);
}
- retVal = S_cas_success;
+ delete pDest;
- return retVal;
+ return S_cas_success;
}
caStatus ParamBlobRecord::read(const casCtx &ctx, gdd &prototype)
class ParamBlobRecord : public ParamRecord {
private:
aitIndex index;
- char *ourValue[PARAM_MAX_ARRAY_LEN];
gddAppFuncTable<ParamBlobRecord> funcTable;
public:
ParamFilenameRecord::~ParamFilenameRecord()
{
- for(int k = 0 ; k < index ; k++) {
+ for(unsigned int k = 0 ; k < index ; k++) {
delete ourValue[k];
}
}
-epicsShareFunc aitEnum ParamRecord::bestExternalType() const
+epicsShareFunc aitEnum ParamFilenameRecord::bestExternalType() const
{
return aitEnumString;
}
} else {
aitString *stringValue;
stringValue = new aitString[index];
- for (int k = 0 ; k < index ; k++) {
+ for (unsigned int k = 0 ; k < index ; k++) {
stringValue[k] = ourValue[k];
}
val = new gddAtomic(gddAppType_value, aitEnumString, 1, index);
stringValue = new aitString[index];
- for (int k = 0 ; k < index ; k++) {
+ for (unsigned int k = 0 ; k < index ; k++) {
stringValue[k] = ourValue[k];
}
ParamIntRecord::~ParamIntRecord()
{
- for(int k = 0 ; k < index ; k++) {
- delete ourValue[k];
- }
}
-epicsShareFunc aitEnum ParamRecord::bestExternalType() const
+epicsShareFunc aitEnum ParamIntRecord::bestExternalType() const
{
return aitEnumUint32;
}
gddAppFuncTableStatus ParamIntRecord::readValue(gdd &value)
{
- if(index == 1) {
- aitString stringValue = new aitString;
-
- stringValue = ourValue[0];
-
- value.putConvert(stringValue);
+ int rows;
+ int retVal;
+ retVal = Param_getIntArray(param, name, idx, PARAM_MAX_ARRAY_LEN, &rows, ourValue);
+ index = (unsigned int) rows;
+ if((retVal != 0) || (index == 0)) {
+ return S_cas_noRead;
+ } else if(index == 1) {
+ aitUint32 intValue;
+
+ intValue = ourValue[0];
+
+ value.putConvert(intValue);
} else {
- aitString *stringValue;
- stringValue = new aitString[index];
- for (int k = 0 ; k < index ; k++) {
- stringValue[k] = ourValue[k];
+ aitUint32 *intValue = new aitUint32[index];
+ for (unsigned int k = 0 ; k < index ; k++) {
+ intValue[k] = ourValue[k];
}
- value.putRef(stringValue);
+ value.putRef(intValue);
+ delete [] intValue;
}
return S_casApp_success;
caStatus ParamIntRecord::scan()
{
- caStatus retVal;
caServer *pCAS = this->getCAS();
- if(index == 1) {
- aitString stringValue = new aitString;
- val = new gddScalar(gddAppType_value, aitEnumString);
+ int rows;
+ int retVal;
+ ArrayDestructor *pDest;
- stringValue = ourValue[0];
+ retVal = Param_getIntArray(param, name, idx, PARAM_MAX_ARRAY_LEN, &rows, ourValue);
+ index = (unsigned int) rows;
+ if((retVal != 0) || (index == 0)) {
+ return S_cas_noRead;
+ } else if(index == 1) {
+ aitUint32 intValue;
+ val = new gddScalar(gddAppType_value, aitEnumUint32);
- val->putConvert(stringValue);
- } else {
- aitString *stringValue;
-
- val = new gddAtomic(gddAppType_value, aitEnumString, 1, index);
+ intValue = ourValue[0];
- stringValue = new aitString[index];
- for (int k = 0 ; k < index ; k++) {
- stringValue[k] = ourValue[k];
+ val->putConvert(intValue);
+ } else {
+ pDest = new ArrayDestructor;
+ aitUint32 *intValue = new aitUint32[index];
+ for (unsigned int k = 0 ; k < index ; k++) {
+ intValue[k] = ourValue[k];
}
- ArrayDestructor *pDest = new ArrayDestructor;
+ val = new gddAtomic(gddAppType_value, aitEnumUint32, 1, index);
- val->putRef(stringValue, pDest);
+ val->putRef(intValue, pDest);
+ delete [] intValue;
}
val->setStat(epicsAlarmNone);
this->postEvent (select, *val);
}
- retVal = S_cas_success;
+ delete pDest;
- return retVal;
+ return S_cas_success;
}
caStatus ParamIntRecord::read(const casCtx &ctx, gdd &prototype)
caStatus ParamIntRecord::write(const casCtx &ctx, gdd &value)
{
- caServer *pCAS = this->getCAS();
-
- aitString stringValue;
-
- value.getConvert(stringValue);
+ aitUint32 intValue;
- char ourValue[PARAM_MAX_VALUE_LEN];
- strcpy(ourValue, (const char *) stringValue);
+ value.getConvert(intValue);
- Param_storeString(param, name, idx, ourValue);
+ Param_storeInt(param, name, idx, (unsigned long int) intValue);
return S_cas_success;
}
strcpy(idx, buf3);
}
- for (int i = 0 ; i < strlen(name) ; i++) {
+ for (unsigned int i = 0 ; i < strlen(name) ; i++) {
name[i] = tolower(name[i]);
}
- for (int i = 0 ; i < strlen(idx) ; i++) {
+ for (unsigned int i = 0 ; i < strlen(idx) ; i++) {
idx[i] = tolower(idx[i]);
}
interest = aitFalse;
ParamStringRecord::~ParamStringRecord()
{
- for(int k = 0 ; k < index ; k++) {
+ for(unsigned int k = 0 ; k < index ; k++) {
delete ourValue[k];
}
}
-epicsShareFunc aitEnum ParamRecord::bestExternalType() const
+epicsShareFunc aitEnum ParamStringRecord::bestExternalType() const
{
return aitEnumString;
}
} else {
aitString *stringValue;
stringValue = new aitString[index];
- for (int k = 0 ; k < index ; k++) {
+ for (unsigned int k = 0 ; k < index ; k++) {
stringValue[k] = ourValue[k];
}
val = new gddAtomic(gddAppType_value, aitEnumString, 1, index);
stringValue = new aitString[index];
- for (int k = 0 ; k < index ; k++) {
+ for (unsigned int k = 0 ; k < index ; k++) {
stringValue[k] = ourValue[k];
}
caStatus ParamStringRecord::write(const casCtx &ctx, gdd &value)
{
- caServer *pCAS = this->getCAS();
-
aitString stringValue;
value.getConvert(stringValue);