Return to Tech Notes Page
WTXSAMP2.C
/****** Beginning of sample code WTXSAMP2.C  **************************************/
/************************************************************************/
/*                Technical Note   WTXSAMP2.C                   */                                                                   
/*     A piece of sample code to clarify the technote File Transfer   
************************************************************************/              
#include "windows.h"            
#include "memory.h"
#include "stdio.h"
 
// Globals
#define         gAPPLNAME    "WTSample"
#define         eXfr_APIXLAT 0x4050
#define         eXfr_NOMEMRY 0x4061
 
unsigned int    gRETURN;
unsigned char   gMSG[120];
unsigned char   gERRORINFO[255];
HANDLE          gHDLL; 
 
LRESULT CALLBACK fWndProc(HWND, unsigned int, WPARAM, LPARAM);
void PASCAL fSetupAPIError(HWND ,int);
 
int PASCAL WinMain(HANDLE hInstance,
                   HANDLE hPrevInstance,
                   LPSTR  lpCmdLine,
                   int    nCmdShow)
{
    WNDCLASS        vWndClass;
    unsigned int    vPVal;
    unsigned int    vRVal;
    unsigned int    vType;
    unsigned int    vErrCode;
    unsigned char   vExec[120]; 
     
    BOOL            vBeg, vEnd, vPgm, vErr;
    MSG             vMsg;
    
// Variables we'll reference are now defined, so let's get started.
 
// First, we'll build a window so that we will be able to get messages
//   from the WinTran program.  We don't have to show the window -- in 
//   fact, we won't.
 
    memset(&vWndClass,0,sizeof(WNDCLASS));
    vWndClass.lpfnWndProc = fWndProc; 
    vWndClass.hInstance = hInstance; 
    vWndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    vWndClass.lpszClassName = "WTSAMPLE"; 
 
    gRETURN = RegisterClass (&vWndClass);
    if (gRETURN == 0)
       {
       // Error in Registering Class
       MessageBeep(0);
       MessageBox(NULL, "RegisterClass! - ERROR", gAPPLNAME, MB_OK | MB_ICONSTOP);
       return(TRUE);
       }
 
    gHDLL = CreateWindow("WTSAMPLE",NULL,WS_POPUP,1,1,1,1,NULL,NULL,hInstance,NULL);
    if (gHDLL == 0)
       {
       // Error in Creating Window
       MessageBeep(0);
       MessageBox(NULL, "CreateWindow! - ERROR", gAPPLNAME, MB_OK | MB_ICONSTOP);
       return(TRUE);
       }
 
// This is the value we'll use with the command line "/P" option
//   to identify OUR messages from the file transfer program.  This
//   value will also appear as the first 4 characters in our entries
//   in the log file.
 
    vPVal=1000;
 
// This is a number to add to the Request Name the so that the program may loop thru
//   and add 1 to this number and and execute different requests.
 
    vRVal=0;   
 
// Since we're going to be monitoring for messages from the file
//   transfer program, we must register its message type before
//   executing the transfer program.
 
    vType=RegisterWindowMessage("XfrPgmCtlMsg");
    if (vType == 0)
       {
       // Error in Register Window Message
       MessageBeep(0);
       MessageBox(NULL, "RegisterWindowMessage! - ERROR", gAPPLNAME, MB_OK | MB_ICONSTOP);
       return(TRUE);
       }
 
// Now we'll construct the command line.  All parms are 
//   case-insensitive.  Note that we'll need to change some values
//   if we rename the file transfer program or its directory (or
//   if we ever want to execute a different transfer request file).
 
///////////////// ********************************************* //////////////////////////////////
// Also note that one file transfer is done before starting another one                         //
//   the program WAS written this way on purpose.  If you try and WIN_EXEC multiple transfers   //
//   they will work as long as you don't use and modal dialogues to display errors, but if you  //
//   (like this programd does) messages WILL be lost when the dialogue is put up.               //
//   Also this way you can write the program to do certain things if a transfer doesn't         //  
//   finish correctly.                                                                          //
///////////////// ********************************************* //////////////////////////////////
 
Again:
 
    vPVal = vPVal + 1; //   change the "/P" option that identifies OUR messages
 
    if (vRVal ==2) // if it is the third request make it a transfer to the AS/400
 
        {   // Make sure to change Path to Your location of Transfer program
        sprintf(vExec,"D:\\DEV\\wt32\\WT400XFR.EXE XFERREQ%0d.P2A /P%04d",vRVal,vPVal);
        }
    else    // all other requests are downloads
 
        {   // Make sure to change Path to Your location of Transfer program
        sprintf(vExec,"D:\\DEV\\wt32\\WT400XFR.EXE XFERREQ%0d.A2P /P%04d",vRVal,vPVal);
        }
 
// Now We're ready to evoke the file transfer program.  Let's do it.
 
    gRETURN = WinExec(vExec,SW_HIDE);
 
    if (gRETURN == ERROR_BAD_FORMAT)
       {
       // Display error message for Bad format!
       MessageBeep(0);
       MessageBox(NULL, "WinExec CMD! - BAD_FORMAT", gAPPLNAME, MB_OK | MB_ICONSTOP);
       return(TRUE);
       }
 
    if (gRETURN == ERROR_FILE_NOT_FOUND)
       {
       // Display error message for File not Found!
       MessageBeep(0);
       MessageBox(NULL, "WinExec CMD! - FILE_NOT_FOUND", gAPPLNAME, MB_OK | MB_ICONSTOP);
       return(TRUE);
       }
    if (gRETURN == ERROR_PATH_NOT_FOUND)
       {
       // Display error message for path not found!
       MessageBeep(0);
       MessageBox(NULL, "WinExec CMD! - PATH_NOT_FOUND", gAPPLNAME, MB_OK | MB_ICONSTOP);
       return(TRUE);
       }
 
//  Note that we set the second parameter to SW_HIDE.  This is 
//   used to circumvent WinTran's password protection, just in case.
//   We didn't want the transfer to hang, waiting for someone
//   to enter a password -- after all, we might have been started
//   automatically by a "scheduler" program.  One other note: 
//   32-bit programs might use the "CreateProcess" function, instead
//   of "WinExec", to evoke another program.  If so, the "STARTUPINFO"
//   structure would contain the SW_HIDE parameter.
 
vRVal = vRVal + 1; // increment counter of number of transfers submitted
 
// Assuming that WinExec worked, we're now going to enter our message
//   loop to monitor the progress of the transfer.  Here we go...
 
    vBeg=vEnd=vPgm=vErr=0;              // Clear our flags
    while (GetMessage(&vMsg,0,0,0))     // Retrieve message(s)
    {
        if (vMsg.message == vType)          // A message from WinTran?
        {                                   // It is!!                                
            if (vMsg.wParam == vPVal)           // One of ours?
            {                                   // It is, check further.
                if (LOWORD(vMsg.lParam) == 0)   // Started Transfer?
                    vBeg = TRUE;                    // Yep, set a flag
                if (LOWORD(vMsg.lParam) == 1)   // Transfer Ended?
                    { 
                    vEnd = TRUE;                    // Yep, set a flag
                    }
                if (LOWORD(vMsg.lParam) == 2)   // Transfer Error?
                    {                               // Yep, set a flag &
                    vErr = TRUE;                    // Get possible code
                    vErrCode = (unsigned int)HIWORD(vMsg.lParam); 
                    }
                if (LOWORD(vMsg.lParam) == 3)   // Did WinTran even start?
                    {  
                    vPgm = TRUE;                    // Nope, set a flag
                    }  
            }
        }
 
        // If not a message from WinTran, just process like any other
        //   Windows message.
 
        else
            {
            TranslateMessage(&vMsg);
            DispatchMessage(&vMsg);
            }
 
        // Now that we're done processing messages, let's check our flags.
 
        if (vBeg)               // OK, the transfer started.  If we were
            {                   //   ambitious, we might want to start
            }                   //   a timer or sumpin, just for grins.
               
        if (vEnd)               // Has the transfer ended?  if so 
            {                   //   end what was started for this tranfer and
             if (vRVal >= 4)         // are all transfers done?, if so
                 PostQuitMessage(0); //   we can exit.
             else   
                 goto Again;         // else do the next transfer                        
            }                   //   also do what ever processing is required.
 
        if (vErr)               // If we've encountered an error, we
            {                                       //   may want to do something with the
            fSetupAPIError(hInstance, vErrCode);    //   information, who knows?
            MessageBeep(0);              
            MessageBox(NULL, gERRORINFO, gAPPLNAME, MB_OK | MB_ICONSTOP);
            
            if (vRVal >= 4)         // are all transfers done?, if so
                PostQuitMessage(0); //   we can exit.
            else   
                goto Again;         // else do the next transfer                  
            }
 
   
    }       
    return(0);      // Aw, someone posted a quit message.  We could, of
                    //  course, still do something useful with this program
}                   //  but, instead, we'll just exit;
 
/****************************************************************************/
/*  fSetupAPIError - Get the additional error information, call error dialog*/
/****************************************************************************/
 
void PASCAL fSetupAPIError(HWND hInstance,int vErrCode)
{
int vRECORDCNT = 0;
unsigned char   vWRKSTR[255];
unsigned char   vTEMPSTR[255];
 
if (vErrCode == -1) // Load No Memory error message
    {
    LoadString(hInstance,eXfr_NOMEMRY,vTEMPSTR,255);
    }
else if (vErrCode < 256) // Error in field # (1 - 256)
        {
        LoadString(hInstance,eXfr_APIXLAT,vWRKSTR,255);
        sprintf(vTEMPSTR,vWRKSTR,vErrCode,vRECORDCNT);
        }
else
    {
    LoadString(hInstance,vErrCode,vTEMPSTR,255); // Load rest of errors from string table
    }
 wsprintf((LPSTR)gERRORINFO, "Error code: x%04X\n\r%s", vErrCode, (LPSTR) vTEMPSTR); // display error code and message   
}
 
// Just a minimal window procedure follows.
 
LRESULT CALLBACK fWndProc(HWND vWnd, unsigned int iMessage, 
                          WPARAM wParam, LPARAM lParam)
{
    return DefWindowProc (vWnd, iMessage, wParam, lParam) ;
}
 
 
/****** End of sample code WTXSAMP2.C  **************************************/
 
 
 
/****** Beginning of sample code WTXSAMP2.RC  *******************************/
 
/************************************************************************/
/*                Synapse Communications Technical Note                 */
/*                    WTXSAMP2.RC  -- January 28, 1996                  */
/*                                                                      */
/*     A piece of sample code to clarify the technote WTXFER.DOC        */
/*                              RESOURCE                                */
/************************************************************************/
 
#include "windows.h"
 
// API and disk I/O error messages
#define eXfr_API0103Msg     "Internal error#0 - contact technical support."
#define eXfr_API0300Msg     "Untranslatable data found in transferred record."
#define eXfr_API0302Msg     "Untranslatable data found in transferred record."
#define eXfr_API0400Msg     "Warning - the AS/400 member will be overwritten."
#define eXfr_API2000Msg     "Maximum number of Transfer Requests are active."
#define eXfr_API2001Msg     "Transfer Request length length not valid."
#define eXfr_API2002Msg     "Transfer Request character cannot be translated."
#define eXfr_API2003Msg     "Untranslatable numeric data found."
#define eXfr_API2004Msg     "Numeric data is too large for field."
#define eXfr_API2005Msg     "Record length given is incorrect."
#define eXfr_API2007Msg     "Null map offset is incorrect"
#define eXfr_API2008Msg     "Total length of record exceeds 4096 bytes."
#define eXfr_API2009Msg     "Internal error#1 - contact technical support."
#define eXfr_API2010Msg     "Internal error#2 - contact technical support."
#define eXfr_API2011Msg     "Internal error#3 - contact technical support."
#define eXfr_API2012Msg     "Internal error#4 - contact technical support."
#define eXfr_API2013Msg     "Internal error#5 - contact technical support."
#define eXfr_API2019Msg     "Internal error#6 - contact technical support."
#define eXfr_API2020Msg     "Internal error#7 - contact technical support."
#define eXfr_API2021Msg     "Internal error#8 - contact technical support."
#define eXfr_API2022Msg     "Internal error#9 - contact technical support."
#define eXfr_API2023Msg     "Internal error#A - contact technical support."
#define eXfr_API2024Msg     "Internal error#B - contact technical support."
#define eXfr_API2025Msg     "Internal error#C - contact technical support."
#define eXfr_API2026Msg     "Internal error#D - contact technical support."
#define eXfr_API2027Msg     "Internal error#E - contact technical support."
#define eXfr_API2028Msg     "Internal error#F - contact technical support."
#define eXfr_API2029Msg     "PCSWIN buffer space exhausted."
#define eXfr_API2030Msg     "Options statement not supported on this system."
#define eXfr_API3000Msg     "Error detected by the host system.."
#define eXfr_API3100Msg     "Error detected by the host system."
#define eXfr_API5042Msg     "The router has not been started."
#define eXfr_API5048Msg     "Connection to the host system failed."
#define eXfr_API5050Msg     "System name is incorrect or inactive."
#define eXfr_API5052Msg     "System program not found."
#define eXfr_API5054Msg     "System program ended unexpectedly."
#define eXfr_API5056Msg     "Security error occurred on the host system."
#define eXfr_API5058Msg     "Host system is not a supported system."
#define eXfr_API5060Msg     "Host system is at an unsupported version, release or modification level."
#define eXfr_API5062Msg     "Contact with the host system ended."
#define eXfr_API5066Msg     "System resource failure."
#define eXfr_API5067Msg     "The conversation was ended unexpectedly."
#define eXfr_API5071Msg     "Insufficient memory."
#define eXfr_API5310Msg     "PCSWIN is not loaded."
#define eXfr_API5311Msg     "Cannot run in Windows real mode."
#define eXfr_API5400Msg     "Operating system error."
#define eXfr_API9999Msg     "Undefined Error: %0d - contact technical support."
 
#define eXfr_APIXLATMsg     "Unable to translate field %0d in record %0ld."
#define eXfr_RDFOPENMsg     "Error opening Source PC file."
#define eXfr_RDFREADMsg     "Error reading Source PC file."
#define eXfr_RDFNOFDMsg     "Source PC file has invalid format."
#define eXfr_WDFOPENMsg     "Error opening Target PC file."
#define eXfr_WDFWRITMsg     "Error writing Target PC file."
#define eXfr_FDFOPENMsg     "Error opening PC File Description File."
#define eXfr_FDFWRITMsg     "Error writing PC File Description File."
#define eXfr_FDFREADMsg     "Error reading PC File Description File."
#define eXfr_FDFNOFDMsg     "Not a valid PC File Description File."
#define eXfr_FDNOSAVMsg     "Invalid SAVE file format."
#define eXfr_NOMEMRYMsg     "Unable to allocate/free Windows memory."
#define eXfr_TOPCWRNMsg     "Warning - the target PC file will be overwritten."
 
 
STRINGTABLE
    BEGIN
    0x0104,    eXfr_RDFOPENMsg
    0x0105,    eXfr_RDFREADMsg
    0x0106,    eXfr_RDFNOFDMsg
    0x0107,    eXfr_WDFOPENMsg
    0x0108,    eXfr_WDFWRITMsg
    0x0109,    eXfr_FDFOPENMsg
    0x010A,    eXfr_FDFWRITMsg
    0x010B,    eXfr_FDFREADMsg
    0x010C,    eXfr_FDFNOFDMsg
    0x010D,    eXfr_FDNOSAVMsg
 
    0x4050,    eXfr_APIXLATMsg
    0x4061,    eXfr_NOMEMRYMsg
 
 
    0x0103,    eXfr_API0103Msg
    0x0300,    eXfr_API0300Msg
    0x0302,    eXfr_API0302Msg
    0x0400,    eXfr_API0400Msg
    0x2000,    eXfr_API2000Msg
    0x2001,    eXfr_API2001Msg
    0x2002,    eXfr_API2002Msg
    0x2003,    eXfr_API2003Msg
    0x2004,    eXfr_API2004Msg
    0x2005,    eXfr_API2005Msg
    0x2007,    eXfr_API2007Msg
    0x2008,    eXfr_API2008Msg
    0x2009,    eXfr_API2009Msg
    0x2010,    eXfr_API2010Msg
    0x2011,    eXfr_API2011Msg
    0x2012,    eXfr_API2012Msg
    0x2013,    eXfr_API2013Msg
    0x2019,    eXfr_API2019Msg
    0x2020,    eXfr_API2020Msg
    0x2021,    eXfr_API2021Msg
    0x2022,    eXfr_API2022Msg
    0x2023,    eXfr_API2023Msg
    0x2024,    eXfr_API2024Msg
    0x2025,    eXfr_API2025Msg
    0x2026,    eXfr_API2026Msg
    0x2027,    eXfr_API2027Msg
    0x2028,    eXfr_API2028Msg
    0x2029,    eXfr_API2029Msg
    0x2030,    eXfr_API2030Msg
    0x3000,    eXfr_API3000Msg
    0x3100,    eXfr_API3100Msg
    0x5042,    eXfr_API5042Msg
    0x5048,    eXfr_API5048Msg
    0x5050,    eXfr_API5050Msg
    0x5052,    eXfr_API5052Msg
    0x5054,    eXfr_API5054Msg
    0x5056,    eXfr_API5056Msg
    0x5058,    eXfr_API5058Msg
    0x5060,    eXfr_API5060Msg
    0x5062,    eXfr_API5062Msg
    0x5066,    eXfr_API5066Msg
    0x5067,    eXfr_API5067Msg
    0x5071,    eXfr_API5071Msg
    0x5310,    eXfr_API5310Msg
    0x5311,    eXfr_API5311Msg
    0x5400,    eXfr_API5400Msg
    0x9999,    eXfr_API9999Msg
 END             
/****** End of sample code for WTXSAMP2.RC  **********************************************/
 
 
Below are sample A2P and P2A files and a copy of the data that is generated in WTXFRPGM.LOG
    The first request XFERREQ0.A2P has and error the other three will work. 
    Request XFERREQ2.P2A will work the first time but would need to be changed to
    update member to work on additional executions.
 
These files would be placed in your transfer directory!!
 
 
/********************   XFERREQ0.A2P FILE  Begin   ************************************/
[General]
Type=A2P
Description=WTSample Transfer Request for Test *PGM
SystemName=*Default
PCFileType=Text
FieldDesFile=
RetBlkRecs=yes
AllRecords=yes
FromRecord=1
ToRecord=1
 
[SavePCFileTo]
Type=*None
Name=C:\qapzcover.txt
 
[OutputFormatTo]
Type=*None
Name=*None
 
[Date]
Format=MDY
Separator=/
 
[Decimal]
IgnoreErrors=yes
Separator=.
 
[Time]
Format=USA
Separator=:
 
[Options]
RunIconized=no
ShowPercent=no
Notify=no
Exit=no
Warn=no
ToolBox=Tall
CharSet=ANSI
 
[HostFile]
Member01=qgpl/qapzcoverx
/********************   XFERREQ0.A2P FILE  End   ************************************/
 
 
 
/********************   XFERREQ1.A2P FILE  Begin   ************************************/
[General]
Type=A2P
Description=WTSample Transfer Request for Test *PGM
SystemName=*Default
PCFileType=Text
FieldDesFile=
RetBlkRecs=yes
AllRecords=yes
FromRecord=1
ToRecord=1
 
[SavePCFileTo]
Type=*None
Name=c:\qapzcover.txt
 
[OutputFormatTo]
Type=*None
Name=*None
 
[Date]
Format=MDY
Separator=/
 
[Decimal]
IgnoreErrors=yes
Separator=.
 
[Time]
Format=USA
Separator=:
 
[Options]
RunIconized=no
ShowPercent=no
Notify=no
Exit=no
Warn=no
ToolBox=Tall
CharSet=ANSI
 
[HostFile]
Member01=qgpl/qapzcover
/********************   XFERREQ1.A2P FILE  End  ************************************/
 
 
 
 
/********************   XFERREQ2.P2A FILE  Begin   ************************************/
[General]
Type=P2A
Description=Upload to AS/400 New file
SystemName=*Default
PCFileType=Text
FieldDesFile=
RetBlkRecs=yes
AllRecords=yes
FromRecord=1
ToRecord=1
ToHostMember=qgpl/qapzcoverz
FromPCFile=c:\qapzcover.txt
 
[SavePCFileTo]
Type=*None
Name=c:\qapzcover.txt
 
[OutputFormatTo]
Type=*None
Name=*None
 
[Date]
Format=MDY
Separator=/
 
[Decimal]
IgnoreErrors=yes
Separator=.
 
[Time]
Format=USA
Separator=:
 
[Options]
RunIconized=no
ShowPercent=yes
Notify=yes
Exit=no
Warn=yes
ToolBox=Tall
CharSet=ANSI
 
[HostFile]
Member01=qgpl/qapzcover
 
[Advanced]
HostCreation=New file and member
HostFileDes=
HostMemberDes=
HostFileType=Data
PCFileType=Text
PCRecordLen=92
HostFieldDefFile=qgpl/qapzcover
HostObjAuthority=Read/Write/Delete
 
/********************   XFERREQ2.P2A FILE  End  ************************************/
 
 
 
/********************   XFERREQ3.A2P FILE  Begin   ************************************/
[General]
Type=A2P
Description=WTSample Transfer Request for Test *PGM
SystemName=*Default
PCFileType=Text
FieldDesFile=
RetBlkRecs=yes
AllRecords=yes
FromRecord=1
ToRecord=1
 
[SavePCFileTo]
Type=*None
Name=c:\qapzcover.txt
 
[OutputFormatTo]
Type=*None
Name=*None
 
[Date]
Format=MDY
Separator=/
 
[Decimal]
IgnoreErrors=yes
Separator=.
 
[Time]
Format=USA
Separator=:
 
[Options]
RunIconized=no
ShowPercent=no
Notify=no
Exit=no
Warn=no
ToolBox=Tall
CharSet=ANSI
 
[HostFile]
Member01=qgpl/qapzcover
/********************   XFERREQ3.A2P FILE  End   ************************************/
 
 
/********************   Begining of Sample file WTXFRPGM.LOG   **********************/
1001 *Beg ---- 97.02.14/12:23:17 D:\DEV\WT32\XFERREQ0.A2P
1001 *Err 3000 97.02.14/12:23:30 D:\DEV\WT32\XFERREQ0.A2P
         Error detected by the host system..
1001 *End ---- 97.02.14/12:23:30 D:\DEV\WT32\XFERREQ0.A2P
1002 *Beg ---- 97.02.14/12:23:43 D:\DEV\WT32\XFERREQ1.A2P
1002 *End ---- 97.02.14/12:24:01 D:\DEV\WT32\XFERREQ1.A2P
1003 *Beg ---- 97.02.14/12:24:02 D:\DEV\WT32\XFERREQ2.P2A
1003 *End ---- 97.02.14/12:24:18 D:\DEV\WT32\XFERREQ2.P2A
1004 *Beg ---- 97.02.14/12:24:19 D:\DEV\WT32\XFERREQ3.A2P
1004 *End ---- 97.02.14/12:24:30 D:\DEV\WT32\XFERREQ3.A2P
/********************   End of Sample file WTXFRPGM.LOG   ***************************/