/*
Copyright (c) 2019 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
/*--------------------------------------------------------------------*\
Pro/DEVELOP includes
\*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*\
Pro/TOOLKIT includes
\*--------------------------------------------------------------------*/
#include "ProToolkit.h"
#include "ProArray.h"
#include "ProMenu.h"
#include "ProMessage.h"
#include "ProTKRunTime.h"
#include "TestGenedata.h"
#include "TestFiletypes.h"
#include "UtilString.h"
#include <ProUtil.h>
/*--------------------------------------------------------------------*\
C System includes
\*--------------------------------------------------------------------*/
#include "math.h"
#include "ctype.h"
/*--------------------------------------------------------------------*\
Application macros
\*--------------------------------------------------------------------*/
#define MAX_SLOT_CLASS_NUM 2000
/*--------------------------------------------------------------------*\
Application data types
\*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*\
Application global/external data
\*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*\
Application static data/function
\*--------------------------------------------------------------------*/
static int ProTestSelectSlot(
ProExtdataClass *data_class,
int *keyby,
ProExtdataSlot *data_slot);
static int ProTestSelectClass(
ProMdl p_model,
ProExtdataClass *p_class);
static int ProTestUserAction(
char *dummy,
int action);
static int ProTestGetDataType(
);
static unsigned char ProTestHexToByte(
char *str);
/*====================================================================*\
Function : ProTestProAppdataErr
Purpose : Display error message
\*====================================================================*/
char *ProTestProAppdataErr(
ProExtdataErr err)
{
switch(err)
{
case PROEXTDATA_TK_NO_ERROR :
return((char*)"No error");
case PROEXTDATA_TK_INVALID_OBJ_OR_CLASS :
return((char*)"Invalid object or class");
case PROEXTDATA_TK_CLASS_OR_SLOT_EXISTS :
return((char*)"Class or slot exists");
case PROEXTDATA_TK_NAMES_TOO_LONG :
return((char*)"Names too long");
case PROEXTDATA_TK_SLOT_NOT_FOUND :
return((char*)"Slot not found");
case PROEXTDATA_TK_BAD_KEY_BY_FLAG :
return((char*)"Bay KEY_BY flag");
case PROEXTDATA_TK_INVALID_OBJ_TYPE :
return((char*)"Invalid object type");
case PROEXTDATA_TK_EMPTY_SLOT :
return((char*)"Empty slot");
case PROEXTDATA_TK_BAD_DATA_ARGS :
return((char*)"Bad data arguments");
case PROEXTDATA_TK_STREAM_TOO_LARGE :
return((char*)"Stream too large");
case PROEXTDATA_TK_INVALID_SLOT_NAME :
return((char*)"Invalid slot name");
case PROEXTDATA_TK_ERROR :
return((char*)"General error");
default :
return((char*)"**UNKNOWN STATUS**");
}
}
/*====================================================================*\
Function : ProTestGeneData
Purpose : Display the generic data menu
\*====================================================================*/
int ProTestGeneData()
{
ProMdl model;
ProError status;
ProExtdataErr err;
int id;
status = ProMdlCurrentGet(&model);
TEST_CALL_REPORT("ProMdlCurrentGet()", "ProTestGeneData( )",
status, status != PRO_TK_NO_ERROR);
err = ProExtdataInit(model);
TEST_CALL_REPORT("ProExtdataInit()", "ProTestGeneData()",
(ProError)err, err != PROEXTDATA_TK_NO_ERROR);
status = ProMenuFileRegister((char*)"TkGenData", (char*)"tkgendata.mnu", &id);
TEST_CALL_REPORT("ProMenuFileRegister()", "ProTestGeneData()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkGenData",(char*)"-Register Class",
(ProMenubuttonAction)ProTestRegClass, model, 0);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestGeneData()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkGenData",(char*)"-Create Slot",
(ProMenubuttonAction)ProTestCreateSlot ,model, 0);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestGeneData()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkGenData",(char*)"-Write/Read Check",
(ProMenubuttonAction)ProTestWrCheck, model, 0);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestGeneData()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkGenData",(char*)"-Delete class",
(ProMenubuttonAction)ProTestDeleteC, model, 0);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestGeneData()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkGenData",(char*)"-Delete slot",
(ProMenubuttonAction)ProTestDelete, model, 0);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestGeneData()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkGenData",(char*)"-Dump",
(ProMenubuttonAction)ProTestDump, model, 0);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestGeneData()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkGenData",(char*)"-Random",
(ProMenubuttonAction)ProTestRandom, model, 0);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestGeneData()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkGenData",(char*)"-Refresh data",
(ProMenubuttonAction)ProTestRefresh, model, 0);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestGeneData()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkGenData",(char*)"TkGenData",
(ProMenubuttonAction)ProMenuDelete, model, 0);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestGeneData()",
status, status != PRO_TK_NO_ERROR);
status = ProMenuCreate(PROMENUTYPE_MAIN,(char*)"TkGenData", &id);
TEST_CALL_REPORT("ProMenuCreate()", "ProTestGeneData()",
status, status != PRO_TK_NO_ERROR);
status = ProMenuProcess((char*)"TkGenData", &id);
TEST_CALL_REPORT("ProMenuProcess()", "ProTestGeneData()",
status, status != PRO_TK_NO_ERROR);
return(PRO_TK_NO_ERROR);
}
/*====================================================================*\
Function : ProTestRegClass
Purpose : Register class
\*====================================================================*/
int ProTestRegClass(
ProMdl p_model)
{
ProExtdataErr err;
ProExtdataClass data_class;
ProName class_name;
/*-------------------------------------------------------------*\
Get the class name.
\*-------------------------------------------------------------*/
ProUtilMsgPrint("gendata","TEST Enter class name [QUIT] : ");
if(ProMessageStringRead(PRO_NAME_SIZE, class_name))
{
return(PRO_TK_BAD_INPUTS);
}
/*-------------------------------------------------------------*\
Register the class.
\*-------------------------------------------------------------*/
err = ProExtdataClassRegister(p_model, class_name, &data_class);
TEST_CALL_REPORT("ProExtdataClassRegister()", "ProTestRegClass()",
(ProError)err, err != PROEXTDATA_TK_NO_ERROR);
if(err != PROEXTDATA_TK_NO_ERROR)
{
ProUtilMsgPrint("gendata", "TEST ProExtdataClassRegister() status: %0s",
ProTestProAppdataErr(err));
return(PRO_TK_GENERAL_ERROR);
}
ProUtilMsgPrint("gendata","TEST Class %0ws registered successfully", class_name);
return(PRO_TK_NO_ERROR);
}
/*====================================================================*\
Function : ProTestSelectSlot
Purpose : Select a slot
\*====================================================================*/
static int ProTestSelectSlot(
ProExtdataClass *data_class,
int *keyby,
ProExtdataSlot *data_slot)
{
ProExtdataErr err;
int num_of_slots, i, n_sel;
ProExtdataNamesList slot_name_list;
ProExtdataIdsList slot_id_list;
wchar_t **selected, wtitle[10];
char tmp_str[PRO_NAME_SIZE];
wchar_t *list[MAX_SLOT_CLASS_NUM];
wchar_t empty_buff[2];
ProError status;
/*-------------------------------------------------------------*\
get the name list.
\*-------------------------------------------------------------*/
err = ProExtdataSlotNamesList(data_class, &num_of_slots,
&slot_name_list);
TEST_CALL_REPORT("ProExtdataSlotNamesList()", "ProTestSelectSlot()",
(ProError)err, err != PROEXTDATA_TK_NO_ERROR);
if( err != PROEXTDATA_TK_NO_ERROR)
{
ProUtilMsgPrint("gendata","TEST ProExtdataSlotNamesList() status : %0s",
ProTestProAppdataErr(err));
return(0);
}
/*-------------------------------------------------------------*\
get the id list.
\*-------------------------------------------------------------*/
err = ProExtdataSlotIdsList(data_class, &num_of_slots, &slot_id_list);
TEST_CALL_REPORT("ProExtdataSlotIdsList()", "ProTestSelectSlot()",
(ProError)err, err != PROEXTDATA_TK_NO_ERROR);
if( err != PROEXTDATA_TK_NO_ERROR )
{
ProUtilMsgPrint("gendata","TEST ProExtdataSlotIdsList() status : %0s",
ProTestProAppdataErr(err));
return(0);
}
if(num_of_slots < 1)
{
ProUtilMsgPrint("gendata","TEST There are no slots in class %0ws",
data_class->class_name);
return(0);
}
ProStringToWstring(empty_buff, (char*)"");
ProUtilMsgPrint("gendata","TEST Select slot");
ProStringToWstring(wtitle,(char*)"Slots");
for(i = 0;i < num_of_slots; i ++)
{
list[i] = (wchar_t *)slot_name_list[i];
}
list[i] = empty_buff;
status = ProMenuStringsSelect(wtitle,list,1,NULL,&selected, &n_sel);
TEST_CALL_REPORT ("ProMenuStringSelect", "ProTestSelectSlot",
status, status != PRO_TK_NO_ERROR);
data_slot->p_class = data_class;
ProUtilWstrcpy(data_slot->slot_name, (wchar_t *)selected[0]);
for(i = 0;i < num_of_slots;i ++)
{
if(ProUtilWstrCmp(slot_name_list[i], data_slot->slot_name) == 0)
{
data_slot->slot_id = slot_id_list[i];
break;
}
}
ProArrayFree((ProArray *)&slot_name_list);
ProArrayFree((ProArray *)&slot_id_list);
ProWstringToString(tmp_str, data_slot->slot_name);
if(isdigit(tmp_str[0]))
{
*keyby = KEY_BY_ID;
ProStringToWstring(data_slot->slot_name, (char*)" ");
}
else
{
*keyby = KEY_BY_NAME;
}
return(1);
}
/*====================================================================*\
Function : ProTestSelectClass
Purpose : Select a class
\*====================================================================*/
static int ProTestSelectClass(
ProMdl p_model,
ProExtdataClass *p_class)
{
ProExtdataErr err;
ProName *class_name_list;
int num_of_class, n_sel, i;
wchar_t wtitle[10];
wchar_t **selected;
wchar_t *list[MAX_SLOT_CLASS_NUM];
wchar_t empty_buff[2];
ProError status;
/*-------------------------------------------------------------*\
Get the class list
\*-------------------------------------------------------------*/
err=ProExtdataClassNamesList(p_model, &num_of_class, &class_name_list);
TEST_CALL_REPORT("ProExtdataClassNamesList()", "ProTestSelectClass()",
(ProError)err, err != PROEXTDATA_TK_NO_ERROR);
if( err != PROEXTDATA_TK_NO_ERROR )
{
ProUtilMsgPrint("gendata","TEST ProExtdataClassNamesList() status : %0s",
ProTestProAppdataErr(err));
return(0);
}
if(num_of_class < 1)
{
ProUtilMsgPrint("gendata","TEST There are no classes defined");
return(0);
}
ProStringToWstring(empty_buff, (char*)"");
ProUtilMsgPrint("gendata","TEST Select class");
ProStringToWstring(wtitle,(char*)"Classes");
for(i = 0;i < num_of_class; i ++)
{
list[i] = (wchar_t *)class_name_list[i];
}
list[i] = empty_buff;
status = ProMenuStringsSelect(wtitle, list, 1, NULL, &selected, &n_sel);
ProArrayFree((ProArray *)&class_name_list);
if(status != PRO_TK_NO_ERROR || n_sel < 1)
{
return(0);
}
p_class->p_model = p_model;
ProUtilWstrcpy(p_class->class_name, selected[0]);
return(1);
}
/*====================================================================*\
Function : ProTestCreateSlot
Purpose : Create the slot
\*====================================================================*/
int ProTestCreateSlot(
ProMdl p_model)
{
ProExtdataClass data_class;
ProName slot_name;
ProExtdataSlot data_slot;
ProExtdataErr err;
/*-------------------------------------------------------------*\
Select a class name for the slot to belong to
\*-------------------------------------------------------------*/
if(ProTestSelectClass(p_model, &data_class) == 0)
return(PRO_TK_BAD_INPUTS);
/*-------------------------------------------------------------*\
Get the slot name
\*-------------------------------------------------------------*/
ProUtilMsgPrint("gendata","TEST Enter slot name [NONE] : ");
/*-------------------------------------------------------------*\
If no slot name was given, then create one with no name
(i.e. we will KEY_BY_ID)
else use the name.
\*-------------------------------------------------------------*/
if(!ProMessageStringRead(PRO_NAME_SIZE, slot_name))
{
err = ProExtdataSlotCreate(&data_class, slot_name, &data_slot);
}
else
{
err = ProExtdataSlotCreate(&data_class, NULL, &data_slot);
}
TEST_CALL_REPORT("ProExtdataSlotCreate()", "ProTestCreateSlot()",
(ProError)err, err != PROEXTDATA_TK_NO_ERROR);
if(err == PROEXTDATA_TK_NO_ERROR)
{
ProUtilMsgPrint("gendata","TEST Created slot with id %0d", &data_slot.slot_id);
return(PRO_TK_NO_ERROR);
}
ProUtilMsgPrint("gendata","TEST ProExtdataSlotCreate() status : %0s",
ProTestProAppdataErr(err));
return(PRO_TK_GENERAL_ERROR);
}
/*====================================================================*\
Function : ProTestUserAction
Purpose : exit the data type menu
\*====================================================================*/
static int ProTestUserAction(
char *dummy,
int action)
{
ProError err;
err = ProMenuDeleteWithStatus(action);
TEST_CALL_REPORT ("ProMenuDeleteWithStatus","ProTestUserAction", err,
err != PRO_TK_NO_ERROR);
return 0;
}
/*====================================================================*\
Function : ProTestGetDataType
Purpose : Create the data type menu
\*====================================================================*/
static int ProTestGetDataType()
{
ProError status;
int id;
status = ProMenuFileRegister((char*)"TkGenType",(char*)"tkgentype.mnu", &id);
TEST_CALL_REPORT ("ProMenuFileRegister", "ProTestGetDataType", status,
status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkGenType",(char*)"-Integer",
(ProMenubuttonAction)ProTestUserAction, NULL,PRO_INTEGER_TYPE);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestGetDataType()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkGenType",(char*)"-Double",
(ProMenubuttonAction)ProTestUserAction, NULL,PRO_DOUBLE_TYPE);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestGetDataType()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkGenType",(char*)"-Wide Str",
(ProMenubuttonAction)ProTestUserAction, NULL,PRO_WIDE_STRING_TYPE);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestGetDataType()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkGenType",(char*)"-Stream",
(ProMenubuttonAction)ProTestUserAction, NULL,PRO_STREAM_TYPE);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestGetDataType()",
status, status != PRO_TK_NO_ERROR);
status = ProMenubuttonActionSet((char*)"TkGenType",(char*)"TkGenType",
(ProMenubuttonAction)ProTestUserAction,NULL,-1);
TEST_CALL_REPORT("ProMenubuttonActionSet()", "ProTestGetDataType()",
status, status != PRO_TK_NO_ERROR);
ProUtilMsgPrint("gendata","TEST Select data type");
status = ProMenuCreate(PROMENUTYPE_MAIN,(char*)"TkGenType", &id);
TEST_CALL_REPORT("ProMenuCreate()", "ProTestGetDataType()",
status, status != PRO_TK_NO_ERROR);
status = ProMenuProcess((char*)"TkGenType", &id);
if (status == PRO_TK_NO_ERROR)
return (id);
else
return(-1);
}
/*====================================================================*\
Function : ProTestHexToByte
Purpose : Convert hex to str
\*====================================================================*/
static unsigned char ProTestHexToByte(
char *str)
{
int i;
char h;
unsigned char b;
b=0;
for(i=0;i<2;i++)
{
h = (char)toupper(str[i]);
if(isdigit(h))
b = (unsigned char)(b*16 + (int)(h - '0'));
else
b = (unsigned char)(b*16 + (int)(h - 'A') + 10);
}
return(b);
}
/*====================================================================*\
Function : ProTestWrCheck
Purpose : Check the data slot write and read back functions
\*====================================================================*/
int ProTestWrCheck(
ProMdl p_model)
{
ProExtdataErr err;
int data_type, keyby, i, i_read, b, differ, data_size;
ProExtdataClass data_class;
ProExtdataSlot data_slot;
unsigned char *stream,*s_read;
double d,d_read;
void *data;
char str[PRO_LINE_SIZE];
wchar_t wstr[PRO_LINE_SIZE];
int cont = 1;
/*-------------------------------------------------------------*\
Get the type of slot (integer, double etc.)
\*-------------------------------------------------------------*/
data_type = ProTestGetDataType();
if(data_type < 0)
{
return(PRO_TK_BAD_INPUTS);
}
/*-------------------------------------------------------------*\
Get the class
\*-------------------------------------------------------------*/
if(!ProTestSelectClass(p_model, &data_class))
{
return(PRO_TK_BAD_INPUTS);
}
/*-------------------------------------------------------------*\
Get the slot
\*-------------------------------------------------------------*/
if(!ProTestSelectSlot(&data_class, &keyby, &data_slot))
{
return(PRO_TK_BAD_INPUTS);
}
ProTKPrintf("%d\n", data_type);
/*-------------------------------------------------------------*\
Depending upon the type of data, get the user to type the
data, and then save it to the slot.
\*-------------------------------------------------------------*/
switch(data_type)
{
case PRO_INTEGER_TYPE :
ProUtilMsgPrint("gendata","TEST Enter integer [QUIT] : ");
if(ProMessageIntegerRead(NULL, &i))
return(PRO_TK_BAD_INPUTS);
err = ProExtdataSlotWrite(&data_slot, keyby, PRO_INTEGER_TYPE, 0, &i);
break;
case PRO_DOUBLE_TYPE :
ProUtilMsgPrint("gendata","TEST Enter double [QUIT] : ");
if(ProMessageDoubleRead(NULL, &d))
return(PRO_TK_BAD_INPUTS);
err = ProExtdataSlotWrite(&data_slot, keyby, PRO_DOUBLE_TYPE, 0, &d);
break;
case PRO_WIDE_STRING_TYPE :
ProUtilMsgPrint("gendata","TEST Enter string [QUIT] : ");
if(ProMessageStringRead(PRO_LINE_SIZE, wstr))
return(PRO_TK_BAD_INPUTS);
err = ProExtdataSlotWrite(&data_slot, keyby, PRO_WIDE_STRING_TYPE,
0, wstr);
break;
case PRO_STREAM_TYPE :
b=0;
do
{
ProUtilMsgPrint("gendata","TEST Enter bytes in hexadecimal [QUIT] : ");
if(ProMessageStringRead(PRO_LINE_SIZE, wstr))
break;
ProWstringToString(str,wstr);
if(strlen(str)%2)
str[strlen(str)-1] = '\0';
if(b==0)
stream = (unsigned char*)calloc(strlen(str)/2,1);
else
stream = (unsigned char*)realloc(stream, b + strlen(str)/2);
for(i=0;i<(int)strlen(str);i+=2)
stream[b++] = ProTestHexToByte(&str[i]);
} while (cont);
err = ProExtdataSlotWrite(&data_slot, keyby, PRO_STREAM_TYPE, b,stream);
break;
}
TEST_CALL_REPORT("ProExtdataSlotWrite()", "ProTestWrCheck()",
(ProError)err, err != PROEXTDATA_TK_NO_ERROR);
if(err)
{
ProUtilMsgPrint("gendata","TEST ProExtdataSlotWrite() status : %0s",
ProTestProAppdataErr(err));
return(PRO_TK_GENERAL_ERROR);
}
/*-------------------------------------------------------------*\
Read back the data, and compare its value
\*-------------------------------------------------------------*/
err = ProExtdataSlotRead(&data_slot, keyby, &data_type, &data_size, &data);
TEST_CALL_REPORT("ProExtdataSlotRead()", "ProTestWrCheck()",
(ProError)err, err != PROEXTDATA_TK_NO_ERROR);
if(err)
{
ProUtilMsgPrint("gendata","TEST ProExtdataSlotRead() status : %0s",
ProTestProAppdataErr(err));
return(0);
}
switch(data_type)
{
case PRO_INTEGER_TYPE :
i_read = *(int*)data;
if(i_read != i)
ProUtilMsgPrint("gendata","TEST INCORRECT value read back = %0d",
&i_read);
else
ProUtilMsgPrint("gendata","TEST Value read back = %0d",&i_read);
break;
case PRO_DOUBLE_TYPE :
d_read = *(double*)data;
if(fabs(d_read - d) > 0.0000001)
ProUtilMsgPrint("gendata","TEST INCORRECT value read back = %0f",
&d_read);
else
ProUtilMsgPrint("gendata","TEST Value read back = %0f",&d_read);
break;
case PRO_WIDE_STRING_TYPE :
if(ProUtilWstrCmp((wchar_t*)data, wstr))
ProUtilMsgPrint("gendata","TEST INCORRECT value read back = %0w",
(wchar_t*)data);
else
ProUtilMsgPrint("gendata","TEST Value read back = %0w",(wchar_t*)data);
break;
case PRO_STREAM_TYPE :
s_read = (unsigned char*)data;
differ=0;
for(b=0;b<data_size;b++)
if(s_read[b] != stream[b])
{
differ=1;
break;
}
if(differ)
ProUtilMsgPrint("gendata","TEST INCORRECT value read back");
else
ProUtilMsgPrint("gendata","TEST Correct value read back");
break;
}
err = ProExtdataFree(&data);
TEST_CALL_REPORT("ProExtdataFree()", "ProTestWrCheck()",
(ProError)err, err != PROEXTDATA_TK_NO_ERROR);
return(PRO_TK_NO_ERROR);
}
/*====================================================================*\
Function : ProTestRandom
Purpose : Random data access to data slots
\*====================================================================*/
int ProTestRandom(
ProMdl p_model)
{
ProName class_name;
ProExtdataErr err;
ProExtdataClass data_class;
int data_size;
/*-------------------------------------------------------------*\
Get the new class name
\*-------------------------------------------------------------*/
ProUtilMsgPrint("gendata","TEST Enter class name [QUIT] : ");
if(ProMessageStringRead(PRO_NAME_SIZE, class_name))
return(PRO_TK_BAD_INPUTS);
/*-------------------------------------------------------------*\
Register it
\*-------------------------------------------------------------*/
err = ProExtdataClassRegister(p_model, class_name, &data_class);
TEST_CALL_REPORT("ProExtdataClassRegister()", "ProTestRandom( )",
(ProError)err, (ProError)err != PRO_TK_NO_ERROR);
if(err != PROEXTDATA_TK_NO_ERROR)
{
ProUtilMsgPrint("gendata","TEST ProExtdataClassRegister() %0s",
ProTestProAppdataErr(err));
return(PRO_TK_GENERAL_ERROR);
}
/*-------------------------------------------------------------*\
Get how many bytes of data to generate
\*-------------------------------------------------------------*/
ProUtilMsgPrint("gendata","TEST Enter number of bytes to save [QUIT] : ");
if(ProMessageIntegerRead(NULL, &data_size))
return(PRO_TK_BAD_INPUTS);
/*-------------------------------------------------------------*\
Generate and save the data
\*-------------------------------------------------------------*/
/* create func to replace user_save_random_data() .*/
ProTestSvRdmData(&data_class, data_size);
return(PRO_TK_NO_ERROR);
}
/*====================================================================*\
Function : ProTestDump
Purpose : Dump all the generic data to a file
\*====================================================================*/
int ProTestDump(
ProMdl p_model)
{
FILE *fp;
char fname[40], tmp_str[PRO_NAME_SIZE];
wchar_t w_fname[40];
ProExtdataNamesList class_name_list;
ProExtdataNamesList slot_name_list;
ProExtdataIdsList slot_id_list;
ProExtdataErr err;
int num_of_class, num_of_slots, c, s, b, keyby;
int data_type, data_size;
void *data;
char str[256];
ProExtdataClass data_class;
ProExtdataSlot data_slot;
unsigned char *stream;
fp = ProUtilGenFilePtr(p_model, (char*)GENERIC, (char*)fname, (char*)"w");
err=ProExtdataClassNamesList(p_model, &num_of_class, &class_name_list);
TEST_CALL_REPORT("ProExtdataClassNamesList()", "ProTestDump()",
(ProError)err, err != PROEXTDATA_TK_NO_ERROR);
if (err != PROEXTDATA_TK_NO_ERROR )
{
ProUtilMsgPrint("gendata","TEST ProExtdataClassNamesList() status : %0s",
ProTestProAppdataErr(err));
return(PRO_TK_GENERAL_ERROR);
}
if(num_of_class < 1)
{
ProUtilMsgPrint("gendata","TEST No generic data present");
return(PRO_TK_GENERAL_ERROR);
}
data_class.p_model = p_model;
for(c=0;c<num_of_class;c++)
{
ProWstringToString(tmp_str, class_name_list[c]);
ProTKFprintf(fp,"CLASS %s\n", tmp_str);
ProUtilWstrcpy(data_class.class_name, class_name_list[c]);
err = ProExtdataSlotNamesList(&data_class, &num_of_slots,
&slot_name_list);
TEST_CALL_REPORT("ProExtdataSlotNamesList()", "ProTestDump()",
(ProError)err, err != PROEXTDATA_TK_NO_ERROR);
if(num_of_slots <1)
{
ProTKFprintf(fp," (NO SLOTS)\n");
continue;
}
err = ProExtdataSlotIdsList(&data_class, &num_of_slots, &slot_id_list);
TEST_CALL_REPORT("ProExtdataSlotIdsList()", "ProTestDump()",
(ProError)err, err != PROEXTDATA_TK_NO_ERROR);
data_slot.p_class = &data_class;
ProTKFprintf(fp," SLOTS..\n");
for(s=0;s<num_of_slots;s++)
{
ProTKFprintf(fp," %d :\n",slot_id_list[s]);
data_slot.slot_id = slot_id_list[s];
ProUtilWstrcpy(data_slot.slot_name, slot_name_list[s]);
keyby = KEY_BY_NAME;
ProWstringToString(tmp_str, slot_name_list[s]);
if(strlen(tmp_str) == 0 ||
isdigit(tmp_str[0]))
keyby = KEY_BY_ID;
err = ProExtdataSlotRead(&data_slot, keyby, &data_type,
&data_size, &data);
TEST_CALL_REPORT("ProExtdataSlotRead()", "ProTestDump()",
(ProError)err, err != PROEXTDATA_TK_NO_ERROR);
if(err != PROEXTDATA_TK_NO_ERROR)
{
ProTKFprintf(fp," NO VALUE READ\n");
continue;
}
switch(data_type)
{
case PRO_INTEGER_TYPE :
ProTKFprintf(fp," INTEGER = %d\n",*(int*)data);
break;
case PRO_DOUBLE_TYPE :
ProTKFprintf(fp," DOUBLE = %f\n",*(double*)data);
break;
case PRO_WIDE_STRING_TYPE :
ProTKFprintf(fp," STRING = %s\n",
ProWstringToString(str,(wchar_t*)data));
break;
case PRO_STREAM_TYPE :
stream = (unsigned char *)data;
ProTKFprintf(fp," STREAM = ");
for(b=0;b<data_size;b++)
{
ProTKFprintf(fp,"%02x",stream[b]);
if((b+1)%100 == 0)
ProTKFprintf(fp,"\n ");
}
ProTKFprintf(fp,"\n");
break;
}
err = ProExtdataFree(&data);
TEST_CALL_REPORT("ProExtdataFree()", "ProTestDump()",
(ProError)err, err != PROEXTDATA_TK_NO_ERROR);
}
}
fclose(fp);
ProArrayFree((ProArray *)&class_name_list);
ProArrayFree((ProArray *)&slot_name_list);
ProArrayFree((ProArray *)&slot_id_list);
ProStringToWstring(w_fname, fname);
ProInfoWindowDisplay(w_fname, NULL, NULL);
return(PRO_TK_NO_ERROR);
}
/*====================================================================*\
Function : ProTestDeleteC
Purpose : Delete the selected class
\*====================================================================*/
int ProTestDeleteC(
ProMdl p_model)
{
ProExtdataClass data_class;
ProExtdataErr err;
if(!ProTestSelectClass(p_model, &data_class))
return(PRO_TK_BAD_INPUTS);
err = ProExtdataClassUnregister(&data_class);
TEST_CALL_REPORT("ProExtdataClassUnregister()", "ProTestDeleteC()",
(ProError)err, err != PROEXTDATA_TK_NO_ERROR);
if(err != PROEXTDATA_TK_NO_ERROR)
{
ProUtilMsgPrint("gendata","TEST ProExtdataClassUnregister() status : %0s",
ProTestProAppdataErr(err));
return(PRO_TK_GENERAL_ERROR);
}
return(PRO_TK_NO_ERROR);
}
/*====================================================================*\
Function : ProTestDelete
Purpose : Delete the selected slot
\*====================================================================*/
int ProTestDelete(
ProMdl p_model)
{
ProExtdataClass data_class;
ProExtdataSlot data_slot;
int keyby;
ProExtdataErr err;
if(!ProTestSelectClass(p_model, &data_class))
return(PRO_TK_BAD_INPUTS);
if(!ProTestSelectSlot(&data_class, &keyby, &data_slot))
return(PRO_TK_BAD_INPUTS);
err = ProExtdataSlotDelete(&data_slot, keyby);
TEST_CALL_REPORT("ProExtdataSlotDelete()", "ProTestDelete()",
(ProError)err, err != PROEXTDATA_TK_NO_ERROR);
if(err != PROEXTDATA_TK_NO_ERROR)
{
ProUtilMsgPrint("gendata","TEST ProExtdataSlotDelete() status : %0s",
ProTestProAppdataErr(err));
return(PRO_TK_GENERAL_ERROR);
}
return(PRO_TK_NO_ERROR);
}
/*====================================================================*\
Function : ProTestRefresh
Purpose : Reload the generic data from the file.
\*====================================================================*/
int ProTestRefresh(
ProMdl p_model)
{
ProExtdataErr err;
err = ProExtdataTerm(p_model);
TEST_CALL_REPORT("ProExtdataTerm()", "ProTestRefresh()",
(ProError)err, err != PROEXTDATA_TK_NO_ERROR);
if(err != PROEXTDATA_TK_NO_ERROR)
{
ProUtilMsgPrint("gendata","TEST ProExtdataTerm() status : %0s",
ProTestProAppdataErr(err));
return(PRO_TK_GENERAL_ERROR);
}
err = ProExtdataInit(p_model);
TEST_CALL_REPORT("ProExtdataInit()", "ProTestRefresh()",
(ProError)err, err != PROEXTDATA_TK_NO_ERROR);
if(err != PROEXTDATA_TK_NO_ERROR)
{
ProUtilMsgPrint("gendata","TEST ProExtdataInit() status : %0s",
ProTestProAppdataErr(err));
return(PRO_TK_GENERAL_ERROR);
}
err = ProExtdataLoadAll(p_model);
TEST_CALL_REPORT("ProExtdataLoadAll()", "ProTestRefresh()",
(ProError)err, err != PROEXTDATA_TK_NO_ERROR);
if(err != PROEXTDATA_TK_NO_ERROR)
{
ProUtilMsgPrint("gendata","TEST ProExtdataLoadAll() status : %0s",
ProTestProAppdataErr(err));
return(PRO_TK_GENERAL_ERROR);
}
return(PRO_TK_NO_ERROR);
}