Francisco Leon
asked on
Read spool files from iseries in C#
I am trying to read spool files from iseries in C# with the cwbx library, to that avail i have read the api and called the QUSCRTUS API in order to create an user space and then QUSLSPL to fill the user space with my user's spool data.
So far so good, i can see the user space being filled with the info i need:
My problem is that i don't know how to call the QUSRTVUS API in order to read the user space. I don't want to call any service program or code something in the iseries, i want everything to be done in my C# application. When i call the api i only see some x's instead of the list entries i need to then call the final API to read the contents.
Here's the call i am doing:
I am using the SPLF0100 format. My problem could be that the API is expecting binary variables instead of char or integers, so i may not know how to properly convert the data in the parameters. I tried to use a structure as shown above but i don't know if the length of each field can be declared literally from the api, which shows each field type and size.
For reference, the api documentation is in http://www-01.ibm.com/support/knowledgecenter/ssw_i5_54/apis/qusrtvus.htm
So far so good, i can see the user space being filled with the info i need:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Ø0100SPLF0100QUSLSPL 1151007110852C h { Y ¢ ø
Ç ì FLEON QGPL SPLF0100*CURRENT *ALL *ALL
*ALL
xxxxxxxxFLEON *ALL FLEON QGPL
*ALL *ALL FLEON PRTCAJOD20QGPL *STD FLEON i ?» pà'e ®ø G W µià'wÇô} FLE
ON PRTCONT01 QUSRSYS *STD SIPD93 i "ë q @ lÚ èM´ ié@ÑÆ/- FLEON PRTINF01 QUSRSYS *STD HJ
PD05 i ø qÀ¦ü¶³} D Õ àiÀ¥] É\ FLEON PRTVILLA05QUSRSYS CHEQUES FLEON i r pø_ ½ ø Õ' ãiø_ j \
FLEON RGI462 QUSRSYS *STD CLPD741 i h ºmi)oNø åÕ ÏimýS Aµ FLEON PRTCON0206QUSRSYS *S
TD HJPD27 i +¿ rk:ôá{{ ik:T ° FLEON PRTPACO QUSRSYS *STD SIPD93 i "ë q @ lÚ Ñã·
i<º3 ê\ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
My problem is that i don't know how to call the QUSRTVUS API in order to read the user space. I don't want to call any service program or code something in the iseries, i want everything to be done in my C# application. When i call the api i only see some x's instead of the list entries i need to then call the final API to read the contents.
Here's the call i am doing:
programPointer.LibraryName = "QSYS";
programPointer.ProgramName = "QUSRTVUS";
programPointer.system = system;
ProgramParameters parametersPointer = new ProgramParameters();
//nombre userspace creado anteriormente
parametersPointer.Append("usrspcnam", cwbrcParameterTypeEnum.cwbrcInout, 20);
stringConverterUsrspcnam.Length = 20;
parametersPointer["usrspcnam"].Value = stringConverterUsrspcnam.ToBytes("FLEON QGPL ");
//posicion
parametersPointer.Append("posicion", cwbrcParameterTypeEnum.cwbrcInout, 4);
LongConverter packedCovertedPosicion = new cwbx.LongConverterClass();
parametersPointer["posicion"].Value = packedCovertedPosicion.ToBytes(1);
//longitud
parametersPointer.Append("longitud", cwbrcParameterTypeEnum.cwbrcInout, 4);
LongConverterClass packedConverterLongitud = new cwbx.LongConverterClass();
parametersPointer["longitud"].Value = packedConverterLongitud.ToBytes(140);
//receptor
parametersPointer.Append("receptor", cwbrcParameterTypeEnum.cwbrcOutput, 4);
programPointer.Call(parametersPointer);
Structure sc = new Structure();
sc.Fields.Append("userarea", 64);
sc.Fields.Append("sizeheader", 4);
sc.Fields.Append("structurelevel", 4);
sc.Fields.Append("formatname", 8);
sc.Fields.Append("apiused", 10);
sc.Fields.Append("datecreated", 13);
sc.Fields.Append("infostatus", 1);
sc.Fields.Append("usersize", 4);
sc.Fields.Append("offsetinput", 4);
sc.Fields.Append("sizeinput", 4);
sc.Fields.Append("offsetheader", 4);
sc.Fields.Append("sizeheader", 4);
sc.Fields.Append("offsetlist", 4);
sc.Fields.Append("sizelist", 4);
sc.Fields.Append("numberlist", 4);
sc.Fields.Append("sizeentry", 4);
sc.Bytes = parametersPointer["receptor"].Value;
StringConverter datos = new cwbx.StringConverterClass();
string dat = datos.FromBytes(sc.Fields["apiused"].Value);
dat = datos.FromBytes(sc.Fields["datecreated"].Value);
I am using the SPLF0100 format. My problem could be that the API is expecting binary variables instead of char or integers, so i may not know how to properly convert the data in the parameters. I tried to use a structure as shown above but i don't know if the length of each field can be declared literally from the api, which shows each field type and size.
For reference, the api documentation is in http://www-01.ibm.com/support/knowledgecenter/ssw_i5_54/apis/qusrtvus.htm
'Starting position' and 'Length of data' are both 4-byte (32-bit) binary integers.
Of more concern, though, might be that the content of the user space is going to be EBCDIC and including various printer controls, along with various binary integer values for lengths, offsets, etc. That means that you need to ensure that no EBCDIC/ASCII conversion happens when a buffer comes across the connection and that you process buffer data bytes accordingly.
Of more concern, though, might be that the content of the user space is going to be EBCDIC and including various printer controls, along with various binary integer values for lengths, offsets, etc. That means that you need to ensure that no EBCDIC/ASCII conversion happens when a buffer comes across the connection and that you process buffer data bytes accordingly.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
i fixed it myself
ASKER