// // TAP // Sample Application // Revision 1.10 // // 1/5/95 First created // #define INCL_DOS #include #include #include #include "tapapp.h" // // void RegisterSampleApplication(char *szProgramPath); // // Registers the TAP application so that any // TAP server on the system can find it. This function // need only be called once. // // Parameters: // szProgramPath // Fully qualified path to the executable. Must include .EXE // extension. // EX: C:\TAPSAMP.EXE // // Returns: Nothing // void RegisterSampleApplication(char *szProgramPath) { TAPAPPENTRY TapAppEntry; // Fill in information structure TapAppEntry . cb = sizeof(TAPAPPENTRY); // Each TAP application can have a description // up to 256 characters and 6 lines long strcpy(TapAppEntry . szDescription, "This is a sample TAP application " // "used for development purposes.\n\r\n\r" // "Each file encountered is displayed " // "along with its data as the transfer " // "progresses." ); // Any extra parameters needed to be passed go here strcpy(TapAppEntry . szParams, ""); strcpy(TapAppEntry . szProgram, szProgramPath); // No extensions for this application TapAppEntry . ulExtensions = 0; // // Register this TAP application // // This registration can be removed later with // DeRegisterApplication_TAP // if (!RegisterApplication_TAP("TAP Development Sample", &TapAppEntry)) printf("Error : Could not register TAP application\n"); else printf("Application registered successfully\n"); } // // void ProcessData(HFILE TAPFile, // long lCurrentFileSize); // // This function is called when new data needs to // be processed by the TAP application. This is the // place where a GIF viewer might interpret new data // and display it as a picture on the screen. // // The code here is only a sample of what can be done, // and if you are basing your TAP application on this // source it's best if you replace this entire function. // // Parameters: // TAPFile // OS/2 file handle (for use with Dosxxx commands) // that has read-only access to the file being // transferred. // lCurrentFileSize // The current file size. Attempts to read past // past this point will normally fail. // // Returns: Nothing // void ProcessData(HFILE TAPFile, long lCurrentFileSize) { unsigned char szBuf[10]; ULONG BytesRead; APIRET rc = 0; int cnter; // Seek to the end of the file, // minus ten bytes rc |= DosSetFilePtr(TAPFile, lCurrentFileSize - 10, FILE_BEGIN, &BytesRead); // Read those ten last bytes rc |= DosRead(TAPFile, szBuf, 10, &BytesRead); // If we didn't read ten bytes, // there was an error if (BytesRead<10) rc = 1; if (rc) // Something went wrong printf("%8d : error reading\n", lCurrentFileSize); else { // Print current file size printf("%8d Data :", lCurrentFileSize); // And then display last 10 bytes of data // in hexidecimal format for (cnter=0; cnter<10; cnter++) printf(" %2.2X", szBuf[cnter]); // Carriage return: don't fill up the // screen w printf("%c",13); // Need to flush if our compiler has buffered output // (Note that buffered output is only flushed for LF, not CR !) fflush (stdout); } } // // int main(int argc, char **argv); // // Main TAP function. // // This function registers the TAP // application, then attempts to start // a TAP session. // // The standard structure of a TAP // application must be: // // Initialize(); // while (NextFile) // { // OpenFile(); // while (MoreData) // ProcessData(); <-- Here's where your // ProcessData(); <-- application does its work // CloseFile(); // } // DeInitialize(); // // Parameters: // It's important to have the argc // and argv information around because // TAP initialize must parse the // command line. // // Returns: Return value unimportant to TAP // int main(int argc, char **argv) { PTAPAPPINFO pTapAppInfo; // TAP instance data structure // (You needn't worry about this) // // Attempt to register this application so // TAP servers can see it. // // The full path, as below, must be passed. // The program name is kept in argv[0] (ANSI standard) // but some compilers handle this differently. // // Borland C will give you the fully qualified path // while CSet will give you only the application name // typed at the command prompt. // // If you're one of those lucky people who are only // passed the file name you can construct a fully qualified // path name by calling DosQueryPathInfo with 2nd parameter // of FIL_QUERYFULLNAME. // // Les: I suggest you *always* call DosQueryPathInfo even though // Borland C already gives you the full name: DosQueryPathInfo // makes sure that the returned path is valid, etc. etc... { CHAR szFullPath[CCHMAXPATH]; strcpy (szFullPath, argv[0]); if (!strchr (szFullPath, '.')) strcat (szFullPath, ".EXE"); DosQueryPathInfo (szFullPath, FIL_QUERYFULLNAME, szFullPath, sizeof (szFullPath)); RegisterSampleApplication(szFullPath); } // Initialize the TAP subsystem pTapAppInfo = InitializeApplication_TAP(argc, argv); // On success we get a non-NULL pointer back if (pTapAppInfo) { CHAR szBuffer[32]; printf("Application initialized successfully\n\n"); QueryServerVersion_TAP (pTapAppInfo, szBuffer, sizeof (szBuffer)); printf ("Server Version: %s\n", szBuffer); // NextFile_TAP will wait for the next file to arrive. // If no more files are pending, NextFile_TAP will // return FALSE, otherwise TRUE while (NextFile_TAP(pTapAppInfo)) { char szFileName[CCHMAXPATH]; long lCompleteFileSize; long lCurrentFileSize; HFILE TAPFile; // Get the fully qualified name of the file QueryFileName_TAP(pTapAppInfo, szFileName); // Get the complete size of the file // -1 (TAP_SIZE_UNKNOWN) if we don't know it lCompleteFileSize = QueryCompleteSize_TAP(pTapAppInfo); // Display status printf("File : %s of size %d\n", szFileName, lCompleteFileSize); // Open the TAP file. The file must be opened // using this TAP API so file sharing can take place if (!OpenFile_TAP(pTapAppInfo, &TAPFile)) printf("Error opening file!\n"); // MoreData_TAP waits until new data has been // written to the file. // // If the end of file has been reached, or // the transfer has been cancelled MoreData_TAP // returns FALSE, otherwise TRUE. while (MoreData_TAP(pTapAppInfo)) { // Get the current file size // This will always be different from the last time lCurrentFileSize = QueryCurrentSize_TAP(pTapAppInfo); // Now process any new data ProcessData(TAPFile, lCurrentFileSize); } // Determine complete file length, // which may have changed if the // file was cut short DosSetFilePtr(TAPFile, 0, FILE_END, (PULONG)(PVOID)&(lCompleteFileSize)); // There may be some data we didn't // finish processing. Process all // data before opening a new file ProcessData(TAPFile, lCompleteFileSize); printf("\nFile complete at %d bytes\n\n", lCompleteFileSize); // Close the file: processing complete CloseFile_TAP(pTapAppInfo, TAPFile); } // We've dropped out of the main loop // so there are no more files printf("Transfer complete.\n"); // Deinitialize the TAP application DeInitializeApplication_TAP(pTapAppInfo); } else { printf("Error : Cannot initialize TAP application\n\n"); printf("Start this application from a TAP server\n"); } return 0; }