<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>SPS Blog</title>
    <link>http://www.sweetpotatosoftware.com/spsblog/</link>
    <description>Microsoft Programming Technologies</description>
    <language>en-us</language>
    <copyright>Craig Boyd</copyright>
    <lastBuildDate>Sun, 09 Aug 2009 23:16:26 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>craig@sweetpotatosoftware.com</managingEditor>
    <webMaster>craig@sweetpotatosoftware.com</webMaster>
    <item>
      <trackback:ping>http://www.sweetpotatosoftware.com/spsblog/Trackback.aspx?guid=d15a2956-55ed-4e7d-bfe9-ae7a18754b1b</trackback:ping>
      <pingback:server>http://www.sweetpotatosoftware.com/spsblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,d15a2956-55ed-4e7d-bfe9-ae7a18754b1b.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,d15a2956-55ed-4e7d-bfe9-ae7a18754b1b.aspx</wfw:comment>
      <wfw:commentRss>http://www.sweetpotatosoftware.com/spsblog/SyndicationService.asmx/GetEntryCommentsRss?guid=d15a2956-55ed-4e7d-bfe9-ae7a18754b1b</wfw:commentRss>
      <slash:comments>15</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The free vfpencryption71.fll and vfpencryption.fll have been updated. Changes include:
</p>
        <ul>
          <li>
Bug fixes for Blowfish encryption (including blocksize and allowing keysize between
8 and 448 bits)<br /></li>
          <li>
Bug fixes to modes CBC and CFB - operate correctly now.<br /></li>
          <li>
Added ability to specify padding, key size, block size, and initialization vector
(IV) where applicable (these changes allow compatibility with .NET and other encryption
systems as well as the ability to adhere specifically to the AES specification as
set out in the <a href="http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf">FIPS
197 Specification</a>).</li>
          <li>
Added mode OFB to encryption/decryption algorithms.<br /></li>
          <li>
Padding types supported are Zeroes (NULLs), Spaces (blanks), PKCS7, ANSI X.923, and
ISO 10126.</li>
          <li>
Added HMAC() function that works with all supported hash types.</li>
          <li>
Added VFP test program files to the downloads that allow developers to see for themselves
that return values are correct for various functions provided by the FLL.</li>
          <li>
Added GenerateKey() function that will return a random key or IV based on some specified
rules (parameters).<br /></li>
          <li>
Corrected and updated documentation (see below).</li>
        </ul>
Please provide feedback here or send me an email if you run into any problems with
this latest version. You'll be able to tell from the test program files (Test Vectors)
that I did a lot of testing on my own to make sure that this version was solid. I
also did a number of tests between .NET System.Security.Cryptography classes (such
as RijndaelManaged for instance) and this FLL to ensure that there was a good deal
of compatibility.<br /><br />
The vfpencryption71.fll requires the VC++ 7.1 runtimes whereas the vfpencryption.fll
requires the VC++ 9.0 runtimes. If you are getting a "FLL is Invalid" error when running
either of these FLLs it is because you are missing the runtimes on the system you
are deploying your application on. What about the previous vfpencryption.fll that
used the VC++ 8.0 runtimes? I continue to update to the latest Visual Studio (10.0
will be next) and I suggest you do the same. Most VFP developers are using the vfpencryption71.fll
as the C runtime matches the one used for VFP 9.0 (msvcr71.dll) and it provides the
exact same functionality as vfpencryption.fll. However, I have had numerous requests
for an updated build of the FLL using the latest Visual Studio, so I include it below.<br /><br /><p><a href="http://www.sweetpotatosoftware.com/files/vfpencryption71.zip">Download the
Latest Version of the vfpencryption71.fll</a> (134 KB approx.)<br /></p><p><a href="http://www.sweetpotatosoftware.com/files/vfpencryption90.zip">Download the
Latest Version of the vfpencryption.fll</a> (142 KB approx.)
</p><p><br /></p><p></p><font color="#006400" size="3"><strong><hr /></strong><font color="#ff0000"><font size="2"></font><strong>vfpencryption71.fll/vfpencryption.fll
Documentation...</strong></font></font><hr /><p></p><p></p><p><font color="#006400" size="3"><strong>Function ENCRYPT()</strong></font></p><p><strong>Signature</strong>: Encrypt(cStringtoEncrypt, cSecretKey[, nEncryptionType[,
nEncryptionMode[, nPaddingType[, nKeySize[, nBlockSize[, cIV]]]]]])
</p><p><strong>Parameters</strong>:
</p><p><font color="#006400">cStringtoEncrypt</font> - A plain text string that you want
to have encrypted, such as "Hello World!"
</p><p><font color="#006400">cSecretKey</font> - A plain text string that is the Key you
want used during encryption, such as "My_SeCrEt_KeY".<br />
Please note that keys may need to be of a particular length for certain types of encryption.
Refer below for more information.
</p><p><font color="#006400">nEncryptionType</font> - There are currently 5 types of encryption
available. The value of this parameter determines that type of encryption used and
how long your Secret Key should be. A single character in Visual FoxPro is equal to
1 byte or 8 bits. So an encryption algorithm requiring a 128-bit key would need a
Secret Key of 16 characters (16 x 8 = 128).<br /><br />
0 = Rijndael\AES 128 (requires a 16 character Key)<br />
1 = Rijndael\AES 192 (requires a 24 character Key)<br />
2 = Rijndael\AES 256 (requires a 32 character Key) *Default<br />
4 = Blowfish (key between 1 and 56 characters)<br />
8 = TEA (requires a 16 character Key)<br />
1024 = RC4 (Key can be any length)
</p><p><font color="#006400">nEncryptionMode</font> - There are three different modes available
for the each of the encryption types listed above. They include: Electronic Code Book
(ECB), Cipher Block Chaining (CBC), Cipher Feedback Block (CFB), and Output Feedback
Block. <font color="#ff0000">The nEncryptionMode parameter does not apply to RC4 encryption
(nEncryptionType = 1024).</font></p><p>
0 = ECB *Default<br />
1 = CBC<br />
2 = CFB<br />
3 = OFB
</p><p><font color="#006400">nPaddingMode</font> - For Block Ciphers the cStringtoEncrypt
is padded to a multiple of the block size for the algorithm. Setting this parameter
allows you to specify how this padding is done.<br /></p><p>
0 = Zeroes (NULLs) *Default<br />
1 = Spaces (blanks)<br />
2 = PKCS7<br />
3 = ANSI X.923<br />
4 = ISO 10126
</p><p><font color="#006400">nKeySize</font> - The size of the cSecretKey in bytes (characters).<br /></p><p><font color="#006400">nBlockSize</font> - The block size the nEncryptionType should
use.<br /></p><p><font color="#006400">cIV</font> - The Initialization Vector (IV) that should be used
for CBC, CFB, and OFB modes should use. This IV should match the specified nBlockSize
in total bytes (characters).<br /></p><p><strong>Return Value</strong>:
</p><p>
Character data type - the encrypted form of cStringtoEncrypt.
</p><p><strong>Remarks</strong>:
</p><p>
When saving the return value of Encrypt() function to a field in a table, remember
that Visual FoxPro will append blanks to the end of the string in order to fill the
character field to its designated length. This can cause problems when decrypting
the data as the spaces will be considered part of the encrypted string. To work around
this, I suggest placing a single CHR(0) at the end of the encrypted string when saving
it to the table. Then when decrypting the data just the portion prior to the CHR(0)
can be sent into the Decrypt() function. <font color="#ff0000">This does not apply
when using RC4 encryption (nEncryptionType = 1024).</font><br /></p><hr /><p></p><p><font color="#006400" size="3"><strong>Function DECRYPT()</strong></font></p><p><strong>Signature</strong>: Decrypt(cEncryptString, cSecretKey[, nDecryptionType[,
nDecryptionMode[, nPaddingType[, nKeySize[, nBlockSize[, cIV]]]]]])
</p><p><strong>Parameters</strong>:
</p><p><font color="#006400">cEncryptedString</font> - A string that has been encrypted using
the Encrypt() function.
</p><p><font color="#006400">cSecretKey</font> - A plain text string that is the same Key
that you used when you encrypted the data using the Encrypt function, such as "My_SeCrEt_KeY".<br />
Please note that keys may need to be of a particular length for certain types of decryption.
Refer below for more information.
</p><p><font color="#006400">nDecryptionType</font> - There are currently 5 types of decryption
available and they correspond to the same ones available in Encrypt(). A single character
in Visual FoxPro is equal to 1 byte or 8 bits. So an decryption algorithm requiring
a 128-bit key would need a Secret Key of 16 characters (16 x 8 = 128).<br /><br />
0 = Rijndael\AES 128 (requires a 16 character Key)<br />
1 = Rijndael\AES 192 (requires a 24 character Key)<br />
2 = Rijndael\AES 256 (requires a 32 character Key) *Default<br />
4 = Blowfish (key between 1 and 56 characters)<br />
8 = TEA (requires a 16 character Key)<br />
1024 = RC4 (Key can be any length) 
</p><p><font color="#006400">nDecryptionMode</font> - There are three different modes available
for the each of the encryption types listed above. They include: Electronic Code Book
(ECB), Cipher Block Chaining (CBC), Cipher Feedback Block (CFB), and Output Feedback
Block. <font color="#ff0000">The nDecryptionMode parameter does not apply to RC4 decryption
(nDecryptionType = 1024).</font></p><p>
0 = ECB *Default<br />
1 = CBC<br />
2 = CFB<br />
3 = OFB 
</p><p><font color="#006400">nPaddingMode</font> - For Block Ciphers the cStringtoEncrypt
is padded to a multiple of the block size for the algorithm. Setting this parameter
allows you to specify how this padding is done.<br /></p><p>
0 = Zeroes (NULLs) *Default<br />
1 = Spaces (blanks)<br />
2 = PKCS7<br />
3 = ANSI X.923<br />
4 = ISO 10126
</p><p><font color="#006400">nKeySize</font> - The size of the cSecretKey in bytes (characters).<br /></p><p><font color="#006400">nBlockSize</font> - The block size the nEncryptionType should
use.<br /></p><p><font color="#006400">cIV</font> - The Initialization Vector (IV) that should be used
for CBC, CFB, and OFB modes should use. This IV should match the specified nBlockSize
in total bytes (characters).<br /><br /><strong>Return Value</strong>:
</p><p>
Character data type - the decrypted form of cEncryptedString followed by a variable
number of CHR(0)s. See Remarks below for further clarification
</p><p><strong>Remarks</strong>:
</p><p><font color="#ff0000">IMPORTANT</font>: Decryption is done on blocks of memory, so
when the decrypt function returns the encrypted string it will be followed by a variable
number of CHR(0)s unless the decrypted string just happens to end at exactly the same
location as the last block decrypted. These extraneous CHR(0)'s can be removed using
a number of Visual FoxPro functions, such as STRTRAN(), CHRTRAN(), or a combination
of LEFT() and AT(). <font color="#ff0000">This does not apply when using RC4 decryption
(nDecryptionType = 1024).<br /></font></p><hr /><p><br /></p><p></p><p><font color="#006400" size="3"><strong>Function ENCRYPTFILE()</strong></font></p><p><strong>Signature</strong>: EncryptFile(cFiletoEncrypt, cDestinationFile, cSecretKey[,
nEncryptionType[, nEncryptionMode[, nPaddingType[, nKeySize[, nBlockSize[, cIV]]]]]])
</p><p><strong>Parameters</strong>:
</p><p><font color="#006400">cFiletoEncrypt</font> - A plain text string that is the fullpath
to the file you wish to be encrypted, such as "C:\SensitiveInfo.doc"
</p><p><font color="#006400">cDestinationFile</font> - A plain text string that is the fullpath
to an encrypted file you wish to have created on disk, such as "C:\EncryptedInfo.doc".
If this file doesn't exist then it will be created for you.
</p><p><font color="#006400">cSecretKey</font> - A plain text string that is the Key you
want used during encryption, such as "My_SeCrEt_KeY".<br />
Please note that keys may need to be of a particular length for certain types of encryption.
Refer below for more information.
</p><p><font color="#006400">nEncryptionType</font> - There are currently 5 types of encryption
available. The value of this parameter determines that type of encryption used and
how long your Secret Key should be. A single character in Visual FoxPro is equal to
1 byte or 8 bits. So an encryption algorithm requiring a 128-bit key would need a
Secret Key of 16 characters (16 x 8 = 128).<br /><br />
0 = Rijndael\AES 128 (requires a 16 character Key)<br />
1 = Rijndael\AES 192 (requires a 24 character Key)<br />
2 = Rijndael\AES 256 (requires a 32 character Key) *Default<br />
4 = Blowfish (key between 1 and 56 characters)<br />
8 = TEA (requires a 16 character Key)<br />
1024 = RC4 (Key can be any length) 
</p><p><font color="#006400">nEncryptionMode</font> - There are three different modes available
for the each of the encryption types listed above. They include: Electronic Code Book
(ECB), Cipher Block Chaining (CBC), Cipher Feedback Block (CFB), and Output Feedback
Block. <font color="#ff0000">This does not apply when using RC4 encryption (nEncryptionType
= 1024).<br /></font></p><p>
0 = ECB *Default<br />
1 = CBC<br />
2 = CFB<br />
3 = OFB 
</p><p><font color="#006400">nPaddingMode</font> - For Block Ciphers the cStringtoEncrypt
is padded to a multiple of the block size for the algorithm. Setting this parameter
allows you to specify how this padding is done.<br /></p><p>
0 = Zeroes (NULLs) *Default<br />
1 = Spaces (blanks)<br />
2 = PKCS7<br />
3 = ANSI X.923<br />
4 = ISO 10126
</p><p><font color="#006400">nKeySize</font> - The size of the cSecretKey in bytes (characters).<br /></p><p><font color="#006400">nBlockSize</font> - The block size the nEncryptionType should
use.<br /></p><p><font color="#006400">cIV</font> - The Initialization Vector (IV) that should be used
for CBC, CFB, and OFB modes should use. This IV should match the specified nBlockSize
in total bytes (characters).<br /><br /><strong>Return Value</strong>:
</p><p>
None
</p><p><strong>Remarks</strong>:
</p><p>
Currently the cFiletoEncrypt and cDestinationFile parameters cannot point to the same
file. This may be revised in a future version. But for safety sake, this function
requires that the original file be left untouched.
</p><p></p><hr /><p><br /></p><p></p><p><font color="#006400" size="3"><strong>Function DECRYPTFILE()</strong></font></p><p><strong>Signature</strong>: DecryptFile(cEncryptedFile, cDestinationFile, cSecretKey[,
nDecryptionType[, nDecryptionMode[, nPaddingType[, nKeySize[, nBlockSize[, cIV]]]]]])
</p><p><strong>Parameters</strong>:
</p><p><font color="#006400">cEncyptedFile</font> - A plain text string that is the fullpath
to the file you wish to be decrypted, such as "C:\EncryptedInfo.doc"
</p><p><font color="#006400">cDestinationFile</font> - A plain text string that is the fullpath
to a decrypted file you wish to have created on disk, such as "C:\SensitiveInfo.doc".
If this file doesn't exist then it will be created for you.
</p><p><font color="#006400">cSecretKey</font> - A plain text string that is the same Key
that you used when you encrypted the data using the Encrypt function, such as "My_SeCrEt_KeY".<br />
Please note that keys may need to be of a particular length for certain types of decryption.
Refer below for more information.
</p><p><font color="#006400">nDecryptionType</font> - There are currently 5 types of decryption
available and they correspond to the same ones available in Encrypt(). A single character
in Visual FoxPro is equal to 1 byte or 8 bits. So an decryption algorithm requiring
a 128-bit key would need a Secret Key of 16 characters (16 x 8 = 128).<br /><br />
0 = Rijndael\AES 128 (requires a 16 character Key)<br />
1 = Rijndael\AES 192 (requires a 24 character Key)<br />
2 = Rijndael\AES 256 (requires a 32 character Key) *Default<br />
4 = Blowfish (key between 1 and 56 characters)<br />
8 = TEA (requires a 16 character Key)<br />
1024 = RC4 (Key can be any length) 
</p><p><font color="#006400">nDecryptionMode</font> - There are three different modes available
for the each of the encryption types listed above. They include: Electronic Code Book
(ECB), Cipher Block Chaining (CBC), Cipher Feedback Block (CFB), and Output Feedback
Block. <font color="#ff0000">This does not apply when using RC4 decryption (nDecryptionType
= 1024).<br /></font></p><p>
0 = ECB *Default<br />
1 = CBC<br />
2 = CFB<br />
3 = OFB 
</p><p><font color="#006400">nPaddingMode</font> - For Block Ciphers the cStringtoEncrypt
is padded to a multiple of the block size for the algorithm. Setting this parameter
allows you to specify how this padding is done.<br /></p><p>
0 = Zeroes (NULLs) *Default<br />
1 = Spaces (blanks)<br />
2 = PKCS7<br />
3 = ANSI X.923<br />
4 = ISO 10126
</p><p><font color="#006400">nKeySize</font> - The size of the cSecretKey in bytes (characters).<br /></p><p><font color="#006400">nBlockSize</font> - The block size the nEncryptionType should
use.<br /></p><p><font color="#006400">cIV</font> - The Initialization Vector (IV) that should be used
for CBC, CFB, and OFB modes should use. This IV should match the specified nBlockSize
in total bytes (characters).<br /><br /><strong>Return Value</strong>:
</p><p>
None
</p><p><strong>Remarks</strong>:
</p><p>
As with EncryptFile(), the cFiletoEncrypt and cDestinationFile parameters cannot point
to the same file.<br /></p><hr /><p><font color="#006400" size="3"><strong>Function HASH()</strong></font></p><p><strong>Signature</strong>: Hash(cStringtoHash[, nHashType])
</p><p><strong>Parameters</strong>:
</p><p><font color="#003300"><font color="#006400">cStringtoHash</font> - A plain text string
you wish to have hashed<br /><br /><font color="#006400">nHashType</font> - The type of hash function to generate. There
are currently 7 different hash functions supported</font></p><p><font color="#003300">1 = SHA1 (a.k.a SHA160)<br />
2 = SHA256<br />
3 = SHA384<br /></font><font color="#003300">4 = SHA512 *Default<br />
5 = MD5<br /></font><font color="#003300">6 = RIPEMD128<br />
7 = RIPEMD160</font></p><p><strong>Return Value</strong>:
</p><p>
Binary Character Data - the hash for cStringtoHash.
</p><p><strong>Remarks</strong>:
</p><p>
The hash is returned as a series of binary characters. However, it is more common
to see hashes in a hexBinary format. This can be accomplished in Visual FoxPro by
taking the return of the Hash() function and sending it in as a parameter to the STRCONV()
function. For example:<br /><br />
?STRCONV(Hash("Some String"), 15) &amp;&amp; hexBinary Hash<br /></p><p></p><hr /><p></p><p><font color="#006400" size="3"><strong>Function HASHFILE()</strong></font></p><p><strong>Signature</strong>: HashFile(cFileName[, nHashType])
</p><p><strong>Parameters</strong>:
</p><p><font color="#003300"><font color="#006400">cFileName</font> - The fullpath and name
of an existing file you wish to generate a message digest for<br /><br /><font color="#006400">nHashType</font> - The type of hash function to generate. There
are currently 7 different hash functions supported</font></p><p><font color="#003300">1 = SHA1 (a.k.a SHA160)<br />
2 = SHA256<br />
3 = SHA384<br /></font><font color="#003300">4 = SHA512 *Default<br />
5 = MD5<br /></font><font color="#003300">6 = RIPEMD128<br />
7 = </font><font color="#003300">RIPEMD160</font></p><p><strong>Return Value</strong>:
</p><p>
Binary Character Data - the hash for cFileName.
</p><p><strong>Remarks</strong>:
</p><p>
The hash is returned as a series of binary characters. However, it is more common
to see hashes in a hexBinary format. This can be accomplished in Visual FoxPro by
taking the return of the HashFile() function and sending it in as a parameter to the
STRCONV() function. For example:<br /><br />
?STRCONV(HashFile("C:\MyFile.txt"), 15) &amp;&amp; hexBinary Hash<br /></p><p></p><hr /><p></p><p><font color="#006400" size="3"><strong>Function HASHRECORD()</strong></font></p><p><strong>Signature</strong>: HashRecord(cAlias[, nHashType[,lIncludeMemos]])
</p><p><strong>Parameters</strong>:
</p><p><font color="#003300"><font color="#006400">cAlias</font> - The table alias containing
the record to be hashed<br /><br /><font color="#006400">nHashType</font> - The type of hash function to generate. There
are currently 7 different hash functions supported</font></p><p><font color="#003300">1 = SHA1 (a.k.a SHA160)<br />
2 = SHA256<br />
3 = SHA384<br /></font><font color="#003300">4 = SHA512 *Default<br />
5 = MD5<br /></font><font color="#003300">6 = RIPEMD128<br />
7 = </font><font color="#003300">RIPEMD160</font></p><p><font color="#003300"><font color="#006400">lIncludeMemos</font> - Flag determining
whether Memo fields should be included when generating the message digest. .T. = Include
Memo Fields, .F. = Exclude Memo Fields</font></p><p><strong>Return Value</strong>:
</p><p>
Binary Character Data - the hash for the current record in cAlias.
</p><p><strong>Remarks</strong>:
</p><p>
The hash is returned as a series of binary characters. However, it is more common
to see hashes in a hexBinary format. This can be accomplished in Visual FoxPro by
taking the return of the HashRecord() function and sending it in as a parameter to
the STRCONV() function. For example:<br /><br />
?STRCONV(HashRecord("MyTable",5,.T.), 15) &amp;&amp; hexBinary Hash 
</p><hr /><p><font color="#006400" size="3"><strong>Function HMAC()</strong></font></p><p><strong>Signature</strong>: HMAC(cStringtoHash, cSecretKey[, nHashType])
</p><p><strong>Parameters</strong>:
</p><p><font color="#003300"><font color="#006400">cStringtoHash</font> - A plain text string
you wish to have a keyed Hash Message Authentication Code (HMAC) generated from.<br /></font></p><p><font color="#006400">cSecretKey</font> - A plain text string that is the Key you
want used during generation of the keyed HMAC.<br /><br /><font color="#003300"><font color="#006400">nHashType</font> - The type of hash function
to use when generating the keyed HMAC. There are currently 7 different hash functions
supported:<br /></font></p><p><font color="#003300">1 = SHA1 (a.k.a SHA160)<br />
2 = SHA256<br />
3 = SHA384<br /></font><font color="#003300">4 = SHA512 *Default<br />
5 = MD5<br /></font><font color="#003300">6 = RIPEMD128<br />
7 = RIPEMD160</font></p><p><strong>Return Value</strong>:
</p><p>
Binary Character Data - the HMAC for the given cStringtoHash and cSecretKey.
</p><p><strong>Remarks</strong>:
</p><p>
The HMAC is returned as a series of binary characters. However, it is more common
to see HMACs in a hexBinary format. This can be accomplished in Visual FoxPro by taking
the return of the HMAC() function and sending it in as a parameter to STRCONV(cReturn,
15).<br /></p><p></p><hr /><font color="#006400" size="3"><strong></strong></font><p><font color="#006400" size="3"><strong>Function CRC()</strong></font></p><p><strong>Signature</strong>: CRC(cExpression[, nCRCType])
</p><p><strong>Parameters</strong>:
</p><p><font color="#003300"><font color="#006400">cExpression</font> - The string you wish
to have a CRC generated for<br /><br /><font color="#006400">nCRCType</font> - The type of CRC to generate. There are currently
2 different CRC types supported</font></p><p><font color="#003300">1 = 16-bit<br />
2 = 32-bit<br /><strong><br /></strong></font><strong>Return Value</strong>:
</p><p>
Numeric Data - the CRC for cExpression.
</p><p><strong>Remarks</strong>:
</p><p>
The CRC that is returned is unsigned, which means that the returned 16-bit CRC needs
to be treated as a 4 Byte numeric value and the 32-bit CRC as a 8 byte numeric value
in Visual FoxPro. The operation of the CRC() function presented here is quite similar
to Visual FoxPro's Sys(2007) function, however you will find that creation of 32-bit
CRCs is much faster using this function.<br /></p><p></p><hr /><p></p><p><font color="#006400" size="3"><strong>Function CRCFILE()</strong></font></p><p><strong>Signature</strong>: CRCFile(cFileName[, nCRCType])
</p><p><strong>Parameters</strong>:
</p><p><font color="#003300"><font color="#006400">cFileName</font> - The fullpath and name
of an existing file you wish to generate a CRC for<br /><br /><font color="#006400">nCRCType</font> - The type of CRC to generate. There are currently
2 different CRC types supported</font></p><p><font color="#003300">1 = 16-bit<br />
2 = 32-bit<br /><strong><br /></strong></font><strong>Return Value</strong>:
</p><p>
Numeric Data - the CRC for cFileName.
</p><p><strong>Remarks</strong>:
</p><p>
The CRC that is returned is unsigned, which means that the returned 16-bit CRC needs
to be treated as a 4 Byte numeric value and the 32-bit CRC as a 8 byte numeric value
in Visual FoxPro.
</p><p></p><hr /><p></p><p><font color="#006400" size="3"><strong>Function CRCRECORD()</strong></font></p><p><strong>Signature</strong>: CRCRecord(cAlias[, nCRCType[,lIncludeMemos]])
</p><p><strong>Parameters</strong>:
</p><p><font color="#003300"><font color="#006400">cAlias</font> - The table alias containing
the record to be hashed<br /><br /><font color="#006400">nCRCType</font> - The type of CRC to generate. There are currently
2 different CRC types supported</font></p><p><font color="#003300">1 = 16-bit<br />
2 = 32-bit</font></p><p><font color="#003300"><font color="#006400">lIncludeMemos</font> - Flag determining
whether Memo fields should be included when generating the message digest. .T. = Include
Memo Fields, .F. = Exclude Memo Fields<br /></font><font color="#003300"><strong><br /></strong></font><strong>Return Value</strong>:
</p><p>
Numeric Data - the CRC for the current record in cAlias .
</p><p><strong>Remarks</strong>:
</p><p>
The CRC that is returned is unsigned, which means that the returned 16-bit CRC needs
to be treated as a 4 Byte numeric value and the 32-bit CRC as a 8 byte numeric value
in Visual FoxPro. The operation of the CRC() function presented here is quite similar
to Visual FoxPro's Sys(2017) function, however you will find that this CRC function
is faster than Visual FoxPro's Sys(2017). Also, this function allows you to specify
a table alias, which allows CRCs to be created for a record in a table other than
the currently selected work area. On the downside, this function does not allow you
to specify a comma delimited list of fields to exclude like Sys(2017) does. 
</p><p></p><hr /><p><font color="#006400" size="3"><strong>Function GENERATEKEY()</strong></font></p><p><strong>Signature</strong>: GenerateKey(nKeySize[, lIncludeNumbers[, lIncludeUpper[,
lIncludeSpecial]]])
</p><p><strong>Parameters</strong>:
</p><p><font color="#003300"><font color="#006400">nKeySize</font> - The size of the key
to be returned in bytes (total characters you want returned)<br /><br /><font color="#006400">lIncludeNumbers</font> - </font><font color="#003300">Flag determining
whether Numbers (digits "0-9") should be included when generating the key. .T. = Include
Numbers, .F. = Exclude Numbers (default)<br /></font></p><font color="#003300"><font color="#006400">lIncludeUpper</font> - </font><font color="#003300">Flag
determining whether uppercase characters should be included when generating the key.
.T. = Include Uppercase Characters, .F. = </font><font color="#003300">Exclude Uppercase
Characters </font><font color="#003300">(default)</font><br /><font color="#003300"><br /></font><font color="#003300"><font color="#006400">lIncludeSpecial</font> - </font><font color="#003300">Flag
determining whether Special Characters (characters "{}|\\]?[\":;'&gt;&lt;,./~!@#$%^&amp;*()_+`-=")
should be included when generating the key. .T. = Include Special Characters, .F.
= Exclude Special Characters</font><font color="#003300">(default)<br /></font><p><font color="#003300"><strong></strong></font><strong>Return Value</strong>:
</p><p>
Character Data - the random key generated based on the specified rules.
</p><p><strong>Remarks</strong>:
</p><p>
The key generated is a random set of lowercase characters by default. To add additional
possible characters for generating the key you can use the parameters (2-4) as specified.
The random keys returned can be used for the other FLL functions that allow for a
cSecretKey or cIV. This function is provided as a convenience function for developers
needing to produce a random key quickly and easily.
</p><p><br /></p><img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=d15a2956-55ed-4e7d-bfe9-ae7a18754b1b" /><br /><hr />
This weblog is sponsored by <a href="http://www.sweetpotatosoftware.com">SweetPotato
Software, Inc.</a></body>
      <title>Major VFP Encryption Update</title>
      <guid isPermaLink="false">http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,d15a2956-55ed-4e7d-bfe9-ae7a18754b1b.aspx</guid>
      <link>http://www.sweetpotatosoftware.com/spsblog/2009/08/09/MajorVFPEncryptionUpdate.aspx</link>
      <pubDate>Sun, 09 Aug 2009 23:16:26 GMT</pubDate>
      <description>&lt;p&gt;
The free vfpencryption71.fll and vfpencryption.fll have been updated. Changes include:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Bug fixes for Blowfish encryption (including blocksize and allowing keysize between
8 and 448 bits)&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;
Bug fixes to modes CBC and CFB - operate correctly now.&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;
Added ability to specify padding, key size, block size, and initialization vector
(IV) where applicable (these changes allow compatibility with .NET and other encryption
systems as well as the ability to adhere specifically to the AES specification as
set out in the &lt;a href="http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf"&gt;FIPS
197 Specification&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
Added mode OFB to encryption/decryption algorithms.&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;
Padding types supported are Zeroes (NULLs), Spaces (blanks), PKCS7, ANSI X.923, and
ISO 10126.&lt;/li&gt;
&lt;li&gt;
Added HMAC() function that works with all supported hash types.&lt;/li&gt;
&lt;li&gt;
Added VFP test program files to the downloads that allow developers to see for themselves
that return values are correct for various functions provided by the FLL.&lt;/li&gt;
&lt;li&gt;
Added GenerateKey() function that will return a random key or IV based on some specified
rules (parameters).&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;
Corrected and updated documentation (see below).&lt;/li&gt;
&lt;/ul&gt;
Please provide feedback here or send me an email if you run into any problems with
this latest version. You'll be able to tell from the test program files (Test Vectors)
that I did a lot of testing on my own to make sure that this version was solid. I
also did a number of tests between .NET System.Security.Cryptography classes (such
as RijndaelManaged for instance) and this FLL to ensure that there was a good deal
of compatibility.&lt;br&gt;
&lt;br&gt;
The vfpencryption71.fll requires the VC++ 7.1 runtimes whereas the vfpencryption.fll
requires the VC++ 9.0 runtimes. If you are getting a "FLL is Invalid" error when running
either of these FLLs it is because you are missing the runtimes on the system you
are deploying your application on. What about the previous vfpencryption.fll that
used the VC++ 8.0 runtimes? I continue to update to the latest Visual Studio (10.0
will be next) and I suggest you do the same. Most VFP developers are using the vfpencryption71.fll
as the C runtime matches the one used for VFP 9.0 (msvcr71.dll) and it provides the
exact same functionality as vfpencryption.fll. However, I have had numerous requests
for an updated build of the FLL using the latest Visual Studio, so I include it below.&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;a href="http://www.sweetpotatosoftware.com/files/vfpencryption71.zip"&gt;Download the
Latest Version of the vfpencryption71.fll&lt;/a&gt; (134 KB approx.)&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.sweetpotatosoftware.com/files/vfpencryption90.zip"&gt;Download the
Latest Version of the vfpencryption.fll&lt;/a&gt; (142 KB approx.)
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;font color="#006400" size="3"&gt;&lt;strong&gt; 
&lt;hr&gt;
&lt;/strong&gt;&lt;font color="#ff0000"&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;strong&gt;vfpencryption71.fll/vfpencryption.fll
Documentation...&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt; 
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400" size="3"&gt;&lt;strong&gt;Function ENCRYPT()&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Signature&lt;/strong&gt;: Encrypt(cStringtoEncrypt, cSecretKey[, nEncryptionType[,
nEncryptionMode[, nPaddingType[, nKeySize[, nBlockSize[, cIV]]]]]])
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Parameters&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;cStringtoEncrypt&lt;/font&gt; - A plain text string that you want
to have encrypted, such as "Hello World!"
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;cSecretKey&lt;/font&gt; - A plain text string that is the Key you
want used during encryption, such as "My_SeCrEt_KeY".&lt;br&gt;
Please note that keys may need to be of a particular length for certain types of encryption.
Refer below for more information.
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;nEncryptionType&lt;/font&gt; - There are currently 5 types of encryption
available. The value of this parameter determines that type of encryption used and
how long your Secret Key should be. A single character in Visual FoxPro is equal to
1 byte or 8 bits. So an encryption algorithm requiring a 128-bit key would need a
Secret Key of 16 characters (16 x 8 = 128).&lt;br&gt;
&lt;br&gt;
0 = Rijndael\AES 128 (requires a 16 character Key)&lt;br&gt;
1 = Rijndael\AES 192 (requires a 24 character Key)&lt;br&gt;
2 = Rijndael\AES 256 (requires a 32 character Key) *Default&lt;br&gt;
4 = Blowfish (key between 1 and 56 characters)&lt;br&gt;
8 = TEA (requires a 16 character Key)&lt;br&gt;
1024 = RC4 (Key can be any length)
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;nEncryptionMode&lt;/font&gt; - There are three different modes available
for the each of the encryption types listed above. They include: Electronic Code Book
(ECB), Cipher Block Chaining (CBC), Cipher Feedback Block (CFB), and Output Feedback
Block. &lt;font color="#ff0000"&gt;The nEncryptionMode parameter does not apply to RC4 encryption
(nEncryptionType = 1024).&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
0 = ECB *Default&lt;br&gt;
1 = CBC&lt;br&gt;
2 = CFB&lt;br&gt;
3 = OFB
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;nPaddingMode&lt;/font&gt; - For Block Ciphers the cStringtoEncrypt
is padded to a multiple of the block size for the algorithm. Setting this parameter
allows you to specify how this padding is done.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
0 = Zeroes (NULLs) *Default&lt;br&gt;
1 = Spaces (blanks)&lt;br&gt;
2 = PKCS7&lt;br&gt;
3 = ANSI X.923&lt;br&gt;
4 = ISO 10126
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;nKeySize&lt;/font&gt; - The size of the cSecretKey in bytes (characters).&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;nBlockSize&lt;/font&gt; - The block size the nEncryptionType should
use.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;cIV&lt;/font&gt; - The Initialization Vector (IV) that should be used
for CBC, CFB, and OFB modes should use. This IV should match the specified nBlockSize
in total bytes (characters).&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Return Value&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
Character data type - the encrypted form of cStringtoEncrypt.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Remarks&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
When saving the return value of Encrypt() function to a field in a table, remember
that Visual FoxPro will append blanks to the end of the string in order to fill the
character field to its designated length. This can cause problems when decrypting
the data as the spaces will be considered part of the encrypted string. To work around
this, I suggest placing a single CHR(0) at the end of the encrypted string when saving
it to the table. Then when decrypting the data just the portion prior to the CHR(0)
can be sent into the Decrypt() function. &lt;font color="#ff0000"&gt;This does not apply
when using RC4 encryption (nEncryptionType = 1024).&lt;/font&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400" size="3"&gt;&lt;strong&gt;Function DECRYPT()&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Signature&lt;/strong&gt;: Decrypt(cEncryptString, cSecretKey[, nDecryptionType[,
nDecryptionMode[, nPaddingType[, nKeySize[, nBlockSize[, cIV]]]]]])
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Parameters&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;cEncryptedString&lt;/font&gt; - A string that has been encrypted using
the Encrypt() function.
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;cSecretKey&lt;/font&gt; - A plain text string that is the same Key
that you used when you encrypted the data using the Encrypt function, such as "My_SeCrEt_KeY".&lt;br&gt;
Please note that keys may need to be of a particular length for certain types of decryption.
Refer below for more information.
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;nDecryptionType&lt;/font&gt; - There are currently 5 types of decryption
available and they correspond to the same ones available in Encrypt(). A single character
in Visual FoxPro is equal to 1 byte or 8 bits. So an decryption algorithm requiring
a 128-bit key would need a Secret Key of 16 characters (16 x 8 = 128).&lt;br&gt;
&lt;br&gt;
0 = Rijndael\AES 128 (requires a 16 character Key)&lt;br&gt;
1 = Rijndael\AES 192 (requires a 24 character Key)&lt;br&gt;
2 = Rijndael\AES 256 (requires a 32 character Key) *Default&lt;br&gt;
4 = Blowfish (key between 1 and 56 characters)&lt;br&gt;
8 = TEA (requires a 16 character Key)&lt;br&gt;
1024 = RC4 (Key can be any length)&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;nDecryptionMode&lt;/font&gt; - There are three different modes available
for the each of the encryption types listed above. They include: Electronic Code Book
(ECB), Cipher Block Chaining (CBC), Cipher Feedback Block (CFB), and Output Feedback
Block. &lt;font color="#ff0000"&gt;The nDecryptionMode parameter does not apply to RC4 decryption
(nDecryptionType = 1024).&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
0 = ECB *Default&lt;br&gt;
1 = CBC&lt;br&gt;
2 = CFB&lt;br&gt;
3 = OFB 
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;nPaddingMode&lt;/font&gt; - For Block Ciphers the cStringtoEncrypt
is padded to a multiple of the block size for the algorithm. Setting this parameter
allows you to specify how this padding is done.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
0 = Zeroes (NULLs) *Default&lt;br&gt;
1 = Spaces (blanks)&lt;br&gt;
2 = PKCS7&lt;br&gt;
3 = ANSI X.923&lt;br&gt;
4 = ISO 10126
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;nKeySize&lt;/font&gt; - The size of the cSecretKey in bytes (characters).&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;nBlockSize&lt;/font&gt; - The block size the nEncryptionType should
use.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;cIV&lt;/font&gt; - The Initialization Vector (IV) that should be used
for CBC, CFB, and OFB modes should use. This IV should match the specified nBlockSize
in total bytes (characters).&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;Return Value&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
Character data type - the decrypted form of cEncryptedString followed by a variable
number of CHR(0)s. See Remarks below for further clarification
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Remarks&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#ff0000"&gt;IMPORTANT&lt;/font&gt;: Decryption is done on blocks of memory, so
when the decrypt function returns the encrypted string it will be followed by a variable
number of CHR(0)s unless the decrypted string just happens to end at exactly the same
location as the last block decrypted. These extraneous CHR(0)'s can be removed using
a number of Visual FoxPro functions, such as STRTRAN(), CHRTRAN(), or a combination
of LEFT() and AT(). &lt;font color="#ff0000"&gt;This does not apply when using RC4 decryption
(nDecryptionType = 1024).&lt;br&gt;
&lt;/font&gt; 
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400" size="3"&gt;&lt;strong&gt;Function ENCRYPTFILE()&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Signature&lt;/strong&gt;: EncryptFile(cFiletoEncrypt, cDestinationFile, cSecretKey[,
nEncryptionType[, nEncryptionMode[, nPaddingType[, nKeySize[, nBlockSize[, cIV]]]]]])
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Parameters&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;cFiletoEncrypt&lt;/font&gt; - A plain text string that is the fullpath
to the file you wish to be encrypted, such as "C:\SensitiveInfo.doc"
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;cDestinationFile&lt;/font&gt; - A plain text string that is the fullpath
to an encrypted file you wish to have created on disk, such as "C:\EncryptedInfo.doc".
If this file doesn't exist then it will be created for you.
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;cSecretKey&lt;/font&gt; - A plain text string that is the Key you
want used during encryption, such as "My_SeCrEt_KeY".&lt;br&gt;
Please note that keys may need to be of a particular length for certain types of encryption.
Refer below for more information.
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;nEncryptionType&lt;/font&gt; - There are currently 5 types of encryption
available. The value of this parameter determines that type of encryption used and
how long your Secret Key should be. A single character in Visual FoxPro is equal to
1 byte or 8 bits. So an encryption algorithm requiring a 128-bit key would need a
Secret Key of 16 characters (16 x 8 = 128).&lt;br&gt;
&lt;br&gt;
0 = Rijndael\AES 128 (requires a 16 character Key)&lt;br&gt;
1 = Rijndael\AES 192 (requires a 24 character Key)&lt;br&gt;
2 = Rijndael\AES 256 (requires a 32 character Key) *Default&lt;br&gt;
4 = Blowfish (key between 1 and 56 characters)&lt;br&gt;
8 = TEA (requires a 16 character Key)&lt;br&gt;
1024 = RC4 (Key can be any length)&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;nEncryptionMode&lt;/font&gt; - There are three different modes available
for the each of the encryption types listed above. They include: Electronic Code Book
(ECB), Cipher Block Chaining (CBC), Cipher Feedback Block (CFB), and Output Feedback
Block. &lt;font color="#ff0000"&gt;This does not apply when using RC4 encryption (nEncryptionType
= 1024).&lt;br&gt;
&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
0 = ECB *Default&lt;br&gt;
1 = CBC&lt;br&gt;
2 = CFB&lt;br&gt;
3 = OFB 
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;nPaddingMode&lt;/font&gt; - For Block Ciphers the cStringtoEncrypt
is padded to a multiple of the block size for the algorithm. Setting this parameter
allows you to specify how this padding is done.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
0 = Zeroes (NULLs) *Default&lt;br&gt;
1 = Spaces (blanks)&lt;br&gt;
2 = PKCS7&lt;br&gt;
3 = ANSI X.923&lt;br&gt;
4 = ISO 10126
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;nKeySize&lt;/font&gt; - The size of the cSecretKey in bytes (characters).&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;nBlockSize&lt;/font&gt; - The block size the nEncryptionType should
use.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;cIV&lt;/font&gt; - The Initialization Vector (IV) that should be used
for CBC, CFB, and OFB modes should use. This IV should match the specified nBlockSize
in total bytes (characters).&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;Return Value&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
None
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Remarks&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
Currently the cFiletoEncrypt and cDestinationFile parameters cannot point to the same
file. This may be revised in a future version. But for safety sake, this function
requires that the original file be left untouched.
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400" size="3"&gt;&lt;strong&gt;Function DECRYPTFILE()&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Signature&lt;/strong&gt;: DecryptFile(cEncryptedFile, cDestinationFile, cSecretKey[,
nDecryptionType[, nDecryptionMode[, nPaddingType[, nKeySize[, nBlockSize[, cIV]]]]]])
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Parameters&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;cEncyptedFile&lt;/font&gt; - A plain text string that is the fullpath
to the file you wish to be decrypted, such as "C:\EncryptedInfo.doc"
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;cDestinationFile&lt;/font&gt; - A plain text string that is the fullpath
to a decrypted file you wish to have created on disk, such as "C:\SensitiveInfo.doc".
If this file doesn't exist then it will be created for you.
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;cSecretKey&lt;/font&gt; - A plain text string that is the same Key
that you used when you encrypted the data using the Encrypt function, such as "My_SeCrEt_KeY".&lt;br&gt;
Please note that keys may need to be of a particular length for certain types of decryption.
Refer below for more information.
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;nDecryptionType&lt;/font&gt; - There are currently 5 types of decryption
available and they correspond to the same ones available in Encrypt(). A single character
in Visual FoxPro is equal to 1 byte or 8 bits. So an decryption algorithm requiring
a 128-bit key would need a Secret Key of 16 characters (16 x 8 = 128).&lt;br&gt;
&lt;br&gt;
0 = Rijndael\AES 128 (requires a 16 character Key)&lt;br&gt;
1 = Rijndael\AES 192 (requires a 24 character Key)&lt;br&gt;
2 = Rijndael\AES 256 (requires a 32 character Key) *Default&lt;br&gt;
4 = Blowfish (key between 1 and 56 characters)&lt;br&gt;
8 = TEA (requires a 16 character Key)&lt;br&gt;
1024 = RC4 (Key can be any length)&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;nDecryptionMode&lt;/font&gt; - There are three different modes available
for the each of the encryption types listed above. They include: Electronic Code Book
(ECB), Cipher Block Chaining (CBC), Cipher Feedback Block (CFB), and Output Feedback
Block. &lt;font color="#ff0000"&gt;This does not apply when using RC4 decryption (nDecryptionType
= 1024).&lt;br&gt;
&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
0 = ECB *Default&lt;br&gt;
1 = CBC&lt;br&gt;
2 = CFB&lt;br&gt;
3 = OFB 
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;nPaddingMode&lt;/font&gt; - For Block Ciphers the cStringtoEncrypt
is padded to a multiple of the block size for the algorithm. Setting this parameter
allows you to specify how this padding is done.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
0 = Zeroes (NULLs) *Default&lt;br&gt;
1 = Spaces (blanks)&lt;br&gt;
2 = PKCS7&lt;br&gt;
3 = ANSI X.923&lt;br&gt;
4 = ISO 10126
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;nKeySize&lt;/font&gt; - The size of the cSecretKey in bytes (characters).&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;nBlockSize&lt;/font&gt; - The block size the nEncryptionType should
use.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;cIV&lt;/font&gt; - The Initialization Vector (IV) that should be used
for CBC, CFB, and OFB modes should use. This IV should match the specified nBlockSize
in total bytes (characters).&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;Return Value&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
None
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Remarks&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
As with EncryptFile(), the cFiletoEncrypt and cDestinationFile parameters cannot point
to the same file.&lt;br&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font color="#006400" size="3"&gt;&lt;strong&gt;Function HASH()&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Signature&lt;/strong&gt;: Hash(cStringtoHash[, nHashType])
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Parameters&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#003300"&gt;&lt;font color="#006400"&gt;cStringtoHash&lt;/font&gt; - A plain text string
you wish to have hashed&lt;br&gt;
&lt;br&gt;
&lt;font color="#006400"&gt;nHashType&lt;/font&gt; - The type of hash function to generate. There
are currently 7 different hash functions supported&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#003300"&gt;1 = SHA1 (a.k.a SHA160)&lt;br&gt;
2 = SHA256&lt;br&gt;
3 = SHA384&lt;br&gt;
&lt;/font&gt;&lt;font color="#003300"&gt;4 = SHA512 *Default&lt;br&gt;
5 = MD5&lt;br&gt;
&lt;/font&gt;&lt;font color="#003300"&gt;6 = RIPEMD128&lt;br&gt;
7 = RIPEMD160&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Return Value&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
Binary Character Data - the hash for cStringtoHash.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Remarks&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
The hash is returned as a series of binary characters. However, it is more common
to see hashes in a hexBinary format. This can be accomplished in Visual FoxPro by
taking the return of the Hash() function and sending it in as a parameter to the STRCONV()
function. For example:&lt;br&gt;
&lt;br&gt;
?STRCONV(Hash("Some String"), 15) &amp;amp;&amp;amp; hexBinary Hash&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400" size="3"&gt;&lt;strong&gt;Function HASHFILE()&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Signature&lt;/strong&gt;: HashFile(cFileName[, nHashType])
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Parameters&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#003300"&gt;&lt;font color="#006400"&gt;cFileName&lt;/font&gt; - The fullpath and name
of an existing file you wish to generate a message digest for&lt;br&gt;
&lt;br&gt;
&lt;font color="#006400"&gt;nHashType&lt;/font&gt; - The type of hash function to generate. There
are currently 7 different hash functions supported&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#003300"&gt;1 = SHA1 (a.k.a SHA160)&lt;br&gt;
2 = SHA256&lt;br&gt;
3 = SHA384&lt;br&gt;
&lt;/font&gt;&lt;font color="#003300"&gt;4 = SHA512 *Default&lt;br&gt;
5 = MD5&lt;br&gt;
&lt;/font&gt;&lt;font color="#003300"&gt;6 = RIPEMD128&lt;br&gt;
7 = &lt;/font&gt;&lt;font color="#003300"&gt;RIPEMD160&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Return Value&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
Binary Character Data - the hash for cFileName.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Remarks&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
The hash is returned as a series of binary characters. However, it is more common
to see hashes in a hexBinary format. This can be accomplished in Visual FoxPro by
taking the return of the HashFile() function and sending it in as a parameter to the
STRCONV() function. For example:&lt;br&gt;
&lt;br&gt;
?STRCONV(HashFile("C:\MyFile.txt"), 15) &amp;amp;&amp;amp; hexBinary Hash&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400" size="3"&gt;&lt;strong&gt;Function HASHRECORD()&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Signature&lt;/strong&gt;: HashRecord(cAlias[, nHashType[,lIncludeMemos]])
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Parameters&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#003300"&gt;&lt;font color="#006400"&gt;cAlias&lt;/font&gt; - The table alias containing
the record to be hashed&lt;br&gt;
&lt;br&gt;
&lt;font color="#006400"&gt;nHashType&lt;/font&gt; - The type of hash function to generate. There
are currently 7 different hash functions supported&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#003300"&gt;1 = SHA1 (a.k.a SHA160)&lt;br&gt;
2 = SHA256&lt;br&gt;
3 = SHA384&lt;br&gt;
&lt;/font&gt;&lt;font color="#003300"&gt;4 = SHA512 *Default&lt;br&gt;
5 = MD5&lt;br&gt;
&lt;/font&gt;&lt;font color="#003300"&gt;6 = RIPEMD128&lt;br&gt;
7 = &lt;/font&gt;&lt;font color="#003300"&gt;RIPEMD160&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#003300"&gt;&lt;font color="#006400"&gt;lIncludeMemos&lt;/font&gt; - Flag determining
whether Memo fields should be included when generating the message digest. .T. = Include
Memo Fields, .F. = Exclude Memo Fields&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Return Value&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
Binary Character Data - the hash for the current record in cAlias.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Remarks&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
The hash is returned as a series of binary characters. However, it is more common
to see hashes in a hexBinary format. This can be accomplished in Visual FoxPro by
taking the return of the HashRecord() function and sending it in as a parameter to
the STRCONV() function. For example:&lt;br&gt;
&lt;br&gt;
?STRCONV(HashRecord("MyTable",5,.T.), 15) &amp;amp;&amp;amp; hexBinary Hash 
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font color="#006400" size="3"&gt;&lt;strong&gt;Function HMAC()&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Signature&lt;/strong&gt;: HMAC(cStringtoHash, cSecretKey[, nHashType])
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Parameters&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#003300"&gt;&lt;font color="#006400"&gt;cStringtoHash&lt;/font&gt; - A plain text string
you wish to have a keyed Hash Message Authentication Code (HMAC) generated from.&lt;br&gt;
&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400"&gt;cSecretKey&lt;/font&gt; - A plain text string that is the Key you
want used during generation of the keyed HMAC.&lt;br&gt;
&lt;br&gt;
&lt;font color="#003300"&gt;&lt;font color="#006400"&gt;nHashType&lt;/font&gt; - The type of hash function
to use when generating the keyed HMAC. There are currently 7 different hash functions
supported:&lt;br&gt;
&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#003300"&gt;1 = SHA1 (a.k.a SHA160)&lt;br&gt;
2 = SHA256&lt;br&gt;
3 = SHA384&lt;br&gt;
&lt;/font&gt;&lt;font color="#003300"&gt;4 = SHA512 *Default&lt;br&gt;
5 = MD5&lt;br&gt;
&lt;/font&gt;&lt;font color="#003300"&gt;6 = RIPEMD128&lt;br&gt;
7 = RIPEMD160&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Return Value&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
Binary Character Data - the HMAC for the given cStringtoHash and cSecretKey.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Remarks&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
The HMAC is returned as a series of binary characters. However, it is more common
to see HMACs in a hexBinary format. This can be accomplished in Visual FoxPro by taking
the return of the HMAC() function and sending it in as a parameter to STRCONV(cReturn,
15).&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;font color="#006400" size="3"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/font&gt;
&lt;p&gt;
&lt;font color="#006400" size="3"&gt;&lt;strong&gt;Function CRC()&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Signature&lt;/strong&gt;: CRC(cExpression[, nCRCType])
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Parameters&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#003300"&gt;&lt;font color="#006400"&gt;cExpression&lt;/font&gt; - The string you wish
to have a CRC generated for&lt;br&gt;
&lt;br&gt;
&lt;font color="#006400"&gt;nCRCType&lt;/font&gt; - The type of CRC to generate. There are currently
2 different CRC types supported&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#003300"&gt;1 = 16-bit&lt;br&gt;
2 = 32-bit&lt;br&gt;
&lt;strong&gt;
&lt;br&gt;
&lt;/strong&gt; &lt;/font&gt;&lt;strong&gt;Return Value&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
Numeric Data - the CRC for cExpression.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Remarks&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
The CRC that is returned is unsigned, which means that the returned 16-bit CRC needs
to be treated as a 4 Byte numeric value and the 32-bit CRC as a 8 byte numeric value
in Visual FoxPro. The operation of the CRC() function presented here is quite similar
to Visual FoxPro's Sys(2007) function, however you will find that creation of 32-bit
CRCs is much faster using this function.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400" size="3"&gt;&lt;strong&gt;Function CRCFILE()&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Signature&lt;/strong&gt;: CRCFile(cFileName[, nCRCType])
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Parameters&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#003300"&gt;&lt;font color="#006400"&gt;cFileName&lt;/font&gt; - The fullpath and name
of an existing file you wish to generate a CRC for&lt;br&gt;
&lt;br&gt;
&lt;font color="#006400"&gt;nCRCType&lt;/font&gt; - The type of CRC to generate. There are currently
2 different CRC types supported&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#003300"&gt;1 = 16-bit&lt;br&gt;
2 = 32-bit&lt;br&gt;
&lt;strong&gt;
&lt;br&gt;
&lt;/strong&gt; &lt;/font&gt;&lt;strong&gt;Return Value&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
Numeric Data - the CRC for cFileName.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Remarks&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
The CRC that is returned is unsigned, which means that the returned 16-bit CRC needs
to be treated as a 4 Byte numeric value and the 32-bit CRC as a 8 byte numeric value
in Visual FoxPro.
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#006400" size="3"&gt;&lt;strong&gt;Function CRCRECORD()&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Signature&lt;/strong&gt;: CRCRecord(cAlias[, nCRCType[,lIncludeMemos]])
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Parameters&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#003300"&gt;&lt;font color="#006400"&gt;cAlias&lt;/font&gt; - The table alias containing
the record to be hashed&lt;br&gt;
&lt;br&gt;
&lt;font color="#006400"&gt;nCRCType&lt;/font&gt; - The type of CRC to generate. There are currently
2 different CRC types supported&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#003300"&gt;1 = 16-bit&lt;br&gt;
2 = 32-bit&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#003300"&gt;&lt;font color="#006400"&gt;lIncludeMemos&lt;/font&gt; - Flag determining
whether Memo fields should be included when generating the message digest. .T. = Include
Memo Fields, .F. = Exclude Memo Fields&lt;br&gt;
&lt;/font&gt;&lt;font color="#003300"&gt;&lt;strong&gt;
&lt;br&gt;
&lt;/strong&gt; &lt;/font&gt;&lt;strong&gt;Return Value&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
Numeric Data - the CRC for the current record in cAlias .
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Remarks&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
The CRC that is returned is unsigned, which means that the returned 16-bit CRC needs
to be treated as a 4 Byte numeric value and the 32-bit CRC as a 8 byte numeric value
in Visual FoxPro. The operation of the CRC() function presented here is quite similar
to Visual FoxPro's Sys(2017) function, however you will find that this CRC function
is faster than Visual FoxPro's Sys(2017). Also, this function allows you to specify
a table alias, which allows CRCs to be created for a record in a table other than
the currently selected work area. On the downside, this function does not allow you
to specify a comma delimited list of fields to exclude like Sys(2017) does. 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font color="#006400" size="3"&gt;&lt;strong&gt;Function GENERATEKEY()&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Signature&lt;/strong&gt;: GenerateKey(nKeySize[, lIncludeNumbers[, lIncludeUpper[,
lIncludeSpecial]]])
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Parameters&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#003300"&gt;&lt;font color="#006400"&gt;nKeySize&lt;/font&gt; - The size of the key
to be returned in bytes (total characters you want returned)&lt;br&gt;
&lt;br&gt;
&lt;font color="#006400"&gt;lIncludeNumbers&lt;/font&gt; - &lt;/font&gt;&lt;font color="#003300"&gt;Flag determining
whether Numbers (digits "0-9") should be included when generating the key. .T. = Include
Numbers, .F. = Exclude Numbers (default)&lt;br&gt;
&lt;/font&gt;
&lt;/p&gt;
&lt;font color="#003300"&gt;&lt;font color="#006400"&gt;lIncludeUpper&lt;/font&gt; - &lt;/font&gt;&lt;font color="#003300"&gt;Flag
determining whether uppercase characters should be included when generating the key.
.T. = Include Uppercase Characters, .F. = &lt;/font&gt;&lt;font color="#003300"&gt;Exclude Uppercase
Characters &lt;/font&gt;&lt;font color="#003300"&gt;(default)&lt;/font&gt;
&lt;br&gt;
&lt;font color="#003300"&gt;
&lt;br&gt;
&lt;/font&gt;&lt;font color="#003300"&gt;&lt;font color="#006400"&gt;lIncludeSpecial&lt;/font&gt; - &lt;/font&gt;&lt;font color="#003300"&gt;Flag
determining whether Special Characters (characters "{}|\\]?[\":;'&amp;gt;&amp;lt;,./~!@#$%^&amp;amp;*()_+`-=")
should be included when generating the key. .T. = Include Special Characters, .F.
= Exclude Special Characters&lt;/font&gt; &lt;font color="#003300"&gt;(default)&lt;br&gt;
&lt;/font&gt;
&lt;p&gt;
&lt;font color="#003300"&gt;&lt;strong&gt; &lt;/strong&gt; &lt;/font&gt;&lt;strong&gt;Return Value&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
Character Data - the random key generated based on the specified rules.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Remarks&lt;/strong&gt;:
&lt;/p&gt;
&lt;p&gt;
The key generated is a random set of lowercase characters by default. To add additional
possible characters for generating the key you can use the parameters (2-4) as specified.
The random keys returned can be used for the other FLL functions that allow for a
cSecretKey or cIV. This function is provided as a convenience function for developers
needing to produce a random key quickly and easily.
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=d15a2956-55ed-4e7d-bfe9-ae7a18754b1b" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.sweetpotatosoftware.com"&gt;SweetPotato
Software, Inc.&lt;/a&gt;</description>
      <comments>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,d15a2956-55ed-4e7d-bfe9-ae7a18754b1b.aspx</comments>
      <category>Information Technology</category>
      <category>Visual Foxpro</category>
    </item>
    <item>
      <trackback:ping>http://www.sweetpotatosoftware.com/spsblog/Trackback.aspx?guid=ca7afa55-24a9-46e8-bd3c-99df6909528b</trackback:ping>
      <pingback:server>http://www.sweetpotatosoftware.com/spsblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,ca7afa55-24a9-46e8-bd3c-99df6909528b.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,ca7afa55-24a9-46e8-bd3c-99df6909528b.aspx</wfw:comment>
      <wfw:commentRss>http://www.sweetpotatosoftware.com/spsblog/SyndicationService.asmx/GetEntryCommentsRss?guid=ca7afa55-24a9-46e8-bd3c-99df6909528b</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <b>Some Time Ago...<br /></b>
        <br />
I wrote a blog entry, <a href="http://www.sweetpotatosoftware.com/SPSBlog/Trackback.aspx?guid=a7469c56-d058-41cd-b345-82a8121e1cfd">PE
Files, UAC, Reg-Free COM, and Other Crazy Stuff - Part 2</a>, that detailed how to
view and edit the application manifest that is inserted into VFP compiled modules.
I also took some time to explain why someone would want to do such a thing. The top
two reasons most VFP developers want to do this is to elevate permissions under Window's <a href="http://en.wikipedia.org/wiki/User_Account_Control">User
Account Control</a> (UAC) and to provide for <a href="http://msdn.microsoft.com/en-us/magazine/cc188708.aspx#S1">Registration-Free
COM</a>. I guess you may also find the need to edit or add strings to the PE file's
String Table resource (minority of VFP developers) which is provided for as well.<br /><br />
While the code and concepts detailed in that previous blog entry were advanced and
pretty decent (if i do say so myself), it suffered from a couple of bugs and most
VFP developers probably found it more than a little difficult to implement "out-of-the-box"
for their projects that needed elevated UAC permissions or Reg-Free COM. I attempt
to make things slightly more straight-forward and bug-free in this blog entry.<br /><br /><b>Enter the ProjectHook Class<br /></b><br />
There's plenty of good information on the <a href="http://books.google.com/books?id=wKNfTHRNkLAC&amp;pg=PA479&amp;lpg=PA479&amp;dq=projecthook+class+foxpro&amp;source=bl&amp;ots=_Z80iZZq2G&amp;sig=Dn1mNSJPdhr8mjevsRGa6uIg3Ko&amp;hl=en&amp;ei=qs12So_sBpKmNsu4ndAG&amp;sa=X&amp;oi=book_result&amp;ct=result&amp;resnum=1#v=onepage&amp;q=pr">ProjectHook
class online</a> and in the VFP 9.0 SP2 help file (get the latest and greatest help
file <a href="http://vfpx.codeplex.com/Wiki/View.aspx?title=VFP%209%20SP2%20Help%20File">out
on VFPX</a>), so I won't go into a great amount of detail here. I simply wanted an
easy way to apply a new manifest to a VFP executable after I had built a project.
The ProjectHook class provides a <b>BeforeBuild</b> event where I can get the fullpath
of the EXE being built and an <b>AfterBuild</b> event which allows me to perform operations
immediately after the EXE is built. So, this class provided exactly what i needed
and made applying a modified manifest a breeze.<br /><br /><b>How to Use ProjectHookEx.vcx<br /></b><br />
In order to use the projecthookex.vcx (download provided at the bottom of this blog
entry), you simply need to unzip and copy it somewhere and then open up one of your
projects and go into the Project Information dialog (accessible either by right-clicking
the project or under the Project system menu... look for Project Info) and set the
Project Class property as shown in the following screen shot...<br /><br /><p></p><img src="http://www.sweetpotatosoftware.com/SPSBlog/content/binary/addprojecthook.jpg" border="0" /><br /><br /><br />
...then simply click OK, exit your project and reopen your project. The projecthook
isn't instantiated until you reopen the project for the first time after setting the
Project Class property.<br /><br />
The default settings for the hookex class are set so that the default VFP 9.0 SP2
manifest, which has its <b>trustinfo</b> set to asInvoker, is changed to requireAdministrator.
Take a look inside hookex's AfterBuild event for the code that accomplishes this (short
and sweet). You'll see a couple commented out lines of code in the AfterBuild event
that show how to accomplish Reg-Free COM and String Table resource edits as well.
In any event, once the Project Class is set for your project hookex will be instantiated
and ready to go any time you open and build your project. When the manifest is applied
it will be echoed to the screen so you can see it and ensure that it has been applied
(you can turn this off by changing the moduleresourceeditor class's <b>showmanifestafterapplying</b> property
if you so desire).<br /><br /><b>External Manifests Anyone?<br /></b><br />
For those of you that prefer to use an external manifest for your executables, you
can do so by setting the moduleresourceeditor class's externalmanifest property. The
cool thing about this is that the myproj.exe.manifest file is created in the same
directory as your executable and the executable's internal manifest is removed to
prevent it from interfering with your external manifest. Then you can edit the external
manifest using favorite XML editor or even notepad. This was one of the enhancements
I added to this that is not in the code that I posted in the original blog entry regarding
PE Assembly/Application Manifests.<br /><br /><b>What's Next<br /></b><br />
There are plenty of improvements and enhancements (automatically searching project
for all COM components and automatically adding them to the manifest for instance)
that could be made to this class and I hope that my readers will make suggestions
and even try their hand at coding a few. There are lots of <a href="http://fox.wikis.com/wc.dll?Wiki%7EProjectHookUses%7EVFP">good
uses for VFP's ProjectHook</a> class. I'd love to hear from you and what you feel
needs to be done to improve this ProjectHook class. But, I'm cool if you just want
to read this, download the class library and use it. Until next time... VFP Rocks!<br /><br /><a href="http://www.sweetpotatosoftware.com/files/projecthookex.zip">Download the
Latest Version of the ProjectHookEx Class Library</a> (12 KB approx.)<br /><br /><br /><br /><img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=ca7afa55-24a9-46e8-bd3c-99df6909528b" /><br /><hr />
This weblog is sponsored by <a href="http://www.sweetpotatosoftware.com">SweetPotato
Software, Inc.</a></body>
      <title>Apply Application Manifest at Compile Time with Projecthook</title>
      <guid isPermaLink="false">http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,ca7afa55-24a9-46e8-bd3c-99df6909528b.aspx</guid>
      <link>http://www.sweetpotatosoftware.com/spsblog/2009/08/03/ApplyApplicationManifestAtCompileTimeWithProjecthook.aspx</link>
      <pubDate>Mon, 03 Aug 2009 11:50:30 GMT</pubDate>
      <description>&lt;b&gt;Some Time Ago...&lt;br&gt;
&lt;/b&gt;
&lt;br&gt;
I wrote a blog entry, &lt;a href="http://www.sweetpotatosoftware.com/SPSBlog/Trackback.aspx?guid=a7469c56-d058-41cd-b345-82a8121e1cfd"&gt;PE
Files, UAC, Reg-Free COM, and Other Crazy Stuff - Part 2&lt;/a&gt;, that detailed how to
view and edit the application manifest that is inserted into VFP compiled modules.
I also took some time to explain why someone would want to do such a thing. The top
two reasons most VFP developers want to do this is to elevate permissions under Window's &lt;a href="http://en.wikipedia.org/wiki/User_Account_Control"&gt;User
Account Control&lt;/a&gt; (UAC) and to provide for &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc188708.aspx#S1"&gt;Registration-Free
COM&lt;/a&gt;. I guess you may also find the need to edit or add strings to the PE file's
String Table resource (minority of VFP developers) which is provided for as well.&lt;br&gt;
&lt;br&gt;
While the code and concepts detailed in that previous blog entry were advanced and
pretty decent (if i do say so myself), it suffered from a couple of bugs and most
VFP developers probably found it more than a little difficult to implement "out-of-the-box"
for their projects that needed elevated UAC permissions or Reg-Free COM. I attempt
to make things slightly more straight-forward and bug-free in this blog entry.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Enter the ProjectHook Class&lt;br&gt;
&lt;/b&gt;
&lt;br&gt;
There's plenty of good information on the &lt;a href="http://books.google.com/books?id=wKNfTHRNkLAC&amp;amp;pg=PA479&amp;amp;lpg=PA479&amp;amp;dq=projecthook+class+foxpro&amp;amp;source=bl&amp;amp;ots=_Z80iZZq2G&amp;amp;sig=Dn1mNSJPdhr8mjevsRGa6uIg3Ko&amp;amp;hl=en&amp;amp;ei=qs12So_sBpKmNsu4ndAG&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=result&amp;amp;resnum=1#v=onepage&amp;amp;q=pr"&gt;ProjectHook
class online&lt;/a&gt; and in the VFP 9.0 SP2 help file (get the latest and greatest help
file &lt;a href="http://vfpx.codeplex.com/Wiki/View.aspx?title=VFP%209%20SP2%20Help%20File"&gt;out
on VFPX&lt;/a&gt;), so I won't go into a great amount of detail here. I simply wanted an
easy way to apply a new manifest to a VFP executable after I had built a project.
The ProjectHook class provides a &lt;b&gt;BeforeBuild&lt;/b&gt; event where I can get the fullpath
of the EXE being built and an &lt;b&gt;AfterBuild&lt;/b&gt; event which allows me to perform operations
immediately after the EXE is built. So, this class provided exactly what i needed
and made applying a modified manifest a breeze.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;How to Use ProjectHookEx.vcx&lt;br&gt;
&lt;/b&gt;
&lt;br&gt;
In order to use the projecthookex.vcx (download provided at the bottom of this blog
entry), you simply need to unzip and copy it somewhere and then open up one of your
projects and go into the Project Information dialog (accessible either by right-clicking
the project or under the Project system menu... look for Project Info) and set the
Project Class property as shown in the following screen shot...&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img src="http://www.sweetpotatosoftware.com/SPSBlog/content/binary/addprojecthook.jpg" border="0"&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
...then simply click OK, exit your project and reopen your project. The projecthook
isn't instantiated until you reopen the project for the first time after setting the
Project Class property.&lt;br&gt;
&lt;br&gt;
The default settings for the hookex class are set so that the default VFP 9.0 SP2
manifest, which has its &lt;b&gt;trustinfo&lt;/b&gt; set to asInvoker, is changed to requireAdministrator.
Take a look inside hookex's AfterBuild event for the code that accomplishes this (short
and sweet). You'll see a couple commented out lines of code in the AfterBuild event
that show how to accomplish Reg-Free COM and String Table resource edits as well.
In any event, once the Project Class is set for your project hookex will be instantiated
and ready to go any time you open and build your project. When the manifest is applied
it will be echoed to the screen so you can see it and ensure that it has been applied
(you can turn this off by changing the moduleresourceeditor class's &lt;b&gt;showmanifestafterapplying&lt;/b&gt; property
if you so desire).&lt;br&gt;
&lt;br&gt;
&lt;b&gt;External Manifests Anyone?&lt;br&gt;
&lt;/b&gt;
&lt;br&gt;
For those of you that prefer to use an external manifest for your executables, you
can do so by setting the moduleresourceeditor class's externalmanifest property. The
cool thing about this is that the myproj.exe.manifest file is created in the same
directory as your executable and the executable's internal manifest is removed to
prevent it from interfering with your external manifest. Then you can edit the external
manifest using favorite XML editor or even notepad. This was one of the enhancements
I added to this that is not in the code that I posted in the original blog entry regarding
PE Assembly/Application Manifests.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;What's Next&lt;br&gt;
&lt;/b&gt;
&lt;br&gt;
There are plenty of improvements and enhancements (automatically searching project
for all COM components and automatically adding them to the manifest for instance)
that could be made to this class and I hope that my readers will make suggestions
and even try their hand at coding a few. There are lots of &lt;a href="http://fox.wikis.com/wc.dll?Wiki%7EProjectHookUses%7EVFP"&gt;good
uses for VFP's ProjectHook&lt;/a&gt; class. I'd love to hear from you and what you feel
needs to be done to improve this ProjectHook class. But, I'm cool if you just want
to read this, download the class library and use it. Until next time... VFP Rocks!&lt;br&gt;
&lt;br&gt;
&lt;a href="http://www.sweetpotatosoftware.com/files/projecthookex.zip"&gt;Download the
Latest Version of the ProjectHookEx Class Library&lt;/a&gt; (12 KB approx.)&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=ca7afa55-24a9-46e8-bd3c-99df6909528b" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.sweetpotatosoftware.com"&gt;SweetPotato
Software, Inc.&lt;/a&gt;</description>
      <comments>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,ca7afa55-24a9-46e8-bd3c-99df6909528b.aspx</comments>
      <category>Information Technology</category>
      <category>Visual Foxpro</category>
    </item>
    <item>
      <trackback:ping>http://www.sweetpotatosoftware.com/spsblog/Trackback.aspx?guid=5ac8d202-98b4-4ee8-998d-692e4b597bec</trackback:ping>
      <pingback:server>http://www.sweetpotatosoftware.com/spsblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,5ac8d202-98b4-4ee8-998d-692e4b597bec.aspx</pingback:target>
      <dc:creator>Craig Boyd</dc:creator>
      <wfw:comment>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,5ac8d202-98b4-4ee8-998d-692e4b597bec.aspx</wfw:comment>
      <wfw:commentRss>http://www.sweetpotatosoftware.com/spsblog/SyndicationService.asmx/GetEntryCommentsRss?guid=5ac8d202-98b4-4ee8-998d-692e4b597bec</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <b>JSON Class Update<br /></b>Since my <a href="http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,5f96efd7-f350-4bc8-86c5-caffd9e833eb.aspx">initial
post</a> regarding this class, work has continued improving it. A number of fixes
and enhancement can be found in the latest version...<br /><br /><ul><li><b>Fixes to parse method</b> - There was a problem with brace matching for "{}" and
"[]" when nested in certain ways.</li><li><b>Fixes to UseUTCDatetime functionality</b> - rules are now as follows:</li><ul><li>
UseUTCDateTime = .F. &amp;&amp; Datetimes will stringify including Local offset from
UTC</li><li>
UseUTCDateTime = .T. &amp;&amp; Datetimes will stringify as UTC equivalent for Local</li><li>
Parse() &amp;&amp; will always return Local equivalent</li></ul><li><b>Fixes to GetTimezoneOffset method</b> - now respects Standard/Daylight boundaries
of datetimes</li><li><b>Fixed Stringify</b> - cursors are serialized to valid JSON now<br /></li><li><b>Added KeyForCursor property</b> - this allows a JSON key to be specified for identifying
cursors (defaulted to "VFPData")</li><li><b>Enhanced Stringify and Parse methods</b> - they now handle the VFP Collection class
with aplomb</li><li><b>Added KeyForItems property</b> - when serializing Collections, the key for the
contained JSON object's array property can be defined (defaulted to "items")</li><li><b>Renamed DateSerializationType property</b> - it is now ParseDateType</li><li><b>Enhanced Parse</b> - JSON class will now (optionally) respect Class and ClassLibrary
properties if they exist in a JSON object being deserialized (see ParseRespectClass
property). This means that if you Stringify() a VFP Form and then Parse() the JSON
(with ParseRespectClass = .T.) you will get a Form object back rather than an Empty
object with the same properties as the Form.</li></ul>
I would consider the JSON class production-ready at this point. This doesn't mean
that bugs won't be found in the future, but it has been hammered on enough that I
wouldn't hesitate to use it in a production application.<br /><br /><b>Visual FoxPro Now Listed<br /></b>I got in touch with <a href="http://www.crockford.com/">Douglas Crockford</a> and
was able to get Visual FoxPro listed on <a href="http://www.json.org/">JSON.org</a> with
a link to my initial post. I appreciate Douglas Crockford taking the time out of his
busy schedule to list Visual FoxPro on the JSON site.<br /><br /><b>Special Thank You<br /></b>Nearly all of the fixes and enhancements provided in this version of the JSON
class were made possible by the help and prodding I received from Frank Dietrich of
Berlin. He is an extremely bright fellow. Implementing the Timezone and Daylight vs.
Standard stuff drove us both to the brink. I sincerely doubt I could have done it
without his help.<br /><br /><a href="http://www.sweetpotatosoftware.com/files/json.zip">Download the JSON class
library (approx. 59 KB)</a><br /><br /><span style="font-size: 11px; color: black; font-family: Courier New; background-color: transparent;"><font size="2" face="Verdana">The
download contains the JSON class in both VCX and PRG format. They are the same. Use
whichever one you prefe</font></span>r.<br /><img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=5ac8d202-98b4-4ee8-998d-692e4b597bec" /><br /><hr />
This weblog is sponsored by <a href="http://www.sweetpotatosoftware.com">SweetPotato
Software, Inc.</a></body>
      <title>Visual Foxpro JSON Class Update</title>
      <guid isPermaLink="false">http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,5ac8d202-98b4-4ee8-998d-692e4b597bec.aspx</guid>
      <link>http://www.sweetpotatosoftware.com/spsblog/2008/12/19/VisualFoxproJSONClassUpdate.aspx</link>
      <pubDate>Fri, 19 Dec 2008 09:43:59 GMT</pubDate>
      <description>&lt;b&gt;JSON Class Update&lt;br&gt;
&lt;/b&gt;Since my &lt;a href="http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,5f96efd7-f350-4bc8-86c5-caffd9e833eb.aspx"&gt;initial
post&lt;/a&gt; regarding this class, work has continued improving it. A number of fixes
and enhancement can be found in the latest version...&lt;br&gt;
&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Fixes to parse method&lt;/b&gt; - There was a problem with brace matching for "{}" and
"[]" when nested in certain ways.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Fixes to UseUTCDatetime functionality&lt;/b&gt; - rules are now as follows:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;
UseUTCDateTime = .F. &amp;amp;&amp;amp; Datetimes will stringify including Local offset from
UTC&lt;/li&gt;
&lt;li&gt;
UseUTCDateTime = .T. &amp;amp;&amp;amp; Datetimes will stringify as UTC equivalent for Local&lt;/li&gt;
&lt;li&gt;
Parse() &amp;amp;&amp;amp; will always return Local equivalent&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;b&gt;Fixes to GetTimezoneOffset method&lt;/b&gt; - now respects Standard/Daylight boundaries
of datetimes&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Fixed Stringify&lt;/b&gt; - cursors are serialized to valid JSON now&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Added KeyForCursor property&lt;/b&gt; - this allows a JSON key to be specified for identifying
cursors (defaulted to "VFPData")&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Enhanced Stringify and Parse methods&lt;/b&gt; - they now handle the VFP Collection class
with aplomb&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Added KeyForItems property&lt;/b&gt; - when serializing Collections, the key for the
contained JSON object's array property can be defined (defaulted to "items")&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Renamed DateSerializationType property&lt;/b&gt; - it is now ParseDateType&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Enhanced Parse&lt;/b&gt; - JSON class will now (optionally) respect Class and ClassLibrary
properties if they exist in a JSON object being deserialized (see ParseRespectClass
property). This means that if you Stringify() a VFP Form and then Parse() the JSON
(with ParseRespectClass = .T.) you will get a Form object back rather than an Empty
object with the same properties as the Form.&lt;/li&gt;
&lt;/ul&gt;
I would consider the JSON class production-ready at this point. This doesn't mean
that bugs won't be found in the future, but it has been hammered on enough that I
wouldn't hesitate to use it in a production application.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Visual FoxPro Now Listed&lt;br&gt;
&lt;/b&gt;I got in touch with &lt;a href="http://www.crockford.com/"&gt;Douglas Crockford&lt;/a&gt; and
was able to get Visual FoxPro listed on &lt;a href="http://www.json.org/"&gt;JSON.org&lt;/a&gt; with
a link to my initial post. I appreciate Douglas Crockford taking the time out of his
busy schedule to list Visual FoxPro on the JSON site.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Special Thank You&lt;br&gt;
&lt;/b&gt;Nearly all of the fixes and enhancements provided in this version of the JSON
class were made possible by the help and prodding I received from Frank Dietrich of
Berlin. He is an extremely bright fellow. Implementing the Timezone and Daylight vs.
Standard stuff drove us both to the brink. I sincerely doubt I could have done it
without his help.&lt;br&gt;
&lt;br&gt;
&lt;a href="http://www.sweetpotatosoftware.com/files/json.zip"&gt;Download the JSON class
library (approx. 59 KB)&lt;/a&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="font-size: 11px; color: black; font-family: Courier New; background-color: transparent;"&gt;&lt;font size="2" face="Verdana"&gt;The
download contains the JSON class in both VCX and PRG format. They are the same. Use
whichever one you prefe&lt;/font&gt;&lt;/span&gt;r.&lt;br&gt;
&lt;img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=5ac8d202-98b4-4ee8-998d-692e4b597bec" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.sweetpotatosoftware.com"&gt;SweetPotato
Software, Inc.&lt;/a&gt;</description>
      <comments>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,5ac8d202-98b4-4ee8-998d-692e4b597bec.aspx</comments>
      <category>Information Technology</category>
      <category>Visual Foxpro</category>
    </item>
    <item>
      <trackback:ping>http://www.sweetpotatosoftware.com/spsblog/Trackback.aspx?guid=416ae65b-0af2-4145-8637-aa0d81d77637</trackback:ping>
      <pingback:server>http://www.sweetpotatosoftware.com/spsblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,416ae65b-0af2-4145-8637-aa0d81d77637.aspx</pingback:target>
      <dc:creator>Craig Boyd</dc:creator>
      <wfw:comment>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,416ae65b-0af2-4145-8637-aa0d81d77637.aspx</wfw:comment>
      <wfw:commentRss>http://www.sweetpotatosoftware.com/spsblog/SyndicationService.asmx/GetEntryCommentsRss?guid=416ae65b-0af2-4145-8637-aa0d81d77637</wfw:commentRss>
      <slash:comments>17</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <strong>VFPCompression Bug Fixes</strong>
          <br />
I received some really good feedback after posting my <a href="http://www.sweetpotatosoftware.com/SPSBlog/CommentView,guid,ebdf7fe4-f97c-4e61-9018-3007904ed8da.aspx#commentstart">previous
blog entry</a> concerning this library from Curt Hamlin and Eduard. There were two
bugs there that I felt needed some immediate attention, so in this blog entry I present
a version of VFPCompression that addresses them.<br /><br />
The first bug was the one that Curt Hamlin ran into where something screwy was going
on if the zip file wasn't somehow relative to the files or folders being zipped. The
following code...
</p>
        <p>
ZipOpen("F:\MyZipFile.zip") &amp;&amp; note zip is going to F: drive<br />
ZipFolder("C:\MyFolder\", .F.)  &amp;&amp; note folder being zipped is on C:
drive<br />
ZipClose() 
<br /><br />
...would result in an empty zip file being created (not good). While the other bug
was the one that Eduard reported where the ZipFolderQuick function wasn't applying
the optional password to the files being zipped. To make a long story short, I was
able to verify that these were actual bugs in the library, and I have uploaded
a new version of VFPCompression.fll that fixes them.
</p>
        <p>
          <strong>VFPCompression Enhancement</strong>
          <br />
Something that I didn't like in the FLL was that in order to extract the contents
of a zip to a particular folder that folder had to already exist in the file system.
I decided that the FLL should try and create a folder if it doesn't already exist
when extracting, which it now does.
</p>
        <p>
          <a href="http://www.sweetpotatosoftware.com/files/vfpcompression.zip">VFPCompression
FLL Download (approx. 38 KB)</a>
          <br />
          <br />
The VFP Compression Library sample code and documentation can still be found at my <a href="http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,ebdf7fe4-f97c-4e61-9018-3007904ed8da.aspx">previous
blog entry</a>.
</p>
        <img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=416ae65b-0af2-4145-8637-aa0d81d77637" />
        <br />
        <hr />
This weblog is sponsored by <a href="http://www.sweetpotatosoftware.com">SweetPotato
Software, Inc.</a></body>
      <title>VFPCompression Update - A Couple of Fixes and a Slight Enhancement</title>
      <guid isPermaLink="false">http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,416ae65b-0af2-4145-8637-aa0d81d77637.aspx</guid>
      <link>http://www.sweetpotatosoftware.com/spsblog/2008/12/08/VFPCompressionUpdateACoupleOfFixesAndASlightEnhancement.aspx</link>
      <pubDate>Mon, 08 Dec 2008 11:35:21 GMT</pubDate>
      <description>&lt;p&gt;
&lt;strong&gt;VFPCompression Bug Fixes&lt;/strong&gt;
&lt;br&gt;
I received some really good feedback after posting my &lt;a href="http://www.sweetpotatosoftware.com/SPSBlog/CommentView,guid,ebdf7fe4-f97c-4e61-9018-3007904ed8da.aspx#commentstart"&gt;previous
blog entry&lt;/a&gt; concerning this library from Curt Hamlin and Eduard. There were two
bugs there that I felt needed some immediate attention, so in this blog entry I present
a version of VFPCompression that addresses them.&lt;br&gt;
&lt;br&gt;
The first bug was the one that Curt Hamlin ran into where something screwy was going
on if the zip file wasn't somehow relative to the files or folders being zipped. The
following code...
&lt;/p&gt;
&lt;p&gt;
ZipOpen("F:\MyZipFile.zip") &amp;amp;&amp;amp; note zip is going to F: drive&lt;br&gt;
ZipFolder("C:\MyFolder\", .F.)&amp;nbsp; &amp;amp;&amp;amp; note folder being zipped is on C:
drive&lt;br&gt;
ZipClose() 
&lt;br&gt;
&lt;br&gt;
...would result in an empty zip file being created (not good). While the other bug
was the one that Eduard reported where&amp;nbsp;the ZipFolderQuick function wasn't applying
the optional password to the files being zipped. To make a long story short, I was
able to verify that these&amp;nbsp;were actual bugs in the library, and I have uploaded
a new version of VFPCompression.fll that fixes them.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;VFPCompression Enhancement&lt;/strong&gt;
&lt;br&gt;
Something that I didn't like in the FLL was that in order to extract the contents
of a zip to a particular folder that folder had to already exist in the file system.
I decided that the FLL should try and create a folder if it doesn't already exist
when extracting, which it now does.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.sweetpotatosoftware.com/files/vfpcompression.zip"&gt;VFPCompression
FLL Download (approx. 38 KB)&lt;/a&gt;
&lt;br&gt;
&lt;br&gt;
The VFP Compression Library sample code and documentation can still be found at my &lt;a href="http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,ebdf7fe4-f97c-4e61-9018-3007904ed8da.aspx"&gt;previous
blog entry&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=416ae65b-0af2-4145-8637-aa0d81d77637" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.sweetpotatosoftware.com"&gt;SweetPotato
Software, Inc.&lt;/a&gt;</description>
      <comments>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,416ae65b-0af2-4145-8637-aa0d81d77637.aspx</comments>
      <category>Information Technology</category>
      <category>Visual Foxpro</category>
    </item>
    <item>
      <trackback:ping>http://www.sweetpotatosoftware.com/spsblog/Trackback.aspx?guid=3bc4195f-5c1d-42d0-9053-f4069ce8869e</trackback:ping>
      <pingback:server>http://www.sweetpotatosoftware.com/spsblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,3bc4195f-5c1d-42d0-9053-f4069ce8869e.aspx</pingback:target>
      <dc:creator>Craig Boyd</dc:creator>
      <wfw:comment>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,3bc4195f-5c1d-42d0-9053-f4069ce8869e.aspx</wfw:comment>
      <wfw:commentRss>http://www.sweetpotatosoftware.com/spsblog/SyndicationService.asmx/GetEntryCommentsRss?guid=3bc4195f-5c1d-42d0-9053-f4069ce8869e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <strong>Search Revisited</strong>
          <br />
I've spoken about the work I was doing with <a href="http://www.microsoft.com/windows/products/winfamily/desktopsearch/default.mspx">Windows
Desktop Search</a> (WDS) and Visual FoxPro before on this blog <a href="http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,421e07bc-8210-44c2-bfd2-423e7c8eb53e.aspx">here</a> and <a href="http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,c5ff0b43-a24d-43a6-b290-94fe9cfd4492.aspx">here</a>.
Though the project I present in this blog entry began when WDS 2.0 was the latest
and greatest, it was rewritten for WDS 3.0 and has been revamped some and tested with
WDS 4.0 (the latest and greatest as of this writing). In any event, this project was
being considered by Microsoft (MS) for inclusion as part of Sedna, but never
made the cut. I later obtained permission from MS to release it on my own, but haven't
found time to test it or post it until now.
</p>
        <p>
          <strong>Foxy Search Value</strong>
          <br />
There are many things of value in the Foxy Search sample...
</p>
        <ul>
          <li>
Shows how to properly use the WDS OLEDB Provider from VFP.</li>
          <li>
Provides a guide to the proper SQL syntax for WDS.</li>
          <li>
Includes a list of fields available via the OLEDB Provider. (see fields.dbf)</li>
          <li>
Provides VFP develpers a class for working with WDS and ultimately returning search
results as VFP cursors.</li>
        </ul>
        <p>
If nothing else, Foxy Search provides a pretty good sample for messing with when trying
out various aspects of WDS. It does not provide examples of the creation or use of IFilters,
handlers, or thumbnail extractors - if you are looking for those you'll have to look
elsewhere at the moment.
</p>
        <p>
          <strong>Foxy Search Errors</strong>
          <br />
It should be noted that Foxy Search can, and will, throw errors depending on the combinations
of display fields, filters, and/or sorting chosen. Rather than attempt to restrict
what can and can't be chosen to lessen the errors, I felt it was easier to just allow
the developer using it to mess around with everything and see what is and what isn't
possible. Feel free to change the Throw Error in the Catch of the form's GetSearchResults
method to handle the various errors you run into if you feel like it (or just comment
it out if you want it to fail silently).
</p>
        <p>
          <strong>Don't Have Windows Desktop Search?<br /></strong>You can check whether you have Windows Desktop Search and what version of
it is on your system by looking in the Control Panel's Add &amp; Remove Programs or
by looking in your registry under the "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
Desktop Search" key where there is a "Version" value. If you don't have WDS (or you
are running an outdated version) you can go to the MS site to <a href="http://www.microsoft.com/windows/products/winfamily/desktopsearch/choose/windowssearch4.mspx?tab=Install%20It">download
and install WDS v4.0</a>.
</p>
        <p>
Until next time... Visual FoxPro Rocks!
</p>
        <p>
          <a href="http://www.sweetpotatosoftware.com/files/foxysearch.zip">Download Foxy Search
1.0 (approx. 89 KB)</a>
        </p>
        <p>
          <img src="http://www.sweetpotatosoftware.com/SPSBlog/content/binary/foxysearch1.png" border="0" />
        </p>
        <p>
          <strong>Figure 1:</strong> Shows Foxy Search being used to find all of the FOXUSER
files on my system and display information about each result.
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=3bc4195f-5c1d-42d0-9053-f4069ce8869e" />
        <br />
        <hr />
This weblog is sponsored by <a href="http://www.sweetpotatosoftware.com">SweetPotato
Software, Inc.</a></body>
      <title>Visual FoxPro and Windows Desktop Search</title>
      <guid isPermaLink="false">http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,3bc4195f-5c1d-42d0-9053-f4069ce8869e.aspx</guid>
      <link>http://www.sweetpotatosoftware.com/spsblog/2008/12/08/VisualFoxProAndWindowsDesktopSearch.aspx</link>
      <pubDate>Mon, 08 Dec 2008 10:08:19 GMT</pubDate>
      <description>&lt;p&gt;
&lt;strong&gt;Search Revisited&lt;/strong&gt;
&lt;br&gt;
I've spoken about the work I was doing with &lt;a href="http://www.microsoft.com/windows/products/winfamily/desktopsearch/default.mspx"&gt;Windows
Desktop Search&lt;/a&gt; (WDS)&amp;nbsp;and Visual FoxPro before on this blog &lt;a href="http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,421e07bc-8210-44c2-bfd2-423e7c8eb53e.aspx"&gt;here&lt;/a&gt; and &lt;a href="http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,c5ff0b43-a24d-43a6-b290-94fe9cfd4492.aspx"&gt;here&lt;/a&gt;.
Though the project I present in this blog entry began when WDS 2.0 was the latest
and greatest, it was rewritten for WDS 3.0 and has been revamped some and tested with
WDS 4.0 (the latest and greatest as of this writing). In any event, this project was
being considered by Microsoft (MS)&amp;nbsp;for inclusion as part of Sedna, but never
made the cut. I later obtained permission from MS to release it on my own, but&amp;nbsp;haven't
found time to test it or post it until now.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Foxy Search Value&lt;/strong&gt;
&lt;br&gt;
There are many things of value in the Foxy Search sample...
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Shows how to properly use the WDS OLEDB Provider from VFP.&lt;/li&gt;
&lt;li&gt;
Provides a guide to the proper SQL syntax&amp;nbsp;for WDS.&lt;/li&gt;
&lt;li&gt;
Includes a list of fields available via the OLEDB Provider. (see fields.dbf)&lt;/li&gt;
&lt;li&gt;
Provides VFP develpers a class for working with WDS and ultimately returning search
results as VFP cursors.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
If nothing else, Foxy Search provides a pretty good sample for messing with when trying
out various aspects of WDS. It does not provide examples of the creation or use of&amp;nbsp;IFilters,
handlers, or thumbnail extractors - if you are looking for those you'll have to look
elsewhere at the moment.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Foxy Search Errors&lt;/strong&gt;
&lt;br&gt;
It should be noted that Foxy Search can, and will, throw errors depending on the combinations
of display fields, filters, and/or sorting chosen. Rather than attempt to restrict
what can and can't be chosen to lessen the errors, I felt it was easier to just allow
the developer using it to mess around with everything and see what is and what isn't
possible. Feel free to change the Throw Error in the Catch of the form's GetSearchResults
method to handle the various errors you run into if you feel like it (or just comment
it out if you want it to fail silently).
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Don't Have Windows Desktop Search?&lt;br&gt;
&lt;/strong&gt;You can check whether you have Windows Desktop Search and what version of
it is on your system by looking in the Control Panel's Add &amp;amp; Remove Programs or
by looking in your registry under the "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
Desktop Search" key where there is a "Version" value. If you don't have WDS (or you
are running an outdated version) you can go to the MS site to&amp;nbsp;&lt;a href="http://www.microsoft.com/windows/products/winfamily/desktopsearch/choose/windowssearch4.mspx?tab=Install%20It"&gt;download
and install WDS v4.0&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Until next time... Visual FoxPro Rocks!
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.sweetpotatosoftware.com/files/foxysearch.zip"&gt;Download Foxy Search
1.0 (approx.&amp;nbsp;89 KB)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.sweetpotatosoftware.com/SPSBlog/content/binary/foxysearch1.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Figure 1:&lt;/strong&gt; Shows Foxy Search being used to find all of the FOXUSER
files on my system and display information about each result.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=3bc4195f-5c1d-42d0-9053-f4069ce8869e" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.sweetpotatosoftware.com"&gt;SweetPotato
Software, Inc.&lt;/a&gt;</description>
      <comments>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,3bc4195f-5c1d-42d0-9053-f4069ce8869e.aspx</comments>
      <category>Information Technology</category>
      <category>Visual Foxpro</category>
    </item>
    <item>
      <trackback:ping>http://www.sweetpotatosoftware.com/spsblog/Trackback.aspx?guid=b6eb576c-7142-4993-b3f2-74b7af5fb66c</trackback:ping>
      <pingback:server>http://www.sweetpotatosoftware.com/spsblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,b6eb576c-7142-4993-b3f2-74b7af5fb66c.aspx</pingback:target>
      <dc:creator>Craig Boyd</dc:creator>
      <wfw:comment>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,b6eb576c-7142-4993-b3f2-74b7af5fb66c.aspx</wfw:comment>
      <wfw:commentRss>http://www.sweetpotatosoftware.com/spsblog/SyndicationService.asmx/GetEntryCommentsRss?guid=b6eb576c-7142-4993-b3f2-74b7af5fb66c</wfw:commentRss>
      <slash:comments>14</slash:comments>
      <title>VFPConnection Update - HTTP Post, FTP Commands and More...</title>
      <guid isPermaLink="false">http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,b6eb576c-7142-4993-b3f2-74b7af5fb66c.aspx</guid>
      <link>http://www.sweetpotatosoftware.com/spsblog/2008/12/05/VFPConnectionUpdateHTTPPostFTPCommandsAndMore.aspx</link>
      <pubDate>Fri, 05 Dec 2008 15:54:45 GMT</pubDate>
      <description>&lt;p&gt;
&lt;strong&gt;VFPConnection Library Update&lt;br&gt;
&lt;/strong&gt;It hasn't been too many days since I posted &lt;a href="http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,7c6e5339-8cc5-41c1-8b11-56fb957cdffb.aspx"&gt;an
update to this library&lt;/a&gt;. The two big enhancements in that update was SSL support
and a mechanism for tracing. It was fairly well received and appeared to work well
for those that downloaded it, but I mentioned at the end of that blog entry that I
wanted to do a few other enhancements surrounding FTP commands and HTTP Posts. This
update provides that functionality among other things.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;What's New&lt;br&gt;
&lt;/strong&gt;I've added 10 new functions to the FLL and documentation. These include:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
HTTPSimplePost&lt;/li&gt;
&lt;li&gt;
HTTPPost&lt;/li&gt;
&lt;li&gt;
FTPCommands&lt;/li&gt;
&lt;li&gt;
FTPSCommands&lt;/li&gt;
&lt;li&gt;
URLEncode&lt;/li&gt;
&lt;li&gt;
URLDecode&lt;/li&gt;
&lt;li&gt;
DateStrToEpochSec&lt;/li&gt;
&lt;li&gt;
SetConnectTimeout&lt;/li&gt;
&lt;li&gt;
SetResponseTimeout&lt;/li&gt;
&lt;li&gt;
CurlVersion 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I've also done some refactoring within the library and a few performance enhancements
(though it was pretty darn fast to already).
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;What's Next&lt;/strong&gt;
&lt;br&gt;
If you download and use this library then you might consider taking the time to provide
me feedback and any suggestions you may have for further improving it. The update
provided here is a testament to the fact that your feedback is valuable and an integral
part of the improvement process for the stuff I provide to the VFP Community.
&lt;/p&gt;
&lt;p&gt;
Until next time... Visual FoxPro Rocks!
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.sweetpotatosoftware.com/files/vfpconnection.zip"&gt;VFPConnection
FLL Download (400 KB approx.)&lt;/a&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;VFPConnection.FLL Sample Use Code:&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; The
code below &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;is&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;not&lt;/span&gt; designed &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;to&lt;/span&gt; run
all at once&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Run
the individual examples seperately&lt;br&gt;
&lt;br&gt;
********************************************************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Upload
Examples&lt;br&gt;
********************************************************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; (LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"vfpconnection.fll"&lt;/span&gt;,&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FLL"&lt;/span&gt;))&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; FILE&lt;br&gt;
?&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;FILEGet&lt;/span&gt;(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"File:///C:\Source.txt"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Destination.txt"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyProgress()"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; FTP&lt;br&gt;
?FTPGet(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FTP://UserName:Password@somedomain.com/directory/Source.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Destination.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyProgress()"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; FTPS&lt;br&gt;
?FTPSGet(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FTPS://UserName:Password@somedomain.com:21/directory/Source.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Destination.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyProgress()"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; HTTP&lt;br&gt;
?HTTPGet(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"http://www.somedomain.com/Source.htm"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Destination.htm"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyProgress()"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; HTTPS&lt;br&gt;
?HTTPSGet(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"https://www.somedomain.com/Source.htm"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Destination.htm"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyProgress()"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
********************************************************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Download
Examples&lt;br&gt;
********************************************************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; (LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"vfpconnection.fll"&lt;/span&gt;,&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FLL"&lt;/span&gt;))&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; FILE&lt;br&gt;
?&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;FILEPut&lt;/span&gt;(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Source.txt"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"File:///C:\Destination.txt"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyProgress()"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; FTP&lt;br&gt;
?FTPPut(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Source.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FTP://UserName:Password@somedomain.com/directory/Destination.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyProgress()"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; FTPS&lt;br&gt;
?FTPSPut(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Source.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FTPS://UserName:Password@somedomain.com:21/directory/Destination.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyProgress()"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; HTTP&lt;br&gt;
?HTTPPut(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Source.htm"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"http://www.somedomain.com/Destination.htm"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyProgress()"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; HTTPS&lt;br&gt;
?HTTPSPut(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Source.htm"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"https://www.somedomain.com/Destination.htm"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyProgress()"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
********************************************************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;To&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;String&lt;/span&gt; Examples&lt;br&gt;
********************************************************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; (LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"vfpconnection.fll"&lt;/span&gt;,&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FLL"&lt;/span&gt;))&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; FILE&lt;br&gt;
?FILEToStr(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Source.txt"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; FTP&lt;br&gt;
?FTPTOSTR(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FTP://UserName:Password@somedomain.com:21/directory/Source.txt"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; FTPS&lt;br&gt;
?FTPSTOSTR(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FTPS://UserName:Password@somedomain.com:21/directory/Source.txt"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; HTTP&lt;br&gt;
?HTTPToStr(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"http://www.somedomain.com/Source.txt"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; HTTPS&lt;br&gt;
?HTTPSToStr(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"https://www.somedomain.com/Source.txt"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
********************************************************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; HTTP
Post Examples&lt;br&gt;
********************************************************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Simple
HTTP Post&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; (LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"vfpconnection.fll"&lt;/span&gt;,&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FLL"&lt;/span&gt;))&lt;br&gt;
LOCAL lcPost&lt;br&gt;
m.lcPost &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"fname=John&amp;lname=Smith"&lt;/span&gt;
&lt;br&gt;
?HttpSimplePost(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"http://www.snee.com/xml/crud/posttest.cgi"&lt;/span&gt;,
m.lcPost, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;""&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; MultiPart/Form-Data
HTTP Post&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; (LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"vfpconnection.fll"&lt;/span&gt;,&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FLL"&lt;/span&gt;))&lt;br&gt;
LOCAL ARRAY aryPost(2,2)&lt;br&gt;
aryPost(1,1) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"fname"&lt;/span&gt; &amp;&amp;
name&lt;br&gt;
aryPost(1,2) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"test
first"&lt;/span&gt; &amp;&amp; value&lt;br&gt;
aryPost(2,1) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"lname"&lt;/span&gt; &amp;&amp;
name&lt;br&gt;
aryPost(2,2) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"test
last"&lt;/span&gt; &amp;&amp; value&lt;br&gt;
?HttpPost(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"http://www.cs.tut.fi/cgi-bin/run/~jkorpela/echo.cgi"&lt;/span&gt;,
@aryPost, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;""&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
********************************************************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; FTP
Commands Example&lt;br&gt;
********************************************************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Rename&lt;/span&gt; FTP
Directory&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; (LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"vfpconnection.fll"&lt;/span&gt;,&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FLL"&lt;/span&gt;))&lt;br&gt;
LOCAL ARRAY aryFTPCommands(4)&lt;br&gt;
aryFTPCommands(1) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"CWD
/"&lt;/span&gt;
&lt;br&gt;
aryFTPCommands(2) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"PWD"&lt;/span&gt;
&lt;br&gt;
aryFTPCommands(3) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"RNFR
MyDir"&lt;/span&gt;
&lt;br&gt;
aryFTPCommands(4) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"RNTO
RenamedMyDir"&lt;/span&gt;
&lt;br&gt;
?FTPCommands(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FTP://username:password@somedomain.com/"&lt;/span&gt;,
@aryFTPCommands, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; ?FTPSCommands(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FTPS://username:password@somedomain.com/"&lt;/span&gt;,
@aryFTPCommands, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
********************************************************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; URL
Encode/Decode Example&lt;br&gt;
********************************************************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; (LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"vfpconnection.fll"&lt;/span&gt;,&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FLL"&lt;/span&gt;))&lt;br&gt;
LOCAL lcString, lcEncoded, lcDecoded&lt;br&gt;
m.lcString &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"A!B@C#D$E%F^G&amp;H*I(J)K_L-M=N+O[P]Q{R}S|T\U:V;W'X,Y.Z&lt;0&gt;
1/2?3©4©5©6©7©8©9"
&lt;/span&gt;
&lt;br&gt;
m.lcEncoded &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; UrlEncode(m.lcString)&lt;br&gt;
m.lcDecoded &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; UrlDecode(m.lcEncoded)&lt;br&gt;
?&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Escaped:
"&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; m.lcEncoded&lt;br&gt;
?&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Unescaped:
"&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; m.lcDecoded&lt;br&gt;
?&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Original
: "&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; m.lcString&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
********************************************************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Setting
Timeouts Example&lt;br&gt;
********************************************************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; (LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"vfpconnection.fll"&lt;/span&gt;,&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FLL"&lt;/span&gt;))&lt;br&gt;
SetConnectTimeout(30) &amp;&amp; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Default&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;is&lt;/span&gt; 10
seconds&lt;br&gt;
SetResponseTimeout(30) &amp;&amp; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Default&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;is&lt;/span&gt; 10
seconds&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
********************************************************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Datetime &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;String&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;to&lt;/span&gt; the &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;number&lt;/span&gt; of
seconds from Epoch (12 Midnight &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;on&lt;/span&gt; January
1, 1970)&lt;br&gt;
********************************************************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; (LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"vfpconnection.fll"&lt;/span&gt;,&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FLL"&lt;/span&gt;))&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Sun,
06 Nov 1994 08:49:37 GMT"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Sunday,
06-Nov-94 08:49:37 GMT"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Sun
Nov 6 08:49:37 1994"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"06
Nov 1994 08:49:37 GMT"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"06-Nov-94
08:49:37 GMT"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Nov
6 08:49:37 1994"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"06
Nov 1994 08:49:37"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"06-Nov-94
08:49:37"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"1994
Nov 6 08:49:37"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"GMT
08:49:37 06-Nov-94 Sunday"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"94
6 Nov 08:49:37"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"1994
Nov 6"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"06-Nov-94"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Sun
Nov 6 94"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"1994.Nov.6"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Sun/Nov/6/94/GMT"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Sun,
06 Nov 1994 08:49:37 CET"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"06
Nov 1994 08:49:37 EST"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Sun,
12 Sep 2004 15:05:58 -0700"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Sat,
11 Sep 2004 21:32:11 +0200"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"20040912
15:05:58 -0700"&lt;/span&gt;)&lt;br&gt;
?DateStrToEpochSec(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"20040911
+0200"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
********************************************************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Determine
the version of libcurl &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;and&lt;/span&gt; OpenSSL
that were used &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;for&lt;/span&gt; VFPConnection.fll&lt;br&gt;
********************************************************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; (LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"vfpconnection.fll"&lt;/span&gt;,&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FLL"&lt;/span&gt;))&lt;br&gt;
?CURLVERSION()&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; 
&lt;br&gt;
&lt;br&gt;
***********************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;FUNCTION&lt;/span&gt; MyProgress()
&amp;&amp; Callback from the FLL &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;-&lt;/span&gt; can
be used &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;to&lt;/span&gt; track
operation progress&lt;br&gt;
***********************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; You
can create your own &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;function&lt;/span&gt;,
procedure &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;or&lt;/span&gt; method &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;to&lt;/span&gt; handle
this &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;and&lt;/span&gt; name
it whatever you want.&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; The
nConnectTotalBytes &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;and&lt;/span&gt; nConnectBytesSoFar
are &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;private&lt;/span&gt; variables
created &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;on&lt;/span&gt;-the-fly
by the FLL&lt;br&gt;
?m.nConnectTotalBytes&lt;br&gt;
?m.nConnectBytesSoFar&lt;br&gt;
ENDFUNC&lt;br&gt;
&lt;br&gt;
***********************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;FUNCTION&lt;/span&gt; MyTrace()
&amp;&amp; Callback from the FLL &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;-&lt;/span&gt; used &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;to&lt;/span&gt; provide
a detailed trace of the operation&lt;br&gt;
***********************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; You
can create your own &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;function&lt;/span&gt;,
procedure &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;or&lt;/span&gt; method &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;to&lt;/span&gt; handle
this &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;and&lt;/span&gt; name
it whatever you want.&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; The
nTraceDataType &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;and&lt;/span&gt; cTraceData
are &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;private&lt;/span&gt; variables
created &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;on&lt;/span&gt;-the-fly
by the FLL&lt;br&gt;
#DEFINE TYPE_TEXT 0&lt;br&gt;
#DEFINE TYPE_HEADER_IN 1&lt;br&gt;
#DEFINE TYPE_HEADER_OUT 2&lt;br&gt;
#DEFINE TYPE_DATA_IN 3&lt;br&gt;
#DEFINE TYPE_DATA_OUT 4&lt;br&gt;
#DEFINE TYPE_SSL_DATA_IN 5&lt;br&gt;
#DEFINE TYPE_SSL_DATA_OUT 6&lt;br&gt;
#DEFINE TYPE_END 7&lt;br&gt;
?ICASE(m.nTraceDataType &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; TYPE_TEXT, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"STATUS:"&lt;/span&gt;,
;&lt;br&gt;
m.nTraceDataType &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; TYPE_HEADER_IN, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&lt;RECV header: "&lt;/SPAN&gt;
, ;&lt;br&gt;
m.nTraceDataType &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; TYPE_HEADER_OUT, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&gt;SEND
HEADER: "&lt;/span&gt;, ;&lt;br&gt;
m.nTraceDataType &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; TYPE_DATA_IN, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&lt;RECV data: "&lt;/SPAN&gt;
, ;&lt;br&gt;
m.nTraceDataType &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; TYPE_DATA_OUT, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&gt;SEND
DATA: "&lt;/span&gt;, ;&lt;br&gt;
m.nTraceDataType &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; TYPE_SSL_DATA_IN, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&lt;RECV ssl data: "&lt;/SPAN&gt;
, ;&lt;br&gt;
m.nTraceDataType &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; TYPE_SSL_DATA_OUT, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&gt;SEND
SSL DATA: "&lt;/span&gt;, ;&lt;br&gt;
m.nTraceDataType &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; TYPE_END, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"END:
"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"UNKNOWN:
"&lt;/span&gt;)&lt;br&gt;
??m.cTraceData&lt;br&gt;
ENDFUNC
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;VFPConnection.FLL Documenation:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function FTPGet() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; FTPGet(cSourceURL, cDestination[, cProgressCallback[, cTraceCallback]])
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cSourceURL - The URL to the file you wish to download.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cDestination - The full path and file name where you want the source file saved.
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cProgressCallback - An optional string denoting a function, procedure, or method that
you want fired whenever a read/write occurs, such as "MyProgress()".
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
Logical - returns .T. if successful or .F. if the operation has failed.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
This function provides the ability to download a file from an FTP site.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
In order to specify port or login information you would simply include them in cSourceURL,
such as “FTP://myusername:mypassword@myftpsite.com:21/mydir/myfile.zip”.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: 0 = Text, 1 = Header In, 2 = Header Out, 3 = Data In, 4 = Data Out,
5 = SSL Data In, 6 = SSL Data Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function FTPSGet() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; FTPSGet(cSourceURL, cDestination[, cProgressCallback[, cTraceCallback]])
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cSourceURL - The URL to the file you wish to download.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cDestination - The full path and file name where you want the source file saved.
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cProgressCallback - An optional string denoting a function, procedure, or method that
you want fired whenever a read/write occurs, such as "MyProgress()".
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
Logical - returns .T. if successful or .F. if the operation has failed.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
This function provides the ability to download a file from an FTP site that provides
FTP over Secure Sockets Layer (SSL). It should be noted that this function does not
check the site's certificate for authenticity/validness nor does it compare the site
to the identity specified by the certificate.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
In order to specify port or login information you would simply include them in cSourceURL,
such as “FTPS://myusername:mypassword@myftpsite.com:21/mydir/myfile.zip”.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: 0 = Text, 1 = Header In, 2 = Header Out, 3 = Data In, 4 = Data Out,
5 = SSL Data In, 6 = SSL Data Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function HTTPGet() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; HTTPGet(cSourceURL, cDestination[, cProgressCallback[, cTraceCallback]])
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cSourceURL - The URL to the file you wish to download.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cDestination - The full path and file name where you want the source file saved.
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cProgressCallback - An optional string denoting a function, procedure, or method that
you want fired whenever a read/write occurs, such as "MyProgress()".
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
Logical - returns .T. if successful or .F. if the operation has failed.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
This function provides the ability to download a file from a website.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: 0 = Text, 1 = Header In, 2 = Header Out, 3 = Data In, 4 = Data Out,
5 = SSL Data In, 6 = SSL Data Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function HTTPSGet() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; HTTPSGet(cSourceURL, cDestination[, cProgressCallback[, cTraceCallback]])
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cSourceURL - The URL to the file you wish to download.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cDestination - The full path and file name where you want the source file saved.
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cProgressCallback - An optional string denoting a function, procedure, or method that
you want fired whenever a read/write occurs, such as "MyProgress()".
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
Logical - returns .T. if successful or .F. if the operation has failed.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
This function provides the ability to download a file from a a website that provides
HTTP over Secure Sockets Layer (SSL). It should be noted that this function does not
check the site's certificate for authenticity/validness nor does it compare the site
to the identity specified by the certificate.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: 0 = Text, 1 = Header In, 2 = Header Out, 3 = Data In, 4 = Data Out,
5 = SSL Data In, 6 = SSL Data Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function FILEGet() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; FILEGet(cSourceURL, cDestination[, cProgressCallback[, cTraceCallback]])
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cSourceURL - The full path and file name to the file you wish to copy.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cDestination - The full path and file name where you want the source file saved.
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cProgressCallback – An optional string denoting a function, procedure, or method that
you want fired whenever a read/write occurs, such as "MyProgress()".
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
Logical - returns .T. if successful or .F. if the operation has failed.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
This function provides the ability to copy a file from a local or remote location.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
The format for the cSourceURL parameter is slightly different than you might expect.
In order to copy file C:\MyDir\MyFile.zip you would specify cSourceURL as “FILE://
C:\MyDir\MyFile.zip”.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: 0 = Text, 1 = Header In, 2 = Header Out, 3 = Data In, 4 = Data Out,
5 = SSL Data In, 6 = SSL Data Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function FTPPut() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; FTPPut(cSource, cDestinationURL[, cProgressCallback[, cTraceCallback]])
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cSource - The full path and file name of the file you want uploaded.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cDestinationURL - The URL to where the file specified in cSource should be uploaded
to.
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cProgressCallback - An optional string denoting a function, procedure, or method that
you want fired whenever a read/write occurs, such as "MyProgress()".
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
Logical - returns .T. if successful or .F. if the operation has failed.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
This function provides the ability to upload a file to an FTP site.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
In order to specify port or login information you would simply include them in cDestinationURL,
such as “FTP://myusername:mypassword@myftpsite.com:21/mydir/myfile.zip”.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: 0 = Text, 1 = Header In, 2 = Header Out, 3 = Data In, 4 = Data Out,
5 = SSL Data In, 6 = SSL Data Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function FTPSPut() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
&lt;b&gt;Signature:&lt;/b&gt; FTPSPut(cSource, cDestinationURL[, cProgressCallback[, cTraceCallback]])
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
cSource - The full path and file name of the file you want uploaded.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
cDestinationURL - The URL to where the file specified in cSource should be uploaded
to.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
cProgressCallback - An optional string denoting a function, procedure, or method that
you want fired whenever a read/write occurs, such as "MyProgress()".
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
Logical - returns .T. if successful or .F. if the operation has failed.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
This function provides the ability to upload a file to an FTP site that provides FTP
over Secure Sockets Layer (SSL). It should be noted that this function does not check
the site's certificate for authenticity/validness nor does it compare the site to
the identity specified by the certificate.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
In order to specify port or login information you would simply include them in cDestinationURL,
such as “FTPS://myusername:mypassword@myftpsite.com:21/mydir/myfile.zip”.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
When the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
When the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: 0 = Text, 1 = Header In, 2 = Header Out, 3 = Data In, 4 = Data Out,
5 = SSL Data In, 6 = SSL Data Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
&lt;b&gt;Function HTTPPut() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; HTTPPut(cSource, cDestinationURL[, cProgressCallback[, cTraceCallback]])
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cSource - The full path and file name of the file you want uploaded.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cDestinationURL - The URL to where the file specified in cSource should be uploaded
to.
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cProgressCallback - An optional string denoting a function, procedure, or method that
you want fired whenever a read/write occurs, such as "MyProgress()".
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
Logical - returns .T. if successful or .F. if the operation has failed.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
This function provides the ability to upload a file to a website.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: 0 = Text, 1 = Header In, 2 = Header Out, 3 = Data In, 4 = Data Out,
5 = SSL Data In, 6 = SSL Data Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function HTTPSPut() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; HTTPSPut(cSource, cDestinationURL[, cProgressCallback[, cTraceCallback]])
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cSource - The full path and file name of the file you want uploaded.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cDestinationURL - The URL to where the file specified in cSource should be uploaded
to.
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cProgressCallback - An optional string denoting a function, procedure, or method that
you want fired whenever a read/write occurs, such as "MyProgress()".
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
Logical - returns .T. if successful or .F. if the operation has failed.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
This function provides the ability to upload a file to a website that provides HTTP
over Secure Sockets Layer (SSL). It should be noted that this function does not check
the site's certificate for authenticity/validness nor does it compare the site to
the identity specified by the certificate.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: 0 = Text, 1 = Header In, 2 = Header Out, 3 = Data In, 4 = Data Out,
5 = SSL Data In, 6 = SSL Data Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function FILEPut() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; FILEPut(cSource, cDestinationURL[, cProgressCallback[, cTraceCallback]])
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cSource - The full path and file name of the file you want copied.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cDestinationURL - The full path and file name where the file specified in cSource
should be copied to.
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cProgressCallback - An optional string denoting a function, procedure, or method that
you want fired whenever a read/write occurs, such as "MyProgress()".
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
Logical - returns .T. if successful or .F. if the operation has failed.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
This function provides the ability to copy a file to a local or remote location.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
The format for the cDestinationURL parameter is slightly different than you might
expect. In order to copy file C:\MyDir\MyFile.zip you would specify cDestinationURL
as “FILE:// C:\MyDir\MyFile.zip”.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: 0 = Text, 1 = Header In, 2 = Header Out, 3 = Data In, 4 = Data Out,
5 = SSL Data In, 6 = SSL Data Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function FTPToStr() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; FTPToStr(cSourceURL[, cProgressCallback[, cTraceCallback]])
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cSourceURL - The URL to the file you wish to return a string from.
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cProgressCallback - An optional string denoting a function, procedure, or method that
you want fired whenever a read/write occurs, such as "MyProgress()".
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
Character Data - the contents of the file specified by cSourceURL
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
This function provides the ability to retrieve a file from an FTP site as a string.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
In order to specify port or login information you would simply include them in cSourceURL,
such as “FTP://myusername:mypassword@myftpsite.com:21/mydir/myfile.txt”.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: 0 = Text, 1 = Header In, 2 = Header Out, 3 = Data In, 4 = Data Out,
5 = SSL Data In, 6 = SSL Data Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function FTPSToStr() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; FTPSToStr(cSourceURL[, cProgressCallback[, cTraceCallback]])
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cSourceURL - The URL to the file you wish to return a string from.
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cProgressCallback - An optional string denoting a function, procedure, or method that
you want fired whenever a read/write occurs, such as "MyProgress()".
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
Character Data - the contents of the file specified by cSourceURL
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
This function provides the ability to retrieve a file as a string from an FTP site
that provides FTP over Secure Sockets Layer (SSL). It should be noted that this function
does not check the site's certificate for authenticity/validness nor does it compare
the site to the identity specified by the certificate.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
In order to specify port or login information you would simply include them in cSourceURL,
such as “FTPS://myusername:mypassword@myftpsite.com:21/mydir/myfile.txt”.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: 0 = Text, 1 = Header In, 2 = Header Out, 3 = Data In, 4 = Data Out,
5 = SSL Data In, 6 = SSL Data Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function HTTPToStr() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; HTTPToStr(cSourceURL[, cProgressCallback[, cTraceCallback]])
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cSourceURL - The URL to the file you wish to download.
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cProgressCallback - An optional string denoting a function, procedure, or method that
you want fired whenever a read/write occurs, such as "MyProgress()".
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
Logical - returns .T. if successful or .F. if the operation has failed.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
This function provides the ability to retrieve a file from a website as a string.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: 0 = Text, 1 = Header In, 2 = Header Out, 3 = Data In, 4 = Data Out,
5 = SSL Data In, 6 = SSL Data Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function HTTPSToStr() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; HTTPSToStr(cSourceURL[, cProgressCallback[, cTraceCallback]])
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cSourceURL - The URL to the file you wish to download.
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cProgressCallback - An optional string denoting a function, procedure, or method that
you want fired whenever a read/write occurs, such as "MyProgress()".
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
Logical - returns .T. if successful or .F. if the operation has failed.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
This function provides the ability to retrieve a file as a string from a website that
provides HTTP over Secure Sockets Layer (SSL). It should be noted that this function
does not check the site's certificate for authenticity/validness nor does it compare
the site to the identity specified by the certificate.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: 0 = Text, 1 = Header In, 2 = Header Out, 3 = Data In, 4 = Data Out,
5 = SSL Data In, 6 = SSL Data Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function HTTPSimplePost() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; HTTPSimplePost(cPostURL, cPostData[, cProgressCallback[, cTraceCallback]])
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cPostURL - The URL to which you want to post.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cPostData - A string consisting of a series of key-value pairs.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cProgressCallback - An optional string denoting a function, procedure, or method that
you want fired whenever a read/write occurs, such as "MyProgress()".
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
Logical - returns .T. if successful or .F. if the operation has failed.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
The key-value pairs sent to cPostData are in the form of key1=value1. Additional key-value
pairs must be delimited by "&amp;", such as "firstname=John&amp;lastname=Smith".
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
When the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: 0 = Text, 1 = Header In, 2 = Header Out, 3 = Data In, 4 = Data Out,
5 = SSL Data In, 6 = SSL Data Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function HTTPPost() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; HTTPPost(cPostURL, aPostData[, cProgressCallback[, cTraceCallback]])
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cPostURL - The URL to the file you wish to download.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
aPostData - A multi-dimensional array containing key-value pairs
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cProgressCallback - An optional string denoting a function, procedure, or method that
you want fired whenever a read/write occurs, such as "MyProgress()".
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
Logical - returns .T. if successful or .F. if the operation has failed.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
The aPostData array must be sent in by reference. The key-value pairs in aPostData
must have the keys in column 1 and the values in column 2, such as:
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
aPostData(1,1) = "firstname"&lt;br&gt;
aPostData(1,2) = "John"&lt;br&gt;
aPostData(2,1) = "lastname"&lt;br&gt;
aPostData(2,2) = "Smith"
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function FTPCommands() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; FTPCommands(cFTPURL, aCommands[, cProgressCallback[, cTraceCallback]])
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cFTPURL - The URL to the FTP site you wish to interact with.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
aCommands - A single dimension array containing the commands you wish to have run
on the FTP site.
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cProgressCallback - An optional string denoting a function, procedure, or method that
you want fired whenever a read/write occurs, such as "MyProgress()".
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
Logical - returns .T. if successful or .F. if the operation has failed.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
In order to specify port or login information you would simply include them in cFTPURL,
such as “FTP://myusername:mypassword@myftpsite.com:21/. 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
The aCommands array must be sent in by reference. The aCommands is an array of FTP
commands (as defined by &lt;a href="http://www.faqs.org/rfcs/rfc959.html"&gt;RFC 959&lt;/a&gt;),
such as: 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
aCommands(1) = "CWD /"&lt;br&gt;
aCommands(2) = "PWD"&lt;br&gt;
aCommands(3) = "RNFR MyDir"&lt;br&gt;
aCommands(4) = "RNTO RenamedMyDir"
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function FTPSCommands() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; FTPSCommands(cFTPSURL, aCommands[, cProgressCallback[, cTraceCallback]])
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cFTPSURL - The URL to the FTP site you wish to interact with.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
aCommands - A single dimension array containing the commands you wish to have run
on the FTP site.
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cProgressCallback - An optional string denoting a function, procedure, or method that
you want fired whenever a read/write occurs, such as "MyProgress()".
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
Logical - returns .T. if successful or .F. if the operation has failed.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
In order to specify port or login information you would simply include them in cFTPSURL,
such as “FTPS://myusername:mypassword@myftpsite.com:21/. 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
The aCommands array must be sent in by reference. The aCommands is an array of FTP
commands (as defined by &lt;a href="http://www.faqs.org/rfcs/rfc959.html"&gt;RFC 959&lt;/a&gt;),
such as: 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
aCommands(1) = "CWD /"&lt;br&gt;
aCommands(2) = "PWD"&lt;br&gt;
aCommands(3) = "RNFR MyDir"&lt;br&gt;
aCommands(4) = "RNTO RenamedMyDir"
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function URLEncode() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; URLEncode(cString)
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cString - The string you want encoded (escaped).
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
Character - returns the encoded equivalent of cString.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
This function provides libcurl's "URL Escape" functionality. Any character in cString
that is not a-z, A-Z, or 0-9 will be deemed unsafe and be replaced with a "%" followed
by the unsafe character's hex equivalent. For instance spaces are replaced with %20
because the ASCII value of a space is 32 (0x20 in hex).
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function URLDecode() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; URLDecode(cString)
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cString - The string you want decoded (unescaped).
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
Character - returns the decoded equivalent of cString.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
This function provides libcurl's "URL Unescape" functionality. Any character in cString
that has been escaped/encoded with a "%" followed by its hex equivalent will be decoded
to its plaintext equivalent. For instance %20 will be turned back into a space - CHR(32).
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function SetConnectTimeout() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; SetConnectTimeout(nSeconds)
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
nSeconds - The number of seconds any connection operation in VFPConnection should
wait before failing due to timeout.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
None
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
This function effects all connection operations in VFPConnection. The default value
for the connection timeout is 10 seconds. 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function SetResponseTimeout() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; SetResponseTimeout(nSeconds)
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
nSeconds - The number of seconds any operation in VFPConnection should wait for a
response before failing due to timeout.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
None
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
This function effects all operations in VFPConnection that are designed to wait for
a server response. The default value for the response timeout is 10 seconds.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function DateStrToEpochSec() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; DateStrToEpochSec(cDateTime)
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
cDateTime - A datetime string in one of the many formats.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
Numeric - returns the number of seconds between Epoch and the datetime specified by
cDateTime.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
This function is useful when attempting to convert datetime strings you may encounter
when working with web-based applications. &lt;a href="http://www.ietf.org/rfc/rfc2616.txt"&gt;RFC2616&lt;/a&gt; specifies
which datetime string formats are acceptable for HTTP applications and, in short,
there are a lot of them. For instance...
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
Sun, 06 Nov 1994 08:49:37 GMT&lt;br&gt;
Sunday, 06-Nov-94 08:49:37 GMT&lt;br&gt;
Sun Nov 6 08:49:37 1994&lt;br&gt;
06 Nov 1994 08:49:37 GMT&lt;br&gt;
06-Nov-94 08:49:37 GMT&lt;br&gt;
Nov 6 08:49:37 1994&lt;br&gt;
06 Nov 1994 08:49:37&lt;br&gt;
06-Nov-94 08:49:37&lt;br&gt;
1994 Nov 6 08:49:37&lt;br&gt;
GMT 08:49:37 06-Nov-94 Sunday&lt;br&gt;
94 6 Nov 08:49:37&lt;br&gt;
1994 Nov 606-Nov-94&lt;br&gt;
Sun Nov 6 94&lt;br&gt;
1994.Nov.6&lt;br&gt;
Sun/Nov/6/94/GMT&lt;br&gt;
Sun, 06 Nov 1994 08:49:37 CET&lt;br&gt;
06 Nov 1994 08:49:37 EST&lt;br&gt;
Sun, 12 Sep 2004 15:05:58 -0700&lt;br&gt;
Sat, 11 Sep 2004 21:32:11 +0200&lt;br&gt;
20040912 15:05:58 -0700&lt;br&gt;
20040911 +0200
&lt;/p&gt;
&lt;p class=MsoNormal dir=ltr style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
...are all acceptable. There are also a number of situations where you may be required
to use or know the number of seconds since midnight January 1, 1970 (a.k.a. epoch
- due to unix and POSIX systems which count time this way). In any event, this function
is provided as a crutch if needed.
&lt;/p&gt;
&lt;p class=MsoNormal dir=ltr style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Function CurlVersion() &lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Signature:&lt;/b&gt; CurlVersion()
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Parameters:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
None
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Return Value:&lt;/b&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
String - the versions of &lt;a href="http://curl.haxx.se/libcurl/"&gt;libcurl&lt;/a&gt; and &lt;a href="http://www.openssl.org/"&gt;OpenSSL&lt;/a&gt; that
were used in VFPConnection
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;Remarks:&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
This may be of some interest to VFP developers who are asking for enhancements or
want to ensure that this library is using the latest and greatest. The static libraries
for libcurl and OpenSSL were both built from the latest source available at the time
using Visual Studio 2003 and ActivePerl.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=b6eb576c-7142-4993-b3f2-74b7af5fb66c" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.sweetpotatosoftware.com"&gt;SweetPotato
Software, Inc.&lt;/a&gt;</description>
      <comments>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,b6eb576c-7142-4993-b3f2-74b7af5fb66c.aspx</comments>
      <category>Information Technology</category>
      <category>Visual Foxpro</category>
    </item>
    <item>
      <trackback:ping>http://www.sweetpotatosoftware.com/spsblog/Trackback.aspx?guid=ebdf7fe4-f97c-4e61-9018-3007904ed8da</trackback:ping>
      <pingback:server>http://www.sweetpotatosoftware.com/spsblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,ebdf7fe4-f97c-4e61-9018-3007904ed8da.aspx</pingback:target>
      <dc:creator>Craig Boyd</dc:creator>
      <wfw:comment>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,ebdf7fe4-f97c-4e61-9018-3007904ed8da.aspx</wfw:comment>
      <wfw:commentRss>http://www.sweetpotatosoftware.com/spsblog/SyndicationService.asmx/GetEntryCommentsRss?guid=ebdf7fe4-f97c-4e61-9018-3007904ed8da</wfw:commentRss>
      <slash:comments>13</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
            <strong>
              <span class="searchword">VFPCompression</span> Update<br /></strong>
          </font>
          <font face="Verdana, Arial, Helvetica, sans-serif" size="2">This update
contains a fix that effects the Unzip routines and a new function called ZipComment().
I've also updated the sample code and documentation that is provided with this library.</font>
        </p>
        <p>
          <font face="Verdana, Arial, Helvetica, sans-serif" size="2">The bug that was fixed
pertained to 0 byte (length) files were being ignored when a zip file's contents were
extracted. The Zip routines were handling the 0 byte length files correctly.</font>
        </p>
        <p>
          <font face="Verdana, Arial, Helvetica, sans-serif" size="2">The ZipComment() function
allows you to add, replace or delete the global zipfile comment for a specified zip
file. The code at the bottom of this blog entry shows an example of its use and the
documentation now includes this function.</font>
        </p>
        <p>
          <strong>Special Thank You<br /></strong>Special thanks goes out to Mike Sue-Ping who posted out on the <a href="http://www.universalthread.com/">Universal
Thread</a> about the bug that is fixed in this update.
</p>
        <p>
          <strong>What's Next<br /></strong>I still plan to add more functionality to this FLL (ability to create cabs
and self-extracting archives, better error handling, etc.). I'm hopeful that those
of you that download this library will take the time to provide me feedback and any
suggestions you may have for further improving it. If you do find a bug, please comment
on it here and/or contact me directly. Note the "Contact Craig Boyd" link to the right
of this blog entry.
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <font face="Verdana" size="2">Until
next time... Visual FoxPro Rocks!</font>
          </span>
        </p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
          </span>
          <font size="2">
            <font face="Verdana, Arial, Helvetica, sans-serif">
              <strong>VFP
Compression Update:<br /><br /></strong>
            </font>
            <a href="http://www.sweetpotatosoftware.com/files/vfpcompression.zip">VFPCompression
FLL Download (37 KB approx.)</a>
          </font>
        </p>
        <p>
          <font size="2">
            <strong>VFP Compression Sample Code:</strong>
          </font>
        </p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">****************************<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Example
1<br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Zip
a file quickly <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">with</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">or</span> without
password protection.<br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> LIBRARY <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">TO</span> LOCFILE(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"vfpcompression.fll"</span>)<br />
?ZipFileQuick(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\MyFile1.txt"</span>)<br />
?ZipFileQuick(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\MyFile2.txt"</span>, <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"MyPassword"</span>)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> LIBRARY <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">TO</span><br /><br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Example
2<br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Zip
a folder quickly <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">with</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">or</span> without
respect<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">for</span> relative
pathing of the files. Password<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> protection
can be included <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> desired.<br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> LIBRARY <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">TO</span> LOCFILE(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"vfpcompression.fll"</span>)<br />
?ZipFolderQuick(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\MyFolder"</span>)<br />
?ZipFolderQuick(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\MyFolder2"</span>,
.T., <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"MyPassword"</span>)<br />
?ZipFolderQuick(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\MyFolder2"</span>,
.F., <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"MyPassword"</span>)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> LIBRARY <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">TO</span><br /><br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Example
3<br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Unzip
a zip file quickly <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">with</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">or</span> without
respect<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">for</span> relative
pathing of the files. Password<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> protection
can be included <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> desired.<br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> LIBRARY <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">TO</span> LOCFILE(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"vfpcompression.fll"</span>)<br />
?UnzipQuick(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\MyFile.zip"</span>, <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\"</span>)<br />
?UnzipQuick(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\MyFolder.zip"</span>, <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\"</span>,
.T.)<br />
?UnzipQuick(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\MyFolder.zip"</span>, <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\"</span>,
.F., <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"MyPassword"</span>)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> LIBRARY <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">TO</span><br /><br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Example
4<br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Create
a zip file, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">add</span> some
files <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">to</span> it<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">and</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">then</span> close
it <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">when</span> done.
Respect<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">for</span> relative
pathing <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">and</span> Password<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> protection
can be included <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> desired.<br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> LIBRARY <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">TO</span> LOCFILE(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"vfpcompression.fll"</span>)<br />
?ZipOpen(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"MyZipFile.zip"</span>, <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\"</span>,
.F.)<br />
?ZipFile(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\SomeFile.txt"</span>,
.F.)<br />
?ZipFile(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\AnotherFile.txt"</span>,
.F., <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"MyPassword"</span>)<br />
?ZipClose()<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> LIBRARY <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">TO</span><br /><br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Example
5<br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Create
a zip file, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">add</span> some
folders <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">to</span> it<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">and</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">then</span> close
it <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">when</span> done.
Respect<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">for</span> relative
pathing <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">and</span> Password<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> protection
can be included <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> desired.<br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> LIBRARY <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">TO</span> LOCFILE(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"vfpcompression.fll"</span>)<br />
?ZipOpen(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\MyZipFile.zip"</span>)<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> ?ZipOpen(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"MyZipFile.zip"</span>, <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\"</span>,
.F.)<br />
?ZipFolder(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\MyFolder\"</span>,
.F.) &amp;&amp; trailing backslash <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">is</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">optional</span><br />
?ZipFolder(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\AnotherFolder"</span>,
.F., <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"MyPassword"</span>)<br />
?ZipClose()<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> LIBRARY <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">TO</span><br /><br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Example
6<br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Compress <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">and</span> decompress
a <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">in</span> memory.<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> The
amount of compression <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">is</span> pretty
remarkable.<br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> LIBRARY <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">TO</span> LOCFILE(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"vfpcompression.fll"</span>)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">CLEAR</span><br />
lcOriginal <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> REPLICATE(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Visual
FoxPro Rocks!"</span>,100)<br />
?<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Original
Length: "</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> TRANSFORM(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">LEN</span>(lcOriginal))<br />
?<br />
lcCompressed <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> ZipString(lcOriginal)<br />
?<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Compressed:
"</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> lcCompressed<br />
?<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Compressed
Length: "</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> TRANSFORM(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">LEN</span>(lcCompressed))<br />
?<br />
?<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Length
Savings: "</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> TRANSFORM(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">LEN</span>(lcOriginal) <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">-</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">LEN</span>(lcCompressed)) <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"
bytes"</span><br />
?<br />
lcUncompressed <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> UnzipString(lcCompressed)<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> ?<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Uncompressed:
"</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> lcUncompressed<br />
?<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Uncompressed
Length: "</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> TRANSFORM(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">LEN</span>(lcUncompressed))<br />
?<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Equals
Original: "</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">IIF</span>(lcUncompressed
== lcOriginal, <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"YES"</span>, <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"NO"</span>)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">IF</span> !(lcUncompressed
== lcOriginal)<br />
    <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">EXIT</span><br />
ENDIF<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> LIBRARY <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">TO</span><br /><br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Example
7<br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Demonstrates
the callback functionality<br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> LIBRARY <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">TO</span> LOCFILE(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"vfpcompression.fll"</span>)<br />
ZipCallback(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"MyCallback()"</span>)
&amp;&amp; Start <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">Event</span> Handling <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">-</span> Any <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">Function</span>/Procedure/Method
(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">in</span> scope
of course)<br />
?ZipOpen(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"MyZip.zip"</span>, <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\"</span>,
.F.) &amp;&amp; create zip file<br />
?ZipFile(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\MyFile.txt"</span>,
.F.) &amp;&amp; compress file into zip<br />
?ZipClose() &amp;&amp; done zipping<br />
?UnzipQuick(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\MyZip.zip"</span>, <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\"</span>)
&amp;&amp; unzip contents of Test.zip <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">to</span> C:\<br />
ZipCallback(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">""</span>)
&amp;&amp; <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">Stop</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">Event</span> Handling<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> LIBRARY <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">TO</span><br /><br />
*****************************<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">FUNCTION</span> MyCallback()<br />
    *****************************<br />
    <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Variables
below are created <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">on</span> the
fly<br />
    <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> by
the FLL <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">when</span> the
ZipCallback feature <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">is</span> used<br /><br />
    <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Depends <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">on</span> the
value of nZipEvent<br />
    ?cZipObjectName &amp;&amp; Name of Zip, File, <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">or</span> Folder
being processed<br /><br />
    <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Events
that fire MyCallback<br />
    <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> 0 <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> Open
Zip<br />
    <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> 1 <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> Start
Zip/Unzip of File<br />
    <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> 2 <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> Read/<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">Write</span> File
(nZipBytes will contain value of bytes read <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">for</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">event</span>)<br />
    <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> 3 <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">-</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">End</span> Zip/Unzip
of File<br />
    <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> 4 <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">-</span> Folder
Opened<br />
    <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> 5 <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">-</span> Close
Zip<br />
    ?nZipEvent<br /><br />
    <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">Number</span> of
Bytes read (<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">Event</span> 3)<br />
    ?nZipBytes<br /><br />
ENDFUNC<br /><br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Example
8<br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Demonstrates
how <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">to</span> use
the UnzipAFileInfo()<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">and</span> UnzipAFileInfoByIndex()
functions.<br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> LIBRARY <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">TO</span> LOCFILE(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"vfpcompression.fll"</span>)<br />
UnzipOpen(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\MyZip.zip"</span>)<br />
UnzipGotoTopFile()<br />
UnzipAFileInfo(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"laTestArray1"</span>)<br />
UnzipClose()<br />
showfileinfo(@laTestArray1)<br />
?<br />
UnzipOpen(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\MyZip.zip"</span>)<br />
UnzipAFileInfoByIndex(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"laTestArray2"</span>,2)<br />
UnzipClose()<br />
showfileinfo(@laTestArray2)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> LIBRARY <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">TO</span><br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">FUNCTION</span> showfileinfo(aFileInfo)<br />
    LOCAL lnCounter<br />
    LOCAL ARRAY aCaptions(13)<br />
    aCaptions(1) <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"File
Name"</span><br />
    aCaptions(2) <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Comment"</span><br />
    aCaptions(3) <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Version"</span><br />
    aCaptions(4) <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Version
Needed"</span><br />
    aCaptions(5) <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Flags"</span><br />
    aCaptions(6) <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Compression
Method"</span><br />
    aCaptions(7) <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"DateTime"</span><br />
    aCaptions(8) <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"CRC"</span><br />
    aCaptions(9) <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Compressed
Size"</span><br />
    aCaptions(10) <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Uncompressed
Size"</span><br />
    aCaptions(11) <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Internal
Attribute"</span><br />
    aCaptions(12) <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"External
Attribute"</span><br />
    aCaptions(13) <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Folder"</span><br />
    <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">FOR</span> lnCounter <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> 1 <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">TO</span> 13<br />
        ?aCaptions(lnCounter)<br />
        ?aFileInfo(lnCounter)<br />
        ?TYPE(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"aFileInfo(lnCounter)"</span>)<br />
    ENDFOR<br />
ENDFUNC<br /><br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Example
9<br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span>!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">*</span> Manipulate
the global zipfile comment of a zip file.<br />
****************************<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> LIBRARY <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">TO</span> LOCFILE(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"vfpcompression.fll"</span>)<br />
ZipComment(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\MyZip1.zip"</span>, <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Hello"</span>)
&amp;&amp; <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">add</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">or</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">replace</span> a
global comment <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">to</span> a
zip file<br />
ZipComment(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"C:\MyZip2.zip"</span>, <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">""</span>)
&amp;&amp; delete a global comment from a zip file<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> LIBRARY <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">TO</span></span>
        </p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            </span>
          </span>
          <font size="2">
            <strong>VFP
Compression Documentation:</strong>
          </font>
        </p>
        <font size="2">
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function ZipString() </strong>
            </font>
          </p>
          <font face="Verdana, Arial, Helvetica, sans-serif">
            <p>
              <font size="2">
                <strong>Signature:</strong> ZipString(cString[, nLevel])</font>
            </p>
            <p>
              <font size="2">
                <strong>Parameters:</strong>
              </font>
            </p>
            <p>
              <font size="2">cString - The character string you wish to compress</font>
            </p>
            <p>
              <font size="2">nLevel - The compression level to use which is 1 through 9 (1 is the
fastest, while 9 is the best compression). The default value for this parameter is
6.</font>
            </p>
            <p>
              <font size="2">
                <strong>Return Value:</strong>
              </font>
            </p>
            <p>
              <font size="2">Character Data - the compressed version of cString.</font>
            </p>
            <p>
              <font size="2">
                <strong>Remarks:</strong>
              </font>
            </p>
            <p>
              <font size="2">This function is particularly useful in a client-server application
given that strings of data (such as memo fields, character fields, and xml) can be
compressed before sending them across the network and then extracted at the other
end (using UnzipString).</font>
            </p>
          </font>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function ZipFileQuick() </strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> ZipFileQuick(cFileName[,
cPassword])</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cFileName - The fully
qualified file name (full path) of the file you wish to have compressed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cPassword - The password
you wish to protect the zipped file with.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">The zip file that this
function creates will have the same file name as cFileName, with the extension as
".zip".</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function ZipFolderQuick() </strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> ZipFolderQuick(cFolderName[,
lIgnorePaths[, cPassword]])</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cFolderName - The full
path to the folder you wish to have zipped.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cPassword - The password
you wish to protect the zipped files with.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">lIgnorePath - If you wish
to ignore the relative path of the file into the zip file that is being created
you would pass .T. for this parameter. The default value for this parameter is .F.
which means that the relative path will be respected.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">The zipfile that this
function creates will have the same file name as cFolderName, with the extension as
".zip".</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function ZipOpen() </strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> ZipOpen(cZipFileName[,cFolderName[,lAppend]])</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cZipFileName - The file
name or full path of the zip file you wish to create.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cFolderName - The full
path of the folder in which you want cZipFileName created.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">lAppend - If the zip file
you are compressing to exists you can choose to append to it by passing .T. to this
parameter. Defaults to .F..</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">ZipOpen() is used in conjunction
with the matching ZipClose(). The usual series of function calls would consist of
creating/opening the zip file using ZipOpen, zipping files and/or folders using ZipFile/ZipFileRelative/ZipFolder,
and then closing the zip file using ZipClose.</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function ZipClose() </strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> ZipClose()</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong> None</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">ZipClose() must be called
after issuing a ZipOpen(). The usual series of function calls would consist of creating/opening
the zip file using ZipOpen, zipping files and/or folders using ZipFile/ZipFileRelative/ZipFolder,
and then closing the zip file using ZipClose.</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function ZipFile() </strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> ZipFile(cFileName[,lIgnorePath[,cPassword]])</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cFileName - The file name
or full path of the file you wish to compress.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">lIgnorePath - If you wish
to ignore the relative path of the file into the zip file that is being created
you would pass .T. for this parameter. The default value for this parameter is .F.
which means that the relative path will be respected.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cPassword - The password
you wish to protect the zipped file with.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">ZipFile() is used between
calls to ZipOpen() and ZipClose(). The usual series of function calls would consist
of creating/opening the zip file using ZipOpen, zipping files and/or folders using
ZipFile/ZipFileRelative/ZipFolder, and then closing the zip file using ZipClose.</font>
          </p>
          <p>
The cPassword is usually the same for all files within a zip, however it does not
need to be the same. Different passwords can be specified for different files and
you can even selectively password protect files within the zip.
</p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function ZipFileRelative()</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> ZipFileRelative(cFileName[,cRelativePath[,
cPassword]])</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cFileName - The file name
or full path of the file you wish to compress.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cRelativePath - The relative
path you wish to have saved in the zip for this file. This allows you to set up the
structure (relative paths) in the zip different from the actual relative paths of
the files you are compressing.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cPassword - The password
you wish to protect the zipped file with.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">ZipFileRelative() is used
between calls to ZipOpen() and ZipClose(). The usual series of function calls would
consist of creating/opening the zip file using ZipOpen, zipping files and/or folders
using ZipFile/ZipFileRelative/ZipFolder, and then closing the zip file using ZipClose.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">The cPassword is usually
the same for all files within a zip, however it does not need to be the same. Different
passwords can be specified for different files and you can even selectively password
protect files within the zip.</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function ZipFolder()</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Signature: ZipFolder(cFolderName[,lIgnorePaths[,
cPassword]])</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cFolderName - The full
path to the folder you wish to compress.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">lIgnorePaths - If you
wish to ignore the relative path of the folder into the zip file that is being created
you would pass .T. for this parameter. The default value for this parameter is .F.
which means that paths will be respected.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cPassword - The password
you wish to protect the zipped file with.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">ZipFolder() is used between
calls to ZipOpen() and ZipClose(). The usual series of function calls would consist
of creating/opening the zip file using ZipOpen, zipping files and/or folders using
ZipFile/ZipFileRelative/ZipFolder, and then closing the zip file using ZipClose.</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function UnzipString()</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> UnzipString(cString)</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cString - The compressed
string you wish to uncompress.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Character Data - the extracted
version of cString.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">The string to be extracted
must have been compressed with the ZipString() function or other compression function
that is compatible with the compress or compress2 functions in zlib.</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function UnzipQuick() </strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> UnzipQuick(cZipFileName,
[cOutputFolderName[, lIgnorePaths[, cPassword]]])</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cZipFileName - The fully
qualified file name (full path) of the zip file you wish to have extracted.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cOutputFolderName - The
full path to the folder you wish to extract the contents of the zip to.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cPassword - The password
to use when unzipping the file.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">lIgnorePaths - If you
wish to ignore the relative paths that are contained in the zip file you would pass
.T. for this parameter. The default value for this parameter is .F. which means that
the relative paths will be respected.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">The file and folders in
the zip file will be extracted into the same folder as the cZipFileName resides in.</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function UnzipOpen() </strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> UnzipOpen(cZipFileName)</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cZipFileName - The file
name or full path of the zip file you wish to uncompress.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">UnzipOpen() is used in
conjunction with the matching UnzipClose(). The usual series of function calls would
consist of opening the zip file using UnzipOpen, uncompressing files and/or folders
using Unzip/UnzipTo/UnzipByIndex/UnzipFile, and then closing the zip file using UnzipClose.</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function UnzipClose() </strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> UnzipClose()</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong> None</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">UnzipClose() must be called
after issuing an UnzipOpen(). The usual series of function calls would consist of
opening the zip file using UnzipOpen, uncompressing files and/or folders using Unzip/UnzipTo/UnzipByIndex/UnzipFile,
and then closing the zip file using UnzipClose.</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function Unzip() </strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> Unzip([lIgnorePaths[,
cPassword]])</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">lIgnorePaths - If you
wish to ignore the relative paths that are contained in the zip file you would pass
.T. for this parameter. The default value for this parameter is .F. which means that
the relative paths will be respected.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cPassword - The password
to use when unzipping the file.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Unzip() is used between
calls to UnzipOpen() and UnzipClose() to uncompress the entire zip file. The files
and folders contained in the zip file will be extracted to the same folder as the
zip file resides in unless a call to UnzipSetFolder() has been previously issued.
The usual series of function calls would consist of opening the zip file using UnzipOpen,
uncompressing files and/or folders using Unzip/UnzipTo/UnzipByIndex/UnzipFile, and
then closing the zip file using UnzipClose.<br /><br /></font>
          </p>
          <hr />
          <p>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function UnzipTo() </strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> UnzipTo(cOutputFolderName[,
lIgnorePaths[, cPassword]])</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cOutputFolderName - The
folder into which the zip file contents should be extracted. </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">lIgnorePaths - If you
wish to ignore the relative paths that are contained in the zip file you would pass
.T. for this parameter. The default value for this parameter is .F. which means that
the relative paths will be respected.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cPassword - The password
to use when unzipping the file.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">UnzipTo() is used between
calls to UnzipOpen() and UnzipClose(). The functionality of this is similar to calling
UnzipSetFolder() and then Unzip(). The usual series of function calls would consist
of opening the zip file using UnzipOpen, uncompressing files and/or folders using
Unzip/UnzipTo/UnzipByIndex/UnzipFile, and then closing the zip file using UnzipClose.</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function UnzipFile() </strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> UnzipFile(cOutputFolderName[,
lIgnorePaths[, cPassword]])</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cOutputFolderName - The
folder into which the current file (cotained in the zip) should be extracted. </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">lIgnorePaths - If you
wish to ignore the relative path of the current file you would pass .T. for this parameter.
The default value for this parameter is .F. which means that the relative path will
be respected.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cPassword - The password
to use when unzipping the file.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">UnzipFile() is used between
calls to UnzipOpen() and UnzipClose() to extract the currently selected file contained
in the zip file. UnzipFile() is used in conjunction with the UnzipGotoTopFile, UnzipGotoNextFile,
UnzipGotoFileByName, and UnzipGotoFileByIndex functions. You can think of the contents
of a zip file as records in a table. In this sense UnzipGotoTopFile, UnzipGotoNextFile,
UnzipGotoFileByName, and UnzipGotoFileByIndex functions are used to move the record
pointer and the UnzipFile function is used to extract the file that the record pointer
is currently on.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">The cPassword is usually
the same for all files within a zip, however it does not need to be the same. Just
keep in mind that passwords can be specified for different files within a zip
and when you are unzipping such an archive you will need to change the cPassword accordingly.</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function UnzipByIndex() </strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Signature: UnzipByIndex(nIndex[,
cOutputFolderName[,lIgnorePaths, cPassword]]])</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">nIndex - The index number
of the file to be extracted.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cOutputFolderName - The
folder into which the zip file contents should be extracted.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">lIgnorePaths - If you
wish to ignore the relative path for this file that is contained in the zip file you
would pass .T. for this parameter. The default value for this parameter is .F. which
means that the relative path will be respected.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cPassword - The password
to use when unzipping the file.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">UnzipByIndex() is used
between calls to UnzipOpen() and UnzipClose() to extract a file by the position (index)
it holds in the zip file. UnzipByIndex() is used in conjunction with the UnzipFileCount
function. You can think of the contents of a zip file as records in a table. In this
sense UnzipFileCount would give you the record count for the table and the UnzipByIndex
function be used to extract a particular file by record number.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">The cPassword is usually
the same for all files within a zip, however it does not need to be the same. Just
keep in mind that passwords can be specified for different files within a zip
and when you are unzipping such an archive you will need to change the cPassword accordingly.</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function UnzipFileCount() </strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> UnzipFileCount()</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong> None </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">UnzipFileCount() is used
between calls to UnzipOpen() and UnzipClose() to retrieve the number of files that
are contained in the zip file. It does not actually extract anything. UnzipFileCount()
is used in conjunction with the UnzipByIndex function. You can think of the contents
of a zip file as records in a table. In this sense UnzipFileCount would give you the
record count for the table and the UnzipByIndex function be used to extract a particular
file by record number.</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function UnzipSetFolder()</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> UnzipSetFolder(cOutputFolderName)</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cOutputFolderName - The
folder into which the zip file contents should be extracted. </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">UnzipSetFolder() is used
between calls to UnzipOpen() and UnzipClose() to set the output folder for extracted
zip contents. It does not actually extract anything. The usual series of function
calls would consist of opening the zip file using UnzipOpen, calling UnzipSetFolder
to set the output folder, uncompressing files and/or folders using Unzip/UnzipTo/UnzipByIndex/UnzipFile,
and then closing the zip file using UnzipClose.</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function UnzipGotoTopFile()</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> UnzipGotoTopFile([cExtension])</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cExtension - The file
extension to use as a filter for file type. All other file types will be ignored and
only the first file of the type specified will be selected in the zip file.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">UnzipGotoTopFile() is
used between calls to UnzipOpen() and UnzipClose() to select a particular file in
the contents of the open zip file. UnzipGotoTopFile() is used in conjunction with
the UnzipFile function to extract a particular file from the zip. By using the cExtension
optional parameter you can select the first record of a particular file type. You
can think of the contents of a zip file as records in a table. In this sense UnzipGotoTopFile,
UnzipGotoNextFile, UnzipGotoFileByName, and UnzipGotoFileByIndex functions are used
to move the record pointer and the UnzipFile function is used to extract the file
that the record pointer is currently on.</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function UnzipGotoNextFile() </strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> UnzipGotoNextFile([cExtension])</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cExtension - The file
extension to use as a filter for file type. All other file types will be ignored and
only the next file of the type specified will be selected in the zip file.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">UnzipGotoNextFile() is
used between calls to UnzipOpen() and UnzipClose() to select a particular file in
the contents of the open zip file. UnzipGotoNextFile() is used in conjunction with
the UnzipFile function to extract a particular file from the zip. By using the cExtension
optional parameter you can select the next record of a particular file type. You can
think of the contents of a zip file as records in a table. In this sense UnzipGotoTopFile,
UnzipGotoNextFile, UnzipGotoFileByName, and UnzipGotoFileByIndex functions are used
to move the record pointer and the UnzipFile function is used to extract the file
that the record pointer is currently on.</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function UnzipGotoFileByName() </strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> UnzipGotoFileByName(cFileName[,
lIgnoreFilePath])</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cFileName - The file name
of the file you wish to select in the zip file contents. You can specify a relative
path as well to narrow down the search.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">lIgnoreFilePath - If you
wish to just find a file of a particular name in the zip file you can pass .T. for
this parameter and the relative path of the file will be ignored. The first matching
file of the name specified in cFileName will be selected in the zip contents.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">UnzipGotoFileByName()
is used between calls to UnzipOpen() and UnzipClose() to select a particular file
in the contents of the open zip file by file name and/or relative path. UnzipGotoFileByName()
is used in conjunction with the UnzipFile function to extract a particular file from
the open zip file. You can think of the contents of a zip file as records in a table.
In this sense UnzipGotoTopFile, UnzipGotoNextFile, UnzipGotoFileByName, and UnzipGotoFileByIndex
functions are used to move the record pointer and the UnzipFile function is used to
extract the file that the record pointer is currently on.</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function UnzipGotoFileByIndex() </strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> UnzipGotoFileByIndex(nIndex)</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">nIndex - The index number
of the file to be selected.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">UnzipGotoFileByIndex()
is used between calls to UnzipOpen() and UnzipClose() to select a particular file
by the position it physically holds in the contents of the open zip file. UnzipGotoFileByIndex()
is used in conjunction with the UnzipFile function to extract a particular file from
the zip file contents. You can think of the contents of a zip file as records in a
table. In this sense UnzipGotoTopFile, UnzipGotoNextFile, UnzipGotoFileByName, and
UnzipGotoFileByIndex functions are used to move the record pointer and the UnzipFile
function is used to extract the file that the record pointer is currently on.</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function UnzipAFileInfoByIndex() </strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> UnzipAFileInfoByIndex(cArrayName,
nIndex)</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cArrayName - Name of the
VFP array to be created with file information in it.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">nIndex - The index number
of the file you want to return information about.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Creates an array with
13 rows (elements) in it. The rows contain various pieces of information regarding
the file that is held in the zip file at nIndex. The following table describes the
contents and data type of each row in the array:</font>
          </p>
          <p>
            <table bordercolor="#000000" width="80%" border="1">
              <tbody>
                <tr bordercolor="#000000" bgcolor="#3399ff">
                  <td>
                    <strong>
                      <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Row</font>
                    </strong>
                  </td>
                  <td>
                    <strong>
                      <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Array Content</font>
                    </strong>
                  </td>
                  <td>
                    <strong>
                      <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Data Type</font>
                    </strong>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">1</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">File Name</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Character</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">2</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Comment</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Character</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">3</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Version</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Numeric</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">4</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Version Needed</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Numeric</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">5</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Flags</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Numeric</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">6</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Compression Method </font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Numeric</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">7</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">DOS Date</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Datetime</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">8</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">CRC</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Numeric</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">9</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Compressed Size </font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Numeric</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">10</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Uncompressed Size </font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Numeric</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">11</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Internal Attribute</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Numeric</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">12</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">External Attribute</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Numeric</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">13</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Folder</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical</font>
                  </td>
                </tr>
              </tbody>
            </table>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">The array that is created
will have whatever name was specified by cArrayName. Should the array already exist
it will release it and recreate it. UnzipAFileInfoByIndex() is used between calls
to UnzipOpen() and UnzipClose() to show information about a particular file. The file
is referred to by the position it physically holds in the contents of the open zip
file. You can think of the contents of a zip file as records in a table. In this sense
the UnzipAFileInfoByIndex function is used to refer to and retrieve information about
a particular record number in the zip file.</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function UnzipAFileInfo() </strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> UnzipAFileInfo(cArrayName)</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cArrayName - Name of the
VFP array to be created with file information in it.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical - returns .T.
if successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Creates an array with
13 rows (elements) in it. The rows contain various pieces of information regarding
the currently selected file in the zip. The following table describes the contents
and data type of each row in the array:</font>
          </p>
          <p>
            <table bordercolor="#000000" width="80%" border="1">
              <tbody>
                <tr bordercolor="#000000" bgcolor="#3399ff">
                  <td>
                    <strong>
                      <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Row</font>
                    </strong>
                  </td>
                  <td>
                    <strong>
                      <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Array Content</font>
                    </strong>
                  </td>
                  <td>
                    <strong>
                      <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Data Type</font>
                    </strong>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">1</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">File Name</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Character</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">2</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Comment</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Character</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">3</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Version</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Numeric</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">4</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Version Needed</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Numeric</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">5</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Flags</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Numeric</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">6</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Compression Method </font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Numeric</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">7</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">DOS Date</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Datetime</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">8</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">CRC</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Numeric</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">9</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Compressed Size </font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Numeric</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">10</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Uncompressed Size </font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Numeric</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">11</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Internal Attribute</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Numeric</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">12</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">External Attribute</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Numeric</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">13</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Folder</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Logical</font>
                  </td>
                </tr>
              </tbody>
            </table>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">The array that is created
will have whatever name was specified by cArrayName. Should the array already exist
it will release it and recreate it. UnzipAFileInfo() is used between calls to UnzipOpen()
and UnzipClose() to show information about a particular file. Use the UnzipAFileInfo
function in conjunction with UnzipGotoTopFile, UnzipGotoNextFile, UnzipGotoFileByName,
and UnzipGotoFileByIndex functions to return information regarding a particular file
contained in the open zip file. You can think of the contents of a zip file as records
in a table. In this sense the UnzipAFileInfo function is used to refer to and retrieve
information about the record that the record pointer is currently on within the zip
file.</font>
          </p>
          <hr />
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function ZipCallback() </strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> ZipCallback(cFunction)</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cFunction - A string denoting
a function, procedure, or method that you want fired whenever a zip event occurs,
such as "MyCallback()".</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value: </strong>None</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Events:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">When one of the following
zip events occurs the function/procedure/method specified by the cFunction parameter
will be called. cZipObjectName, nZipEvent, and nZipBytes are private variables created
on-the-fly by the FLL. They will contain the values specified in the table below.</font>
          </p>
          <p>
            <table bordercolor="#000000" width="80%" border="1">
              <tbody>
                <tr bordercolor="#000000" bgcolor="#3399ff">
                  <td>
                    <strong>
                      <font face="Arial, Helvetica, sans-serif" size="2">Event Description </font>
                    </strong>
                  </td>
                  <td>
                    <font face="Arial, Helvetica, sans-serif" size="2">
                      <strong>cZipObjectName (character) </strong>
                    </font>
                  </td>
                  <td>
                    <font face="Arial, Helvetica, sans-serif" size="2">
                      <strong>nZipEvent (numeric) </strong>
                    </font>
                  </td>
                  <td>
                    <strong>
                      <font face="Arial, Helvetica, sans-serif" size="2">nZipBytes (numeric)</font>
                    </strong>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Zip Opened</font>
                  </td>
                  <td>
                    <font size="2">Name and path of zip file</font>
                  </td>
                  <td>
                    <font size="2">0</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">N/A</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Zip/Unzip File Start</font>
                  </td>
                  <td>
                    <font size="2">Name and path of file being zipped/unzipped</font>
                  </td>
                  <td>
                    <font size="2">1</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">N/A</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Zip Read or Unzip Write</font>
                  </td>
                  <td>
                    <font size="2">Name and path of file being zipped/unzipped</font>
                  </td>
                  <td>
                    <font size="2">2</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Number of bytes currently
being read or written</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Zip/Unzip File End</font>
                  </td>
                  <td>
                    <font size="2">Name and path of file being zipped/unzipped</font>
                  </td>
                  <td>
                    <font size="2">3</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">N/A</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font size="2">Zip/Unzip Folder Opened</font>
                  </td>
                  <td>
                    <font size="2">Name and path of folder being zipped/unzipped</font>
                  </td>
                  <td>
                    <font size="2">4</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">N/A</font>
                  </td>
                </tr>
                <tr bordercolor="#000000">
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Zip Closed</font>
                  </td>
                  <td>
                    <font size="2">Name and path of zip file</font>
                  </td>
                  <td>
                    <font size="2">5</font>
                  </td>
                  <td>
                    <font face="Verdana, Arial, Helvetica, sans-serif" size="2">N/A</font>
                  </td>
                </tr>
              </tbody>
            </table>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Event handling is started
as soon as you call ZipCallback and pass it the name of a function, procedure, or
object method. ZipCallback provides a way for you to hook into the internal events
happening inside of the VFPCompression FLL. nZipBytes reports the number of bytes
currently being read during zip (2048 bytes at a time) or written during unzip (4096
bytes at a time) of an individual file. In order to turn off event handling simply
call the ZipCallback with an empty length string, such as ZipCallback("").</font>
          </p>
          <hr />
          <p>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="3">
              <strong>Function ZipComment() </strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Signature:</strong> ZipComment(cZipFileName,
cComment)</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Parameters:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cZipFileName - The file
name or full path to the zip file you wish to add, replace, or delete the comment
on.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">cComment - A string
containing the comment (maximum of 255 characters)</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Return Value:</strong>
            </font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">None - returns .T. if
successful or .F. if the operation has failed.</font>
          </p>
          <p>
            <font face="Verdana, Arial, Helvetica, sans-serif" size="2">
              <strong>Remarks:</strong>
            </font>
          </p>
          <p>
If a comment does not exist in the zip file, the string designated in cComment will
be added. However, if a comment already exists in the zip file, the existing
comment will be replaced with the cComment specified. This replacement functionality
allows you to also delete an existing comment in a zip file by passing an empty string
to the cComment parameter.
</p>
          <p>
 
</p>
        </font>
        <img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=ebdf7fe4-f97c-4e61-9018-3007904ed8da" />
        <br />
        <hr />
This weblog is sponsored by <a href="http://www.sweetpotatosoftware.com">SweetPotato
Software, Inc.</a></body>
      <title>VFPCompression Update - Fix and ZipFile Comment Support</title>
      <guid isPermaLink="false">http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,ebdf7fe4-f97c-4e61-9018-3007904ed8da.aspx</guid>
      <link>http://www.sweetpotatosoftware.com/spsblog/2008/12/01/VFPCompressionUpdateFixAndZipFileCommentSupport.aspx</link>
      <pubDate>Mon, 01 Dec 2008 02:12:25 GMT</pubDate>
      <description>&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;&lt;span class=searchword&gt;VFPCompression&lt;/span&gt; Update&lt;br&gt;
&lt;/strong&gt;&lt;/font&gt;&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;This update
contains a fix that effects the Unzip routines and a new function called ZipComment().
I've also updated the sample code and documentation that is provided with this library.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;The bug that was fixed pertained
to 0 byte (length) files were being ignored when a zip file's contents were extracted.
The Zip routines were handling the 0 byte length files correctly.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;The ZipComment() function
allows you to add, replace or&amp;nbsp;delete&amp;nbsp;the global zipfile comment for a specified&amp;nbsp;zip
file. The code at the bottom of this blog entry shows an example of its use and the
documentation now includes this function.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Special Thank You&lt;br&gt;
&lt;/strong&gt;Special thanks goes&amp;nbsp;out to Mike Sue-Ping who posted out on the &lt;a href="http://www.universalthread.com/"&gt;Universal
Thread&lt;/a&gt;&amp;nbsp;about the bug that is fixed in this update.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;What's Next&lt;br&gt;
&lt;/strong&gt;I still plan to add more functionality to this FLL (ability to create cabs
and self-extracting archives, better error handling, etc.). I'm hopeful that those
of you that download this library will take the time to provide me feedback and any
suggestions you may have for further improving it. If you do find a bug, please comment
on it here and/or contact me directly. Note the "Contact Craig Boyd" link to the right
of this blog entry.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana size=2&gt;Until
next time... Visual FoxPro Rocks!&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;/span&gt;&lt;font size=2&gt;&lt;font face="Verdana, Arial, Helvetica, sans-serif"&gt;&lt;strong&gt;VFP
Compression Update:&lt;br&gt;
&lt;br&gt;
&lt;/strong&gt;&lt;/font&gt;&lt;a href="http://www.sweetpotatosoftware.com/files/vfpcompression.zip"&gt;VFPCompression
FLL Download (37 KB approx.)&lt;/a&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size=2&gt;&lt;strong&gt;VFP Compression Sample Code:&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Example
1&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Zip
a file quickly &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;with&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;or&lt;/span&gt; without
password protection.&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"vfpcompression.fll"&lt;/span&gt;)&lt;br&gt;
?ZipFileQuick(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\MyFile1.txt"&lt;/span&gt;)&lt;br&gt;
?ZipFileQuick(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\MyFile2.txt"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyPassword"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Example
2&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Zip
a folder quickly &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;with&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;or&lt;/span&gt; without
respect&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;for&lt;/span&gt; relative
pathing of the files. Password&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; protection
can be included &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; desired.&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"vfpcompression.fll"&lt;/span&gt;)&lt;br&gt;
?ZipFolderQuick(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\MyFolder"&lt;/span&gt;)&lt;br&gt;
?ZipFolderQuick(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\MyFolder2"&lt;/span&gt;,
.T., &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyPassword"&lt;/span&gt;)&lt;br&gt;
?ZipFolderQuick(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\MyFolder2"&lt;/span&gt;,
.F., &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyPassword"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Example
3&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Unzip
a zip file quickly &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;with&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;or&lt;/span&gt; without
respect&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;for&lt;/span&gt; relative
pathing of the files. Password&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; protection
can be included &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; desired.&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"vfpcompression.fll"&lt;/span&gt;)&lt;br&gt;
?UnzipQuick(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\MyFile.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\"&lt;/span&gt;)&lt;br&gt;
?UnzipQuick(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\MyFolder.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\"&lt;/span&gt;,
.T.)&lt;br&gt;
?UnzipQuick(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\MyFolder.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\"&lt;/span&gt;,
.F., &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyPassword"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Example
4&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Create
a zip file, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;add&lt;/span&gt; some
files &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;to&lt;/span&gt; it&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;and&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;then&lt;/span&gt; close
it &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;when&lt;/span&gt; done.
Respect&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;for&lt;/span&gt; relative
pathing &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;and&lt;/span&gt; Password&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; protection
can be included &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; desired.&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"vfpcompression.fll"&lt;/span&gt;)&lt;br&gt;
?ZipOpen(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyZipFile.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\"&lt;/span&gt;,
.F.)&lt;br&gt;
?ZipFile(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\SomeFile.txt"&lt;/span&gt;,
.F.)&lt;br&gt;
?ZipFile(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\AnotherFile.txt"&lt;/span&gt;,
.F., &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyPassword"&lt;/span&gt;)&lt;br&gt;
?ZipClose()&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Example
5&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Create
a zip file, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;add&lt;/span&gt; some
folders &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;to&lt;/span&gt; it&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;and&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;then&lt;/span&gt; close
it &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;when&lt;/span&gt; done.
Respect&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;for&lt;/span&gt; relative
pathing &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;and&lt;/span&gt; Password&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; protection
can be included &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; desired.&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"vfpcompression.fll"&lt;/span&gt;)&lt;br&gt;
?ZipOpen(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\MyZipFile.zip"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; ?ZipOpen(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyZipFile.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\"&lt;/span&gt;,
.F.)&lt;br&gt;
?ZipFolder(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\MyFolder\"&lt;/span&gt;,
.F.) &amp;amp;&amp;amp; trailing backslash &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;is&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;optional&lt;/span&gt;
&lt;br&gt;
?ZipFolder(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\AnotherFolder"&lt;/span&gt;,
.F., &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyPassword"&lt;/span&gt;)&lt;br&gt;
?ZipClose()&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Example
6&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Compress &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;and&lt;/span&gt; decompress
a &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;in&lt;/span&gt; memory.&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; The
amount of compression &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;is&lt;/span&gt; pretty
remarkable.&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"vfpcompression.fll"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;CLEAR&lt;/span&gt;
&lt;br&gt;
lcOriginal &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; REPLICATE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Visual
FoxPro Rocks!"&lt;/span&gt;,100)&lt;br&gt;
?&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Original
Length: "&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; TRANSFORM(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;LEN&lt;/span&gt;(lcOriginal))&lt;br&gt;
?&lt;br&gt;
lcCompressed &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; ZipString(lcOriginal)&lt;br&gt;
?&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Compressed:
"&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; lcCompressed&lt;br&gt;
?&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Compressed
Length: "&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; TRANSFORM(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;LEN&lt;/span&gt;(lcCompressed))&lt;br&gt;
?&lt;br&gt;
?&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Length
Savings: "&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; TRANSFORM(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;LEN&lt;/span&gt;(lcOriginal) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;-&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;LEN&lt;/span&gt;(lcCompressed)) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"
bytes"&lt;/span&gt;
&lt;br&gt;
?&lt;br&gt;
lcUncompressed &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; UnzipString(lcCompressed)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; ?&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Uncompressed:
"&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; lcUncompressed&lt;br&gt;
?&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Uncompressed
Length: "&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; TRANSFORM(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;LEN&lt;/span&gt;(lcUncompressed))&lt;br&gt;
?&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Equals
Original: "&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;IIF&lt;/span&gt;(lcUncompressed
== lcOriginal, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"YES"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"NO"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;IF&lt;/span&gt; !(lcUncompressed
== lcOriginal)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;EXIT&lt;/span&gt;
&lt;br&gt;
ENDIF&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Example
7&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Demonstrates
the callback functionality&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"vfpcompression.fll"&lt;/span&gt;)&lt;br&gt;
ZipCallback(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyCallback()"&lt;/span&gt;)
&amp;amp;&amp;amp; Start &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Event&lt;/span&gt; Handling &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;-&lt;/span&gt; Any &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Function&lt;/span&gt;/Procedure/Method
(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;in&lt;/span&gt; scope
of course)&lt;br&gt;
?ZipOpen(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyZip.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\"&lt;/span&gt;,
.F.) &amp;amp;&amp;amp; create zip file&lt;br&gt;
?ZipFile(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\MyFile.txt"&lt;/span&gt;,
.F.) &amp;amp;&amp;amp; compress file into zip&lt;br&gt;
?ZipClose() &amp;amp;&amp;amp; done zipping&lt;br&gt;
?UnzipQuick(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\MyZip.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\"&lt;/span&gt;)
&amp;amp;&amp;amp; unzip contents of Test.zip &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;to&lt;/span&gt; C:\&lt;br&gt;
ZipCallback(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;""&lt;/span&gt;)
&amp;amp;&amp;amp; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Stop&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Event&lt;/span&gt; Handling&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
*****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;FUNCTION&lt;/span&gt; MyCallback()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*****************************&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Variables
below are created &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;on&lt;/span&gt; the
fly&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; by
the FLL &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;when&lt;/span&gt; the
ZipCallback feature &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;is&lt;/span&gt; used&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Depends &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;on&lt;/span&gt; the
value of nZipEvent&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;?cZipObjectName &amp;amp;&amp;amp; Name of Zip, File, &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;or&lt;/span&gt; Folder
being processed&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Events
that fire MyCallback&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; 0 &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; Open
Zip&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; 1 &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; Start
Zip/Unzip of File&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; 2 &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; Read/&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Write&lt;/span&gt; File
(nZipBytes will contain value of bytes read &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;for&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;event&lt;/span&gt;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; 3 &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;-&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;End&lt;/span&gt; Zip/Unzip
of File&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; 4 &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;-&lt;/span&gt; Folder
Opened&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; 5 &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;-&lt;/span&gt; Close
Zip&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;?nZipEvent&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Number&lt;/span&gt; of
Bytes read (&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Event&lt;/span&gt; 3)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;?nZipBytes&lt;br&gt;
&lt;br&gt;
ENDFUNC&lt;br&gt;
&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Example
8&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Demonstrates
how &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;to&lt;/span&gt; use
the UnzipAFileInfo()&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;and&lt;/span&gt; UnzipAFileInfoByIndex()
functions.&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"vfpcompression.fll"&lt;/span&gt;)&lt;br&gt;
UnzipOpen(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\MyZip.zip"&lt;/span&gt;)&lt;br&gt;
UnzipGotoTopFile()&lt;br&gt;
UnzipAFileInfo(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"laTestArray1"&lt;/span&gt;)&lt;br&gt;
UnzipClose()&lt;br&gt;
showfileinfo(@laTestArray1)&lt;br&gt;
?&lt;br&gt;
UnzipOpen(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\MyZip.zip"&lt;/span&gt;)&lt;br&gt;
UnzipAFileInfoByIndex(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"laTestArray2"&lt;/span&gt;,2)&lt;br&gt;
UnzipClose()&lt;br&gt;
showfileinfo(@laTestArray2)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;FUNCTION&lt;/span&gt; showfileinfo(aFileInfo)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LOCAL lnCounter&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LOCAL ARRAY aCaptions(13)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aCaptions(1) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"File
Name"&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aCaptions(2) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Comment"&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aCaptions(3) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Version"&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aCaptions(4) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Version
Needed"&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aCaptions(5) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Flags"&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aCaptions(6) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Compression
Method"&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aCaptions(7) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"DateTime"&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aCaptions(8) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"CRC"&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aCaptions(9) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Compressed
Size"&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aCaptions(10) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Uncompressed
Size"&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aCaptions(11) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Internal
Attribute"&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aCaptions(12) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"External
Attribute"&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aCaptions(13) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Folder"&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;FOR&lt;/span&gt; lnCounter &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; 1 &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; 13&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;?aCaptions(lnCounter)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;?aFileInfo(lnCounter)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;?TYPE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"aFileInfo(lnCounter)"&lt;/span&gt;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ENDFOR&lt;br&gt;
ENDFUNC&lt;br&gt;
&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Example
9&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Manipulate
the global zipfile comment of a zip file.&lt;br&gt;
****************************&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt; LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"vfpcompression.fll"&lt;/span&gt;)&lt;br&gt;
ZipComment(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\MyZip1.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Hello"&lt;/span&gt;)
&amp;amp;&amp;amp; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;add&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;or&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;replace&lt;/span&gt; a
global comment &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;to&lt;/span&gt; a
zip file&lt;br&gt;
ZipComment(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\MyZip2.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;""&lt;/span&gt;)
&amp;amp;&amp;amp; delete a global comment from a zip file&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; LIBRARY &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;TO&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;/span&gt;&lt;/span&gt;&gt;&lt;font size=2&gt;&lt;strong&gt;VFP
Compression Documentation:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;font size=2&gt; 
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function ZipString() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif"&gt; 
&lt;p&gt;
&lt;font size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; ZipString(cString[, nLevel])&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size=2&gt;cString - The character string you wish to compress&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size=2&gt;nLevel - The compression level to use which is 1 through 9 (1 is the
fastest, while 9 is the best compression). The default value for this parameter is
6.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size=2&gt;Character Data - the compressed version of cString.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size=2&gt;This function is particularly useful in a client-server application given
that strings of data (such as memo fields, character fields, and xml) can be compressed
before sending them across the network and then extracted at the other end (using
UnzipString).&lt;/font&gt;
&lt;/p&gt;
&lt;/font&gt; 
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function ZipFileQuick() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; ZipFileQuick(cFileName[,
cPassword])&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cFileName - The fully qualified
file name (full path) of the file you wish to have compressed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cPassword - The password
you wish to protect the zipped file with.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;The zip file that this function
creates will have the same file name as cFileName, with the extension as ".zip".&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function ZipFolderQuick() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; ZipFolderQuick(cFolderName[,
lIgnorePaths[, cPassword]])&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cFolderName - The full path
to the folder you wish to have zipped.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cPassword - The password
you wish to protect the zipped files with.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;lIgnorePath - If you wish
to&amp;nbsp;ignore the relative path of the file into the zip file that is being created
you would pass .T. for this parameter. The default value for this parameter is .F.
which means that the relative path will be respected.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;The zipfile that this function
creates will have the same file name as cFolderName, with the extension as ".zip".&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function ZipOpen() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; ZipOpen(cZipFileName[,cFolderName[,lAppend]])&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cZipFileName - The file
name or full path of the zip file you wish to create.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cFolderName - The full path
of the folder in which you want cZipFileName created.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;lAppend - If the zip file
you are compressing to exists you can choose to append to it by passing .T. to this
parameter. Defaults to .F..&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;ZipOpen() is used in conjunction
with the matching ZipClose(). The usual series of function calls would consist of
creating/opening the zip file using ZipOpen, zipping files and/or folders using ZipFile/ZipFileRelative/ZipFolder,
and then closing the zip file using ZipClose.&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function ZipClose() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; ZipClose()&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt; None&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;ZipClose() must be called
after issuing a ZipOpen(). The usual series of function calls would consist of creating/opening
the zip file using ZipOpen, zipping files and/or folders using ZipFile/ZipFileRelative/ZipFolder,
and then closing the zip file using ZipClose.&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function ZipFile() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; ZipFile(cFileName[,lIgnorePath[,cPassword]])&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cFileName - The file name
or full path of the file you wish to compress.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;lIgnorePath - If you wish
to&amp;nbsp;ignore the relative path of the file into the zip file that is being created
you would pass .T. for this parameter. The default value for this parameter is .F.
which means that the relative path will be respected.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cPassword - The password
you wish to protect the zipped file with.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;ZipFile() is used between
calls to ZipOpen() and ZipClose(). The usual series of function calls would consist
of creating/opening the zip file using ZipOpen, zipping files and/or folders using
ZipFile/ZipFileRelative/ZipFolder, and then closing the zip file using ZipClose.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
The cPassword is usually the same for all files within a zip, however it does not
need to be the same. Different passwords can be specified for different files and
you can even selectively password protect files within the zip.
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function ZipFileRelative()&lt;/strong&gt; &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; ZipFileRelative(cFileName[,cRelativePath[,
cPassword]])&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cFileName - The file name
or full path of the file you wish to compress.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cRelativePath - The relative
path you wish to have saved in the zip for this file. This allows you to set up the
structure (relative paths) in the zip different from the actual relative paths of
the files you are compressing.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cPassword - The password
you wish to protect the zipped file with.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;ZipFileRelative() is used
between calls to ZipOpen() and ZipClose(). The usual series of function calls would
consist of creating/opening the zip file using ZipOpen, zipping files and/or folders
using ZipFile/ZipFileRelative/ZipFolder, and then closing the zip file using ZipClose.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;The cPassword is usually
the same for all files within a zip, however it does not need to be the same. Different
passwords can be specified for different files and you can even selectively password
protect files within the zip.&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function ZipFolder()&lt;/strong&gt; &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Signature: ZipFolder(cFolderName[,lIgnorePaths[,
cPassword]])&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cFolderName - The full path
to the folder you wish to compress.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;lIgnorePaths - If you wish
to ignore the relative path of the folder into the zip file that is being created
you would pass .T. for this parameter. The default value for this parameter is .F.
which means that paths will be respected.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cPassword - The password
you wish to protect the zipped file with.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;ZipFolder() is used between
calls to ZipOpen() and ZipClose(). The usual series of function calls would consist
of creating/opening the zip file using ZipOpen, zipping files and/or folders using
ZipFile/ZipFileRelative/ZipFolder, and then closing the zip file using ZipClose.&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function UnzipString()&lt;/strong&gt; &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; UnzipString(cString)&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cString - The compressed
string you wish to uncompress.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Character Data - the extracted
version of cString.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;The string to be extracted
must have been compressed with the ZipString() function or other compression function
that is compatible with the compress or compress2 functions in zlib.&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function UnzipQuick() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; UnzipQuick(cZipFileName,
[cOutputFolderName[, lIgnorePaths[, cPassword]]])&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cZipFileName - The fully
qualified file name (full path) of the zip file you wish to have extracted.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cOutputFolderName - The
full path to the folder you wish to extract the contents of the zip to.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cPassword - The password
to use when unzipping the file.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;lIgnorePaths - If you wish
to ignore the relative paths that are contained in the zip file you would pass .T.
for this parameter. The default value for this parameter is .F. which means that the
relative paths will be respected.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;The file and folders in
the zip file will be extracted into the same folder as the cZipFileName resides in.&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function UnzipOpen() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; UnzipOpen(cZipFileName)&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cZipFileName - The file
name or full path of the zip file you wish to uncompress.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;UnzipOpen() is used in conjunction
with the matching UnzipClose(). The usual series of function calls would consist of
opening the zip file using UnzipOpen, uncompressing files and/or folders using Unzip/UnzipTo/UnzipByIndex/UnzipFile,
and then closing the zip file using UnzipClose.&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function UnzipClose() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; UnzipClose()&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt; None&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;UnzipClose() must be called
after issuing an UnzipOpen(). The usual series of function calls would consist of
opening the zip file using UnzipOpen, uncompressing files and/or folders using Unzip/UnzipTo/UnzipByIndex/UnzipFile,
and then closing the zip file using UnzipClose.&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function Unzip() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; Unzip([lIgnorePaths[,
cPassword]])&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt; &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;lIgnorePaths - If you wish
to ignore the relative paths that are contained in the zip file you would pass .T.
for this parameter. The default value for this parameter is .F. which means that the
relative paths will be respected.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cPassword - The password
to use when unzipping the file.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Unzip() is used between
calls to UnzipOpen() and UnzipClose() to uncompress the entire zip file. The files
and folders contained in the zip file will be extracted to the same folder as the
zip file resides in unless a call to UnzipSetFolder() has been previously issued.
The usual series of function calls would consist of opening the zip file using UnzipOpen,
uncompressing files and/or folders using Unzip/UnzipTo/UnzipByIndex/UnzipFile, and
then closing the zip file using UnzipClose.&lt;br&gt;
&lt;br&gt;
&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function UnzipTo() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; UnzipTo(cOutputFolderName[,
lIgnorePaths[, cPassword]])&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cOutputFolderName - The
folder into which the zip file contents should be extracted. &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;lIgnorePaths - If you wish
to ignore the relative paths that are contained in the zip file you would pass .T.
for this parameter. The default value for this parameter is .F. which means that the
relative paths will be respected.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cPassword - The password
to use when unzipping the file.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;UnzipTo() is used between
calls to UnzipOpen() and UnzipClose(). The functionality of this is similar to calling
UnzipSetFolder() and then Unzip(). The usual series of function calls would consist
of opening the zip file using UnzipOpen, uncompressing files and/or folders using
Unzip/UnzipTo/UnzipByIndex/UnzipFile, and then closing the zip file using UnzipClose.&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function UnzipFile() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; UnzipFile(cOutputFolderName[,
lIgnorePaths[, cPassword]])&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cOutputFolderName - The
folder into which the current file (cotained in the zip) should be extracted. &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;lIgnorePaths - If you wish
to ignore the relative path of the current file you would pass .T. for this parameter.
The default value for this parameter is .F. which means that the relative path will
be respected.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cPassword - The password
to use when unzipping the file.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;UnzipFile() is used between
calls to UnzipOpen() and UnzipClose() to extract the currently selected file contained
in the zip file. UnzipFile() is used in conjunction with the UnzipGotoTopFile, UnzipGotoNextFile,
UnzipGotoFileByName, and UnzipGotoFileByIndex functions. You can think of the contents
of a zip file as records in a table. In this sense UnzipGotoTopFile, UnzipGotoNextFile,
UnzipGotoFileByName, and UnzipGotoFileByIndex functions are used to move the record
pointer and the UnzipFile function is used to extract the file that the record pointer
is currently on.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;The cPassword is usually
the same for all files within a zip, however it does not need to be the same. Just
keep in mind that&amp;nbsp;passwords can be specified for different files within a zip
and when you are unzipping such an archive you will need to change the cPassword accordingly.&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function UnzipByIndex() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Signature: UnzipByIndex(nIndex[,
cOutputFolderName[,lIgnorePaths, cPassword]]])&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;nIndex - The index number
of the file to be extracted.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cOutputFolderName - The
folder into which the zip file contents should be extracted.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;lIgnorePaths - If you wish
to ignore the relative path for this file that is contained in the zip file you would
pass .T. for this parameter. The default value for this parameter is .F. which means
that the relative path will be respected.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cPassword - The password
to use when unzipping the file.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;UnzipByIndex() is used between
calls to UnzipOpen() and UnzipClose() to extract a file by the position (index) it
holds in the zip file. UnzipByIndex() is used in conjunction with the UnzipFileCount
function. You can think of the contents of a zip file as records in a table. In this
sense UnzipFileCount would give you the record count for the table and the UnzipByIndex
function be used to extract a particular file by record number.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;The cPassword is usually
the same for all files within a zip, however it does not need to be the same. Just
keep in mind that&amp;nbsp;passwords can be specified for different files within a zip
and when you are unzipping such an archive you will need to change the cPassword accordingly.&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function UnzipFileCount() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; UnzipFileCount()&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt; None &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;UnzipFileCount() is used
between calls to UnzipOpen() and UnzipClose() to retrieve the number of files that
are contained in the zip file. It does not actually extract anything. UnzipFileCount()
is used in conjunction with the UnzipByIndex function. You can think of the contents
of a zip file as records in a table. In this sense UnzipFileCount would give you the
record count for the table and the UnzipByIndex function be used to extract a particular
file by record number.&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function UnzipSetFolder()&lt;/strong&gt; &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; UnzipSetFolder(cOutputFolderName)&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cOutputFolderName - The
folder into which the zip file contents should be extracted. &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;UnzipSetFolder() is used
between calls to UnzipOpen() and UnzipClose() to set the output folder for extracted
zip contents. It does not actually extract anything. The usual series of function
calls would consist of opening the zip file using UnzipOpen, calling UnzipSetFolder
to set the output folder, uncompressing files and/or folders using Unzip/UnzipTo/UnzipByIndex/UnzipFile,
and then closing the zip file using UnzipClose.&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function UnzipGotoTopFile()&lt;/strong&gt; &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; UnzipGotoTopFile([cExtension])&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cExtension - The file extension
to use as a filter for file type. All other file types will be ignored and only the
first file of the type specified will be selected in the zip file.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;UnzipGotoTopFile() is used
between calls to UnzipOpen() and UnzipClose() to select a particular file in the contents
of the open zip file. UnzipGotoTopFile() is used in conjunction with the UnzipFile
function to extract a particular file from the zip. By using the cExtension optional
parameter you can select the first record of a particular file type. You can think
of the contents of a zip file as records in a table. In this sense UnzipGotoTopFile,
UnzipGotoNextFile, UnzipGotoFileByName, and UnzipGotoFileByIndex functions are used
to move the record pointer and the UnzipFile function is used to extract the file
that the record pointer is currently on.&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function UnzipGotoNextFile() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; UnzipGotoNextFile([cExtension])&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cExtension - The file extension
to use as a filter for file type. All other file types will be ignored and only the
next file of the type specified will be selected in the zip file.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;UnzipGotoNextFile() is used
between calls to UnzipOpen() and UnzipClose() to select a particular file in the contents
of the open zip file. UnzipGotoNextFile() is used in conjunction with the UnzipFile
function to extract a particular file from the zip. By using the cExtension optional
parameter you can select the next record of a particular file type. You can think
of the contents of a zip file as records in a table. In this sense UnzipGotoTopFile,
UnzipGotoNextFile, UnzipGotoFileByName, and UnzipGotoFileByIndex functions are used
to move the record pointer and the UnzipFile function is used to extract the file
that the record pointer is currently on.&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function UnzipGotoFileByName() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; UnzipGotoFileByName(cFileName[,
lIgnoreFilePath])&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cFileName - The file name
of the file you wish to select in the zip file contents. You can specify a relative
path as well to narrow down the search.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;lIgnoreFilePath - If you
wish to just find a file of a particular name in the zip file you can pass .T. for
this parameter and the relative path of the file will be ignored. The first matching
file of the name specified in cFileName will be selected in the zip contents.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;UnzipGotoFileByName() is
used between calls to UnzipOpen() and UnzipClose() to select a particular file in
the contents of the open zip file by file name and/or relative path. UnzipGotoFileByName()
is used in conjunction with the UnzipFile function to extract a particular file from
the open zip file. You can think of the contents of a zip file as records in a table.
In this sense UnzipGotoTopFile, UnzipGotoNextFile, UnzipGotoFileByName, and UnzipGotoFileByIndex
functions are used to move the record pointer and the UnzipFile function is used to
extract the file that the record pointer is currently on.&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function UnzipGotoFileByIndex() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; UnzipGotoFileByIndex(nIndex)&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;nIndex - The index number
of the file to be selected.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;UnzipGotoFileByIndex() is
used between calls to UnzipOpen() and UnzipClose() to select a particular file by
the position it physically holds in the contents of the open zip file. UnzipGotoFileByIndex()
is used in conjunction with the UnzipFile function to extract a particular file from
the zip file contents. You can think of the contents of a zip file as records in a
table. In this sense UnzipGotoTopFile, UnzipGotoNextFile, UnzipGotoFileByName, and
UnzipGotoFileByIndex functions are used to move the record pointer and the UnzipFile
function is used to extract the file that the record pointer is currently on.&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function UnzipAFileInfoByIndex() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; UnzipAFileInfoByIndex(cArrayName,
nIndex)&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cArrayName - Name of the
VFP array to be created with file information in it.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;nIndex - The index number
of the file you want to return information about.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Creates an array with 13
rows (elements) in it. The rows contain various pieces of information regarding the
file that is held in the zip file at nIndex. The following table describes the contents
and data type of each row in the array:&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table bordercolor=#000000 width="80%" border=1&gt;
&lt;tbody&gt;
&lt;tr bordercolor=#000000 bgcolor=#3399ff&gt;
&lt;td&gt;
&lt;strong&gt;&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Row&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Array Content&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Data Type&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;1&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;File Name&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Character&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;2&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Comment&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Character&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;3&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Version&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Numeric&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;4&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Version Needed&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Numeric&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;5&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Flags&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Numeric&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;6&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Compression Method &lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Numeric&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;7&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;DOS Date&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Datetime&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;8&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;CRC&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Numeric&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;9&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Compressed Size &lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Numeric&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;10&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Uncompressed Size &lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Numeric&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;11&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Internal Attribute&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Numeric&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;12&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;External Attribute&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Numeric&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;13&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Folder&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;The array that is created
will have whatever name was specified by cArrayName. Should the array already exist
it will release it and recreate it. UnzipAFileInfoByIndex() is used between calls
to UnzipOpen() and UnzipClose() to show information about a particular file. The file
is referred to by the position it physically holds in the contents of the open zip
file. You can think of the contents of a zip file as records in a table. In this sense
the UnzipAFileInfoByIndex function is used to refer to and retrieve information about
a particular record number in the zip file.&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function UnzipAFileInfo() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; UnzipAFileInfo(cArrayName)&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cArrayName - Name of the
VFP array to be created with file information in it.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical - returns .T. if
successful or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Creates an array with 13
rows (elements) in it. The rows contain various pieces of information regarding the
currently selected file in the zip. The following table describes the contents and
data type of each row in the array:&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table bordercolor=#000000 width="80%" border=1&gt;
&lt;tbody&gt;
&lt;tr bordercolor=#000000 bgcolor=#3399ff&gt;
&lt;td&gt;
&lt;strong&gt;&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Row&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Array Content&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Data Type&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;1&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;File Name&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Character&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;2&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Comment&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Character&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;3&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Version&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Numeric&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;4&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Version Needed&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Numeric&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;5&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Flags&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Numeric&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;6&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Compression Method &lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Numeric&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;7&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;DOS Date&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Datetime&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;8&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;CRC&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Numeric&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;9&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Compressed Size &lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Numeric&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;10&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Uncompressed Size &lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Numeric&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;11&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Internal Attribute&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Numeric&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;12&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;External Attribute&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Numeric&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;13&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Folder&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Logical&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;The array that is created
will have whatever name was specified by cArrayName. Should the array already exist
it will release it and recreate it. UnzipAFileInfo() is used between calls to UnzipOpen()
and UnzipClose() to show information about a particular file. Use the UnzipAFileInfo
function in conjunction with UnzipGotoTopFile, UnzipGotoNextFile, UnzipGotoFileByName,
and UnzipGotoFileByIndex functions to return information regarding a particular file
contained in the open zip file. You can think of the contents of a zip file as records
in a table. In this sense the UnzipAFileInfo function is used to refer to and retrieve
information about the record that the record pointer is currently on within the zip
file.&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function ZipCallback() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; ZipCallback(cFunction)&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cFunction - A string denoting
a function, procedure, or method that you want fired whenever a zip event occurs,
such as "MyCallback()".&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value: &lt;/strong&gt;None&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Events:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;When one of the following
zip events occurs the function/procedure/method specified by the cFunction parameter
will be called. cZipObjectName, nZipEvent, and nZipBytes are private variables created
on-the-fly by the FLL. They will contain the values specified in the table below.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table bordercolor=#000000 width="80%" border=1&gt;
&lt;tbody&gt;
&lt;tr bordercolor=#000000 bgcolor=#3399ff&gt;
&lt;td&gt;
&lt;strong&gt;&lt;font face="Arial, Helvetica, sans-serif" size=2&gt;Event Description &lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;cZipObjectName (character) &lt;/strong&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;nZipEvent (numeric) &lt;/strong&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;&lt;font face="Arial, Helvetica, sans-serif" size=2&gt;nZipBytes (numeric)&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Zip Opened&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Name and path of zip file&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;0&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;N/A&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Zip/Unzip File Start&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Name and path of file being zipped/unzipped&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;1&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;N/A&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Zip Read or Unzip Write&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Name and path of file being zipped/unzipped&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;2&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Number of bytes currently
being read or written&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Zip/Unzip File End&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Name and path of file being zipped/unzipped&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;3&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;N/A&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font size=2&gt;Zip/Unzip Folder Opened&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Name and path of folder being zipped/unzipped&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;4&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;N/A&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr bordercolor=#000000&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Zip Closed&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Name and path of zip file&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;5&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;N/A&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;Event handling is started
as soon as you call ZipCallback and pass it the name of a function, procedure, or
object method. ZipCallback provides a way for you to hook into the internal events
happening inside of the VFPCompression FLL. nZipBytes reports the number of bytes
currently being read during zip (2048 bytes at a time) or written during unzip (4096
bytes at a time) of an individual file. In order to turn off event handling simply
call the ZipCallback with an empty length string, such as ZipCallback("").&lt;/font&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=3&gt;&lt;strong&gt;Function ZipComment() &lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Signature:&lt;/strong&gt; ZipComment(cZipFileName,
cComment)&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cZipFileName - The file
name or full path to the zip file you wish to add, replace, or delete the comment
on.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;cComment&amp;nbsp;- A string
containing the comment (maximum of 255 characters)&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Return Value:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;None - returns .T. if successful
or .F. if the operation has failed.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Verdana, Arial, Helvetica, sans-serif" size=2&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
If a comment does not exist in the zip file, the string designated in cComment will
be added. However, if a comment already exists in the zip file, the&amp;nbsp;existing
comment will be replaced with the cComment specified. This replacement functionality
allows you to also delete an existing comment in a zip file by passing an empty string
to the cComment parameter.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;/font&gt;&lt;img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=ebdf7fe4-f97c-4e61-9018-3007904ed8da" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.sweetpotatosoftware.com"&gt;SweetPotato
Software, Inc.&lt;/a&gt;</description>
      <comments>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,ebdf7fe4-f97c-4e61-9018-3007904ed8da.aspx</comments>
      <category>Information Technology</category>
      <category>Visual Foxpro</category>
    </item>
    <item>
      <trackback:ping>http://www.sweetpotatosoftware.com/spsblog/Trackback.aspx?guid=7c6e5339-8cc5-41c1-8b11-56fb957cdffb</trackback:ping>
      <pingback:server>http://www.sweetpotatosoftware.com/spsblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,7c6e5339-8cc5-41c1-8b11-56fb957cdffb.aspx</pingback:target>
      <dc:creator>Craig Boyd</dc:creator>
      <wfw:comment>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,7c6e5339-8cc5-41c1-8b11-56fb957cdffb.aspx</wfw:comment>
      <wfw:commentRss>http://www.sweetpotatosoftware.com/spsblog/SyndicationService.asmx/GetEntryCommentsRss?guid=7c6e5339-8cc5-41c1-8b11-56fb957cdffb</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>An Update for the VFPConnection Library</title>
      <guid isPermaLink="false">http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,7c6e5339-8cc5-41c1-8b11-56fb957cdffb.aspx</guid>
      <link>http://www.sweetpotatosoftware.com/spsblog/2008/11/29/AnUpdateForTheVFPConnectionLibrary.aspx</link>
      <pubDate>Sat, 29 Nov 2008 13:01:34 GMT</pubDate>
      <description>&lt;p&gt;
&lt;strong&gt;VFPConnection Library&lt;br&gt;
&lt;/strong&gt;I first introduced the VFPConnection.fll in &lt;a href="http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,e7cccb45-7d99-4c35-85bc-e123c81c8794.aspx"&gt;an
earlier blog post&lt;/a&gt;&amp;nbsp;and the functionality it provided at the time was adequate
for the task at hand. However, it didn't provide support for some of the features
that members of the VFP Community wanted.&amp;nbsp;Most of the enhancement requests I
received from them centered around two things:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Support for SSL (HTTPS and FTPS) 
&lt;li&gt;
Implementation of a Tracing/Debugging Mechanism&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
So, I've enhanced the FLL to provide additional functions and another callback parameter
that seek to fulfill a portion of these two requests. There is certainly much more
that can be done (and will be done) with this FLL in the future. For now I believe
the additional features I've implemented warrant&amp;nbsp;the release of an update. At
the bottom of this blog entry, you'll find a download link for the updated FLL, some
new sample use code, and new documentation that&amp;nbsp;encompasses the additional functions
and callback parameter.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;What's New&lt;br&gt;
&lt;/strong&gt;I've added 6 new functions to handle communication via Secure Sockets Layer
(SSL): FTPSGet(), FTPSPut(), FTPSToStr(), HTTPSGet(), HTTPSPUT(), HTTPSToStr(). I've
also added a new parameter,&amp;nbsp;cTraceCallback,&amp;nbsp;to all of the FLL's functions.
This new callback is especially useful when doing FTP/FTPS transfers as it reports
on all of the traffic going back and forth between the client and server.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;What's Next&lt;br&gt;
&lt;/strong&gt;I plan to add a bunch more FTP functionality and some facility for doing
HTTP POSTs. I'm hopeful that those of you that download this library will take the
time to provide me feedback and any suggestions you may have for further improving
it. The update provided here is a testament to the fact that your feedback is valuable
and an integral part of the improvement process for&amp;nbsp;the stuff I provide to the
VFP Community.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana size=2&gt;Until
next time... Visual FoxPro Rocks!&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;/p&gt;
&lt;hr&gt;
&gt; 
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;strong&gt;&lt;font color=#ff0000 size=4&gt;PLEASE
NOTE:&lt;/font&gt;&lt;/strong&gt; &lt;font size=4&gt;An updated version of this FLL and documenation
is &lt;/font&gt;&lt;a href="http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,b6eb576c-7142-4993-b3f2-74b7af5fb66c.aspx"&gt;&lt;font size=4&gt;available
here&lt;/font&gt;&lt;/a&gt;&lt;font size=4&gt;.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;font size=4&gt; 
&lt;hr&gt;
&lt;/font&gt;&lt;/span&gt;&gt; 
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #3399ff; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;a href="http://www.sweetpotatosoftware.com/files/vfpconnection.zip"&gt;&lt;b&gt;&lt;span style="COLOR: #3399ff; LINE-HEIGHT: 150%; TEXT-DECORATION: none; mso-bidi-font-size: 11.0pt; text-underline: none"&gt;&lt;span class=searchword&gt;VFPConnection&lt;/span&gt; FLL
Download (395 KB approx.)&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: #3399ff; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;VFPConnection.FLL
Sample Use Code:&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;CLEAR&lt;br&gt;
SET LIBRARY TO (LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"vfpconnection.fll"&lt;/span&gt;,&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FLL"&lt;/span&gt;))&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Uncomment
any of the lines of code below, modify it to suit, and then execute the code.&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; NOTE:
The &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; trace
parameter&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; ?FILEGet(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"File:///C:\Source.txt"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Destination.txt"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyProgress()"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; ?FTPGet(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FTP://UserName:Password@somedomain.com/directory/Source.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Destination.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyProgress()"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; ?FTPSGet(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FTPS://UserName:Password@somedomain.com:21/directory/Source.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Destination.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyProgress()"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; ?HTTPGet(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"http://www.somedomain.com/Source.htm"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Destination.htm"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyProgress()"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; ?HTTPSGet(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"https://www.somedomain.com/Source.htm"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Destination.htm"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyProgress()"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; ?FILEPut(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Source.txt"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"File:///C:\Destination.txt"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyProgress()"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; ?FTPPut(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Source.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FTP://UserName:Password@somedomain.com/directory/Destination.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyProgress()"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; ?FTPSPut(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Source.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FTPS://UserName:Password@somedomain.com:21/directory/Destination.zip"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyProgress()"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; ?HTTPPut(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Source.htm"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"http://www.somedomain.com/Destination.htm"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyProgress()"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; ?HTTPSPut(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Source.htm"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"https://www.somedomain.com/Destination.htm"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyProgress()"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyTrace()"&lt;/span&gt;)&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; ?FILEToStr(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"C:\Source.txt"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; ?FTPSTOSTR(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FTPS://UserName:Password@somedomain.com:21/directory/Source.txt"&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt;!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; ?HTTPSToStr(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"https://www.somedomain.com/Source.txt"&lt;/span&gt;)&lt;br&gt;
&lt;br&gt;
SET LIBRARY TO 
&lt;br&gt;
&lt;br&gt;
***********************&lt;br&gt;
FUNCTION MyProgress() &amp;amp;&amp;amp; Callback from the FLL &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;-&lt;/span&gt; can
be used to track operation progress&lt;br&gt;
***********************&lt;br&gt;
?m.nConnectTotalBytes&lt;br&gt;
?m.nConnectBytesSoFar&lt;br&gt;
ENDFUNC&lt;br&gt;
&lt;br&gt;
***********************&lt;br&gt;
FUNCTION MyTrace() &amp;amp;&amp;amp; Callback from the FLL &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;-&lt;/span&gt; used
to provide a detailed trace of the operation&lt;br&gt;
***********************&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#DEFINE TYPE_TEXT 0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#DEFINE TYPE_HEADER_IN 1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#DEFINE TYPE_HEADER_OUT 2&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#DEFINE TYPE_DATA_IN 3&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#DEFINE TYPE_DATA_OUT 4&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#DEFINE TYPE_SSL_DATA_IN 5&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#DEFINE TYPE_SSL_DATA_OUT 6&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#DEFINE TYPE_END 7&lt;br&gt;
?ICASE(m.nTraceDataType &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; TYPE_TEXT, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"STATUS:"&lt;/span&gt;,
;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m.nTraceDataType &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; TYPE_HEADER_IN, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;lt;RECV
HEADER: "&lt;/span&gt;, ;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m.nTraceDataType &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; TYPE_HEADER_OUT, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;gt;SEND
HEADER: "&lt;/span&gt;, ;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m.nTraceDataType &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; TYPE_DATA_IN, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;lt;RECV
DATA: "&lt;/span&gt;, ;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m.nTraceDataType &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; TYPE_DATA_OUT, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;gt;SEND
DATA: "&lt;/span&gt;, ;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m.nTraceDataType &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; TYPE_SSL_DATA_IN, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;lt;RECV
SSL DATA: "&lt;/span&gt;, ;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m.nTraceDataType &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; TYPE_SSL_DATA_OUT, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;gt;SEND
SSL DATA: "&lt;/span&gt;, ;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m.nTraceDataType &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; TYPE_END, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"END:
"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"UNKNOWN:
"&lt;/span&gt;)&lt;br&gt;
??m.cTraceData&lt;br&gt;
ENDFUNC&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr align=center width="100%" size=1&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;br&gt;
&lt;/p&gt;
&gt;&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;VFPConnection.FLL
Documenation:&lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Function
FTPGet() &lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Signature:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; FTPGet(cSourceURL,
cDestination[, cProgressCallback[, cTraceCallback]])&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Parameters:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cSourceURL
- The URL to the file you wish to download.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cDestination
- The full path and file name where you want the source file saved.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt; 
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;cProgressCallback
- An optional string denoting a function, procedure, or method that you want fired
whenever a read/write occurs, such as "MyProgress()".&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/span&gt;&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Return
Value:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Logical
- returns .T. if successful or .F. if the operation has failed.&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Remarks:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;This
function provides the ability to download a file from an FTP site.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;In
order to specify port or login information you would simply include them in cSourceURL,
such as “FTP://myusername:mypassword@myftpsite.com:21/mydir/myfile.zip”.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;0
= Text, &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;1
= Header In, 2 = Header Out, 3 = Data In, 4 = Data Out, 5 = SSL Data In, 6 = SSL Data
Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr align=center width="100%" size=1&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;br&gt;
&lt;/span&gt;&gt;&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;b&gt;&lt;span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Function
FTPSGet() &lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Signature:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; FTPSGet(cSourceURL,
cDestination[, cProgressCallback[, cTraceCallback]])&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Parameters:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cSourceURL
- The URL to the file you wish to download.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cDestination
- The full path and file name where you want the source file saved.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt; 
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;cProgressCallback
- An optional string denoting a function, procedure, or method that you want fired
whenever a read/write occurs, such as "MyProgress()".&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/span&gt;&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Return
Value:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Logical
- returns .T. if successful or .F. if the operation has failed.&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Remarks:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;This
function provides the ability to download a file from an FTP&amp;nbsp;site that provides&amp;nbsp;FTP
over Secure Sockets Layer (SSL). It should be noted that this function does not check
the site's certificate for authenticity/validness nor does it compare the site to
the identity specified by the certificate.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;In
order to specify port or login information you would simply include them in cSourceURL,
such as “FTPS://myusername:mypassword@myftpsite.com:21/mydir/myfile.zip”.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;0
= Text, &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;1
= Header In, 2 = Header Out, 3 = Data In, 4 = Data Out, 5 = SSL Data In, 6 = SSL Data
Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr align=center width="100%" size=1&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&gt;&gt;&lt;b&gt;&lt;span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Function
HTTPGet() &lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Signature:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; HTTPGet(cSourceURL,
cDestination[, cProgressCallback[, cTraceCallback]])&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Parameters:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cSourceURL
- The URL to the file you wish to download.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cDestination
- The full path and file name where you want the source file saved.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;cProgressCallback
- An optional string denoting a function, procedure, or method that you want fired
whenever a read/write occurs, such as "MyProgress()".&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt; 
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Return
Value:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Logical
- returns .T. if successful or .F. if the operation has failed.&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Remarks:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;This
function provides the ability to download a file from a website.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;0
= Text, &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;1
= Header In, 2 = Header Out, 3 = Data In, 4 = Data Out, 5 = SSL Data In, 6 = SSL Data
Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr align=center width="100%" size=1&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;br&gt;
&lt;/span&gt;&gt;&lt;b&gt;&lt;span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Function
HTTPSGet() &lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Signature:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; HTTPSGet(cSourceURL,
cDestination[, cProgressCallback[, cTraceCallback]])&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Parameters:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cSourceURL
- The URL to the file you wish to download.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cDestination
- The full path and file name where you want the source file saved.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;cProgressCallback
- An optional string denoting a function, procedure, or method that you want fired
whenever a read/write occurs, such as "MyProgress()".&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt; 
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Return
Value:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Logical
- returns .T. if successful or .F. if the operation has failed.&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Remarks:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;This
function provides the ability to download a file from a a website that provides&amp;nbsp;HTTP
over Secure Sockets Layer (SSL). It should be noted that this function does not check
the site's certificate for authenticity/validness nor does it compare the site to
the identity specified by the certificate.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;0
= Text, &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;1
= Header In, 2 = Header Out, 3 = Data In, 4 = Data Out, 5 = SSL Data In, 6 = SSL Data
Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr align=center width="100%" size=1&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;br&gt;
&lt;/span&gt;&gt;&gt;&gt;&lt;b&gt;&lt;span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Function
FILEGet() &lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Signature:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; FILEGet(cSourceURL,
cDestination[, cProgressCallback[, cTraceCallback]])&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Parameters:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cSourceURL
- The full path and file name to the file you wish to copy.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cDestination
- The full path and file name where you want the source file saved.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;cProgressCallback
– An optional string denoting a function, procedure, or method that you want fired
whenever a read/write occurs, such as "MyProgress()".&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt; 
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-size: 12.0pt"&gt;Return
Value:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Logical
- returns .T. if successful or .F. if the operation has failed.&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Remarks:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;This
function provides the ability to copy a file from a local or remote location.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;The
format for the cSourceURL parameter is slightly different than you might expect. In
order to copy file C:\MyDir\MyFile.zip you would specify cSourceURL as &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;“FILE://
C:\MyDir\MyFile.zip”.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;0
= Text, &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;1
= Header In, 2 = Header Out, 3 = Data In, 4 = Data Out, 5 = SSL Data In, 6 = SSL Data
Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr align=center width="100%" size=1&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;br&gt;
&lt;/span&gt;&gt;&gt;&lt;b&gt;&lt;span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Function
FTPPut() &lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Signature:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; FTPPut(cSource,
cDestinationURL[, cProgressCallback[, cTraceCallback]])&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Parameters:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cSource
- The full path and file name of the file you want uploaded.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cDestinationURL
- The URL to where the file specified in cSource should be uploaded to.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;cProgressCallback
- An optional string denoting a function, procedure, or method that you want fired
whenever a read/write occurs, such as "MyProgress()".&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt; 
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Return
Value:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Logical
- returns .T. if successful or .F. if the operation has failed.&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Remarks:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;This
function provides the ability to upload a file to an FTP site.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;In
order to specify port or login information you would simply include them in cDestinationURL,
such as “FTP://myusername:mypassword@myftpsite.com:21/mydir/myfile.zip”.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;0
= Text, &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;1
= Header In, 2 = Header Out, 3 = Data In, 4 = Data Out, 5 = SSL Data In, 6 = SSL Data
Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr align=center width="100%" size=1&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;br&gt;
&lt;/span&gt;&gt;&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;b&gt;&lt;span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Function
FTPSPut() &lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Signature:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; FTPSPut(cSource,
cDestinationURL[, cProgressCallback[, cTraceCallback]])&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Parameters:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cSource
- The full path and file name of the file you want uploaded.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cDestinationURL
- The URL to where the file specified in cSource should be uploaded to.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;cProgressCallback
- An optional string denoting a function, procedure, or method that you want fired
whenever a read/write occurs, such as "MyProgress()".&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Return
Value:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Logical
- returns .T. if successful or .F. if the operation has failed.&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Remarks:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;This
function provides the ability to upload a file to an FTP&amp;nbsp;site that provides&amp;nbsp;FTP
over Secure Sockets Layer (SSL). It should be noted that this function does not check
the site's certificate for authenticity/validness nor does it compare the site to
the identity specified by the certificate.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;In
order to specify port or login information you would simply include them in cDestinationURL,
such as “FTPS://myusername:mypassword@myftpsite.com:21/mydir/myfile.zip”.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;0
= Text, &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;1
= Header In, 2 = Header Out, 3 = Data In, 4 = Data Out, 5 = SSL Data In, 6 = SSL Data
Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr align=center width="100%" size=1&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=center&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&gt;&gt;&lt;b&gt;&lt;span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Function
HTTPPut() &lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Signature:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; HTTPPut(cSource,
cDestinationURL[, cProgressCallback[, cTraceCallback]])&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Parameters:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cSource
- The full path and file name of the file you want uploaded.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cDestinationURL
- The URL to where the file specified in cSource should be uploaded to.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;cProgressCallback
- An optional string denoting a function, procedure, or method that you want fired
whenever a read/write occurs, such as "MyProgress()".&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt; 
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Return
Value:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Logical
- returns .T. if successful or .F. if the operation has failed.&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Remarks:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;This
function provides the ability to upload a file to a website.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;0
= Text, &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;1
= Header In, 2 = Header Out, 3 = Data In, 4 = Data Out, 5 = SSL Data In, 6 = SSL Data
Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr align=center width="100%" size=1&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;br&gt;
&lt;/span&gt;&gt;&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;b&gt;&lt;span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Function
HTTPSPut() &lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&gt;
&lt;div class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: center" align=center&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Signature:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; HTTPSPut(cSource,
cDestinationURL[, cProgressCallback[, cTraceCallback]])&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Parameters:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cSource
- The full path and file name of the file you want uploaded.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cDestinationURL
- The URL to where the file specified in cSource should be uploaded to.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;cProgressCallback
- An optional string denoting a function, procedure, or method that you want fired
whenever a read/write occurs, such as "MyProgress()".&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt; 
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Return
Value:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Logical
- returns .T. if successful or .F. if the operation has failed.&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Remarks:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;This
function provides the ability to upload a file to a website that provides&amp;nbsp;HTTP
over Secure Sockets Layer (SSL). It should be noted that this function does not check
the site's certificate for authenticity/validness nor does it compare the site to
the identity specified by the certificate.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;0
= Text, &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;1
= Header In, 2 = Header Out, 3 = Data In, 4 = Data Out, 5 = SSL Data In, 6 = SSL Data
Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr align=center width="100%" size=1&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;br&gt;
&lt;/span&gt;
&lt;/span&gt;&gt;&gt;&lt;b&gt;&lt;span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Function
FILEPut() &lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&gt;
&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Signature:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; FILEPut(cSource,
cDestinationURL[, cProgressCallback[, cTraceCallback]])&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Parameters:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cSource
- The full path and file name of the file you want copied.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cDestinationURL
- The full path and file name where the file specified in cSource should be copied
to.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;cProgressCallback
- An optional string denoting a function, procedure, or method that you want fired
whenever a read/write occurs, such as "MyProgress()".&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt; 
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-size: 12.0pt"&gt;Return
Value:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Logical
- returns .T. if successful or .F. if the operation has failed.&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Remarks:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;This
function provides the ability to copy a file to a local or remote location.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;The
format for the cDestinationURL parameter is slightly different than you might expect.
In order to copy file C:\MyDir\MyFile.zip you would specify cDestinationURL as &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;“FILE://
C:\MyDir\MyFile.zip”.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;0
= Text, &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;1
= Header In, 2 = Header Out, 3 = Data In, 4 = Data Out, 5 = SSL Data In, 6 = SSL Data
Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr align=center width="100%" size=1&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;br&gt;
&lt;/span&gt;&gt;&gt;&lt;b&gt;&lt;span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Function
FTPToStr() &lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Signature:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; FTPToStr(cSourceURL[,
cProgressCallback[, cTraceCallback]])&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Parameters:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cSourceURL
- The URL to the file you wish to return a string from.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;cProgressCallback
- An optional string denoting a function, procedure, or method that you want fired
whenever a read/write occurs, such as "MyProgress()".&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt; 
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Return
Value:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Character
Data - the contents of the file specified by cSourceURL&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Remarks:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;This
function provides the ability to retrieve a file from an FTP site as a string.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;In
order to specify port or login information you would simply include them in cSourceURL,
such as “FTP://myusername:mypassword@myftpsite.com:21/mydir/myfile.txt”.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;0
= Text, &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;1
= Header In, 2 = Header Out, 3 = Data In, 4 = Data Out, 5 = SSL Data In, 6 = SSL Data
Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr align=center width="100%" size=1&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;br&gt;
&gt;&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;b&gt;&lt;span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Function
FTPSToStr() &lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Signature:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; FTPSToStr(cSourceURL[,
cProgressCallback[, cTraceCallback]])&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Parameters:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cSourceURL
- The URL to the file you wish to return a string from.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;cProgressCallback
- An optional string denoting a function, procedure, or method that you want fired
whenever a read/write occurs, such as "MyProgress()".&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt; 
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Return
Value:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Character
Data - the contents of the file specified by cSourceURL&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Remarks:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;This
function provides the ability to retrieve a file as a string from an FTP&amp;nbsp;site
that provides&amp;nbsp;FTP over Secure Sockets Layer (SSL). It should be noted that this
function does not check the site's certificate for authenticity/validness nor does
it compare the site to the identity specified by the certificate.&lt;o:p&gt;&lt;/o:p&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;In
order to specify port or login information you would simply include them in cSourceURL,
such as “FTPS://myusername:mypassword@myftpsite.com:21/mydir/myfile.txt”.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;0
= Text, &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;1
= Header In, 2 = Header Out, 3 = Data In, 4 = Data Out, 5 = SSL Data In, 6 = SSL Data
Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr align=center width="100%" size=1&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;br&gt;
&gt;&gt;&gt;&lt;b&gt;&lt;span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Function
HTTPToStr() &lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Signature:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; HTTPToStr(cSourceURL[,
cProgressCallback[, cTraceCallback]])&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Parameters:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cSourceURL
- The URL to the file you wish to download.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;cProgressCallback
- An optional string denoting a function, procedure, or method that you want fired
whenever a read/write occurs, such as "MyProgress()".&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt; 
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Return
Value:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Logical
- returns .T. if successful or .F. if the operation has failed.&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Remarks:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;This
function provides the ability to retrieve a file from a website as a string.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;0
= Text, &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;1
= Header In, 2 = Header Out, 3 = Data In, 4 = Data Out, 5 = SSL Data In, 6 = SSL Data
Out, 7 = End.
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;hr align=center width="100%" size=1&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;br&gt;
&lt;/span&gt;&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;b&gt;&lt;span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Function
HTTPSToStr() &lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Signature:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; HTTPSToStr(cSourceURL[,
cProgressCallback[, cTraceCallback]])&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Parameters:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;cSourceURL
- The URL to the file you wish to download.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;cProgressCallback
- An optional string denoting a function, procedure, or method that you want fired
whenever a read/write occurs, such as "MyProgress()".&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt; 
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
cTraceCallback - An optional string denoting a function, procedure, or method that
you want fired whenever additional information regarding the status of the operation
is available. Eample: "MyTrace()"
&lt;/p&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Return
Value:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p style="BACKGROUND: white; LINE-HEIGHT: 150%; TEXT-ALIGN: justify"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Logical
- returns .T. if successful or .F. if the operation has failed.&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Remarks:&lt;/span&gt;&lt;/b&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;This
function provides the ability to retrieve a file as a string from a website that provides
HTTP over Secure Sockets Layer (SSL). It should be noted that this function does not
check the site's certificate for authenticity/validness nor does it compare the site
to the identity specified by the certificate.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cProgressCallback is called 2 variables (nConnectTotalBytes and nConnectBytesSoFar)
are created dynamically by the FLL. These variables can be used within the specified
function, procedure, or method to determine the total size of the source file in bytes
as well as the total progress of the operation (Percentage = 100 * nConnectBytesSoFar
/ nConnectTotalBytes).&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; 
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 150%; TEXT-ALIGN: justify; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When
the cTraCallback is called 2 variables (nTraceDataType and cTraceData) are created
dynamically by the FLL. The variable nTraceDataType specifies the type of operation
that produced the information contained in cTraceData. The possible values for nTraceDataType
are as follows: &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;0
= Text, &lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;1
= Header In, 2 = Header Out, 3 = Data In, 4 = Data Out, 5 = SSL Data In, 6 = SSL Data
Out, 7 = End.&lt;/span&gt;
&lt;/span&gt;&gt;
&lt;/span&gt;&gt;&lt;font color=#000000&gt;&lt;/font&gt;&lt;img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=7c6e5339-8cc5-41c1-8b11-56fb957cdffb" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.sweetpotatosoftware.com"&gt;SweetPotato
Software, Inc.&lt;/a&gt;</description>
      <comments>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,7c6e5339-8cc5-41c1-8b11-56fb957cdffb.aspx</comments>
      <category>Information Technology</category>
      <category>Visual Foxpro</category>
    </item>
    <item>
      <trackback:ping>http://www.sweetpotatosoftware.com/spsblog/Trackback.aspx?guid=aeeb57dc-dab4-41d0-9748-5ef40a39757c</trackback:ping>
      <pingback:server>http://www.sweetpotatosoftware.com/spsblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,aeeb57dc-dab4-41d0-9748-5ef40a39757c.aspx</pingback:target>
      <dc:creator>Craig Boyd</dc:creator>
      <wfw:comment>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,aeeb57dc-dab4-41d0-9748-5ef40a39757c.aspx</wfw:comment>
      <wfw:commentRss>http://www.sweetpotatosoftware.com/spsblog/SyndicationService.asmx/GetEntryCommentsRss?guid=aeeb57dc-dab4-41d0-9748-5ef40a39757c</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <strong>Virtual Earth<br /></strong>Billed as "...the integrated mapping, imaging, search, and data visualization
platform", Microsoft's <a href="http://www.microsoft.com/VirtualEarth/">Virtual Earth</a> (VE)
is an awesome mapping service that can be consumed and manipulated using the VE Map
contol and JavaScript. In order to get a feel for what VE is capabable of, head on
over to the <a href="http://dev.live.com/virtualearth/sdk/">VE Interactive SDK</a> and
try some of the examples provided. There is plenty of documentation, blog
entries and articles available online that provide general VE overviews and detail
the specific features the service provides, so I won't spend a lot of time explaining
what VE is and what it does. I want to explain enough so that you can understand the
goals of the VFP Virtual Earth wrapper class library that I'm presenting in this blog
entry. I figure you can do a few online searches if you're interested in a deeper
or broader understanding of VE and its specific features.
</p>
        <p>
          <strong>Virtual Earth Map Control<br /></strong>In order to understand VE from a developer standpoint you'll need to be familiar
with the <a href="http://msdn.microsoft.com/en-us/library/bb429565.aspx">Virtual Earth
Map Control</a>. The VE Map Control and the JavaScript classes/enumerations that make
it up are provided via a web handler (.ashx file). I find it is more understandable
to think of it as a library rather than a control. The VEMap class (which is part
of the VE Map Control) is what I would consider the actual control that is seen within
a web page. Perhaps I'm splitting hairs here, but I found it to be a helpful distinction
in my mind when first starting to work with VE.
</p>
        <p>
          <strong>Creating Your First VE Web Page<br /></strong>It's pretty simple to add the VE Map Control to a web page and use it to
instantiate an instance of the VEMap class. Here's the basic HTML needed in order
to create such a page...
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">&lt;html
xmlns=<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"http://www.w3.org/1999/xhtml"</span>&gt;<br />
    &lt;head&gt;<br />
        &lt;title&gt;Virtual Earth&lt;/title&gt;<br />
        &lt;meta http-equiv=<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Content-Type"</span> content=<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"text/html;
charset=utf-8"</span> /&gt;<br />
        &lt;script type=<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"text/javascript"</span> src=<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2"</span>&gt;&lt;/script&gt;<br />
        &lt;script type=<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"text/javascript"</span>&gt;<br />
            var map <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>;<br />
            function startVE()<br />
            {<br />
               
map <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> VEMap('myMap');<br />
               
map.LoadMap();<br />
            }<br />
            function cleanUp()<br />
            {<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><font color="#000000">                </font>if</span> (map
!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>)
map.Dispose();<br />
            }<br />
        &lt;/script&gt;<br />
    &lt;/head&gt;<br />
    &lt;body onload=<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"startVE();"</span> onunload=<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"cleanUp();"</span> style=<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"margin:
0px"</span>&gt;<br />
        &lt;div style=<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"overflow:
hidden; width: 100%; height: 100%;"</span> id=<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"myMap"</span> /&gt;<br />
    &lt;/body&gt;<br />
&lt;/html&gt;</span>
        </p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <font face="Verdana" color="#003300" size="2">You
should note that the first script tag specifies the web handler mapcontrol.ashx as
the source. Also, note how an instance of VEMap is created using the body's onload
and is eventually disposed of in the cleanUp() function via the body's onunload. In
any event, it's pretty easy stuff given the results (go ahead and cut and paste that
bit of code into an HTML file and view it in Internet Explorer).</font>
          </span>
        </p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <font face="Verdana" color="#003300" size="2">
              <strong>What
About Desktop Applications?<br /></strong>Obviously, given the architecture and heavy reliance on JavaScript, this
stuff was made for web applications. But what about desktop applications that require
geocoding of addresses, distance measurements, scheduling based on zones, or routing
with turn-by-turn directions? I mean, Virtual Earth would work great if there was
just some way to run an HTML page on a VFP form... Oh wait, Microsoft has provided
us the WebBrowser control! Just drop that ActiveX control on a form and make
a quick call to something like, Thisform.Olecontrol1.Navigate("file:///C:\VETest.html").
Looks like we're </font>
          </span>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <font face="Verdana" color="#003300" size="2">in
business.</font>
          </span>
        </p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <font face="Verdana" color="#003300" size="2">The
only thing that's left to do after that is write all of the JavaScript code that
interacts with the VE Map Control. Awesome! Except that... erm... you may not know
very much JavaScript (even though you're a kick-butt VFP developer), and you may need
VFP code to freely interact with the JavaScript objects (or vice versa), and how the
heck do you get JavaScript to read your database where all of your addresses are stored?
And... And...</font>
          </span>
        </p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <font face="Verdana" color="#003300" size="2">
              <strong>Virtual
Earth Wrapper for VFP<br /></strong>OK, so the previous section outlines the thought process that eventually
lead to the class library that I built to tackle these problems. While working on
a VFP project for a customer that involved VE, I looked at that list of classes and
enumerations for the <a href="http://msdn.microsoft.com/en-us/library/bb429565.aspx">Virtual
Earth Map Control</a> version 6.2 and basically thought, "Wouldn't it be super
cool if those were all VFP classes??!!".</font>
          </span>
        </p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <font face="Verdana" color="#003300" size="2">I needed
a class library (.vcx) wrapper for VE. This would contain all of the same classes
(VFP equivalents) and a few super slick ways to commuicate and convert between VFP
and JavaScript. With those in hand it would simply be a matter of hammering out the 5-10
thousand lines of code and comments to make it happen. I won't go into the particulars
of everything I ended up doing in order to make this work (you can look in the class
library's code yourself if you're interested), but I did end up using the <a href="http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,5f96efd7-f350-4bc8-86c5-caffd9e833eb.aspx">JSON
class</a> I created to handle most of the conversions and transport (data interchange) between
the two languages.</font>
          </span>
        </p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <font face="Verdana" color="#003300" size="2">As
you'll see in the download, the class library wrapper (virtualearth.vcx) is pretty
much a carbon copy of the VE classes. So, most of the documentation and
code that's online for VE is of benefit when using it. In addition
to the virtualearth.vcx, I've also provided a sample project and form (see screenshot
below), so you can try this stuff out right away. The sample project is
also intended to provide a little more information regarding how to do some of the
things that a developer might want to do with VE in a desktop application. I usually
find that learning by example is one of the fastest ways to get up to speed on a technology
I'm not very familiar with.</font>
          </span>
        </p>
        <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
          <font face="Verdana" color="#003300" size="2">
            <p>
              <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
                <font face="Verdana" size="2">
                  <strong>Special
Thank You<br /></strong>Before I wrap this blog entry up, I want to express my appreciation for <a href="http://fox.wikis.com/wc.dll?Wiki~MarcLyon~People"><strong><font color="#3399ff">Marc
Lyon</font></strong></a>'s efforts. He provided me early feedback and testing
for this class library. His enthusiasm for this project was also one of the driving
forces behind my completing it as fast as I did.</font>
              </span>
            </p>
            <p>
              <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
                <font face="Verdana" size="2">I
also want to thank my client (you know who you are) who has been kind enough to allow
me to share this work with the VFP Community. You're about as generous and kind as
they come.</font>
              </span>
            </p>
            <p>
              <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
                <font face="Verdana" size="2">
                  <strong>What's
Next<br /></strong>Just have fun with Virtual Earth in VFP and see if virtualearth.vcx is useful
to you and your applications. In a perfect world, you'd report back to me with any
bugs you find, create some examples of your own and blog about them, or
seek to improve the library in some way. If you do improve virtualearth.vcx,
I'd appreciate it if you would contact me and share the improvements you've implemented.
Thank you in advanced to those of you that decide to follow any of the above
suggestions.</font>
              </span>
            </p>
            <p>
              <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
                <font face="Verdana" size="2">Until
next time... Visual FoxPro Rocks!</font>
              </span>
            </p>
            <p>
              <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
                <font face="Verdana" size="2">
                  <a href="http://www.sweetpotatosoftware.com/files/VirtualEarth.zip">Download
VirtualEarth.vcx and Sample (approx. 222 KB)</a>
                </font>
              </span>
              <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
                <font face="Verdana" size="2">
                  <br />
                </font>
              </span>
            </p>
            <p>
            </p>
          </font>
        </span>
        <img src="http://www.sweetpotatosoftware.com/SPSBlog/content/binary/virtualearth1.jpg" border="0" />
        <p>
          <strong>Figure 1:</strong> A sample form provided in the download. It gives developers
a starting point when beginning to work with the virtualearth.vcx.
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=aeeb57dc-dab4-41d0-9748-5ef40a39757c" />
        <br />
        <hr />
This weblog is sponsored by <a href="http://www.sweetpotatosoftware.com">SweetPotato
Software, Inc.</a></body>
      <title>Virtual Earth Class Library for Visual FoxPro</title>
      <guid isPermaLink="false">http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,aeeb57dc-dab4-41d0-9748-5ef40a39757c.aspx</guid>
      <link>http://www.sweetpotatosoftware.com/spsblog/2008/11/27/VirtualEarthClassLibraryForVisualFoxPro.aspx</link>
      <pubDate>Thu, 27 Nov 2008 10:10:20 GMT</pubDate>
      <description>&lt;p&gt;
&lt;strong&gt;Virtual Earth&lt;br&gt;
&lt;/strong&gt;Billed as "...the integrated mapping, imaging, search, and data visualization
platform", Microsoft's &lt;a href="http://www.microsoft.com/VirtualEarth/"&gt;Virtual Earth&lt;/a&gt; (VE)
is an awesome mapping service that can be consumed and manipulated using the VE Map
contol and JavaScript. In order to get a feel for what VE is capabable of, head on
over to the &lt;a href="http://dev.live.com/virtualearth/sdk/"&gt;VE Interactive SDK&lt;/a&gt; and
try some of the examples provided. There&amp;nbsp;is&amp;nbsp;plenty of documentation, blog
entries&amp;nbsp;and articles available online that provide general VE overviews and detail
the specific features the service provides, so I won't spend a lot of time explaining
what VE is and what it does. I want to explain enough so that you can understand the
goals of the VFP Virtual Earth wrapper class library that I'm presenting in this blog
entry. I figure you can do a few online searches if you're interested in a deeper
or broader understanding of VE and its specific features.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Virtual Earth Map Control&lt;br&gt;
&lt;/strong&gt;In order to understand VE from a developer standpoint you'll need to be familiar
with the &lt;a href="http://msdn.microsoft.com/en-us/library/bb429565.aspx"&gt;Virtual Earth
Map Control&lt;/a&gt;. The VE Map Control and the JavaScript classes/enumerations that make
it up are provided via a web handler (.ashx file). I find it is more understandable
to think of it as a library rather than a control. The VEMap class (which is part
of the VE Map Control) is what I would consider the actual control that is seen within
a web page. Perhaps I'm splitting hairs here, but I found it to be a helpful distinction
in my mind when first starting to work with VE.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Creating Your First VE Web Page&lt;br&gt;
&lt;/strong&gt;It's pretty simple to add the VE Map Control to a web page and use it to
instantiate an instance of the VEMap class. Here's the basic HTML needed in order
to create such a page...
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;lt;html
xmlns=&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"http://www.w3.org/1999/xhtml"&lt;/span&gt;&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;head&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;Virtual Earth&amp;lt;/title&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;meta http-equiv=&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Content-Type"&lt;/span&gt; content=&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"text/html;
charset=utf-8"&lt;/span&gt; /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type=&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"text/javascript"&lt;/span&gt; src=&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type=&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"text/javascript"&lt;/span&gt;&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var map &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function startVE()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
map &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; VEMap('myMap');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
map.LoadMap();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function cleanUp()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;if&lt;/span&gt; (map
!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;)
map.Dispose();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/head&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;body onload=&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"startVE();"&lt;/span&gt; onunload=&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"cleanUp();"&lt;/span&gt; style=&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"margin:
0px"&lt;/span&gt;&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div style=&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"overflow:
hidden; width: 100%; height: 100%;"&lt;/span&gt; id=&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"myMap"&lt;/span&gt; /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;br&gt;
&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana color=#003300 size=2&gt;You
should note that the first script tag specifies the web handler mapcontrol.ashx as
the source. Also, note how an instance of VEMap is created using the body's onload
and is eventually disposed of in the cleanUp() function via the body's onunload. In
any event, it's pretty easy stuff given the results (go ahead and cut and paste that
bit of code into an HTML file and view it in Internet Explorer).&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana color=#003300 size=2&gt;&lt;strong&gt;What
About Desktop Applications?&lt;br&gt;
&lt;/strong&gt;Obviously, given the architecture and heavy reliance on JavaScript, this
stuff was made for web applications. But what about desktop applications that require
geocoding of addresses, distance measurements, scheduling based on zones, or routing
with turn-by-turn directions? I mean, Virtual Earth would work great if there was
just some way to run an HTML page on a VFP form... Oh wait, Microsoft has provided
us&amp;nbsp;the WebBrowser control! Just drop that ActiveX control on a form and make
a quick call to something like, Thisform.Olecontrol1.Navigate("file:///C:\VETest.html").
Looks like we're &lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana color=#003300 size=2&gt;in
business.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana color=#003300 size=2&gt;The
only thing that's&amp;nbsp;left to do after that is write all of the JavaScript code that
interacts with the VE Map Control. Awesome! Except that... erm... you may not know
very much JavaScript (even though you're a kick-butt VFP developer), and you may need
VFP code to freely interact with the JavaScript objects (or vice versa), and how the
heck do you get JavaScript to read your database where all of your addresses are stored?
And... And...&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana color=#003300 size=2&gt;&lt;strong&gt;Virtual
Earth Wrapper for VFP&lt;br&gt;
&lt;/strong&gt;OK, so&amp;nbsp;the previous section outlines the&amp;nbsp;thought process that&amp;nbsp;eventually
lead to the class library that I built to tackle these problems. While working on
a VFP project for a customer that involved VE, I looked at that list of classes and
enumerations for the &lt;a href="http://msdn.microsoft.com/en-us/library/bb429565.aspx"&gt;Virtual
Earth Map Control&lt;/a&gt;&amp;nbsp;version 6.2 and basically thought, "Wouldn't it be super
cool if those were all VFP classes??!!".&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana color=#003300 size=2&gt;I&amp;nbsp;needed
a class library (.vcx)&amp;nbsp;wrapper for VE. This would contain all of the same classes
(VFP equivalents) and a few super slick ways to commuicate and convert between VFP
and JavaScript. With those in hand it would simply be a matter of hammering out&amp;nbsp;the&amp;nbsp;5-10
thousand&amp;nbsp;lines of code and comments to make it happen. I won't go into the particulars
of everything I ended up doing in order to make this work (you can look in the class
library's code yourself if you're interested), but I did end up using the &lt;a href="http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,5f96efd7-f350-4bc8-86c5-caffd9e833eb.aspx"&gt;JSON
class&lt;/a&gt; I created to handle most of the conversions and transport (data interchange)&amp;nbsp;between
the two languages.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana color=#003300 size=2&gt;As
you'll see in the download, the class library wrapper (virtualearth.vcx) is&amp;nbsp;pretty
much a carbon copy of the&amp;nbsp;VE classes. So,&amp;nbsp;most of the documentation and
code that's&amp;nbsp;online for VE is of benefit when using&amp;nbsp;it.&amp;nbsp;In addition
to the virtualearth.vcx, I've also provided a sample project and form (see screenshot
below), so you can try&amp;nbsp;this stuff&amp;nbsp;out right away. The sample project is
also intended to provide a little more information regarding how to do some of the
things that a developer might want to do with VE in a desktop application. I usually
find that learning by example is one of the fastest ways to get up to speed on a technology
I'm not very familiar with.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana color=#003300 size=2&gt; 
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana size=2&gt;&lt;strong&gt;Special
Thank You&lt;br&gt;
&lt;/strong&gt;Before I&amp;nbsp;wrap this blog entry up,&amp;nbsp;I want to express my appreciation&amp;nbsp;for &lt;a href="http://fox.wikis.com/wc.dll?Wiki~MarcLyon~People"&gt;&lt;strong&gt;&lt;font color=#3399ff&gt;Marc
Lyon&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;'s efforts. He&amp;nbsp;provided me early feedback and testing
for this class library. His enthusiasm for this project was also one of the driving
forces behind my completing it as fast as I did.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana size=2&gt;I
also want to thank my client (you know who you are) who has been kind enough to allow
me to share this work with the VFP Community. You're about as generous and kind as
they come.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana size=2&gt;&lt;strong&gt;What's
Next&lt;br&gt;
&lt;/strong&gt;Just have fun with Virtual Earth in VFP and see if virtualearth.vcx is useful
to you and your applications. In a perfect world, you'd report back to me with any
bugs you find, create some&amp;nbsp;examples of your own and blog about them,&amp;nbsp;or
seek to improve&amp;nbsp;the library&amp;nbsp;in some way. If you do improve virtualearth.vcx,
I'd appreciate it if you would contact me and share the improvements you've implemented.
Thank you in advanced to those of you that decide to&amp;nbsp;follow any of the above
suggestions.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana size=2&gt;Until
next time... Visual FoxPro Rocks!&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana size=2&gt;&lt;a href="http://www.sweetpotatosoftware.com/files/VirtualEarth.zip"&gt;Download
VirtualEarth.vcx and Sample (approx. 222 KB)&lt;/a&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana size=2&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/font&gt;&lt;/span&gt;&gt;&gt;&lt;img src="http://www.sweetpotatosoftware.com/SPSBlog/content/binary/virtualearth1.jpg" border=0&gt;&gt;
&lt;p&gt;
&lt;strong&gt;Figure 1:&lt;/strong&gt; A sample form provided in the download. It gives developers
a starting point when beginning to work with the virtualearth.vcx.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=aeeb57dc-dab4-41d0-9748-5ef40a39757c" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.sweetpotatosoftware.com"&gt;SweetPotato
Software, Inc.&lt;/a&gt;</description>
      <comments>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,aeeb57dc-dab4-41d0-9748-5ef40a39757c.aspx</comments>
      <category>Information Technology</category>
      <category>Visual Foxpro</category>
    </item>
    <item>
      <trackback:ping>http://www.sweetpotatosoftware.com/spsblog/Trackback.aspx?guid=d6d71562-1655-4518-9341-527932970583</trackback:ping>
      <pingback:server>http://www.sweetpotatosoftware.com/spsblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,d6d71562-1655-4518-9341-527932970583.aspx</pingback:target>
      <dc:creator>Craig Boyd</dc:creator>
      <wfw:comment>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,d6d71562-1655-4518-9341-527932970583.aspx</wfw:comment>
      <wfw:commentRss>http://www.sweetpotatosoftware.com/spsblog/SyndicationService.asmx/GetEntryCommentsRss?guid=d6d71562-1655-4518-9341-527932970583</wfw:commentRss>
      <slash:comments>12</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <strong>The Visual FoxPro Grid Control<br /></strong>I've often been heard to say that Visual FoxPro's grid is one of the greatest
controls ever devised. I still feel that way, but wouldn't it be nice if some of the
functionality that our customers want implemented in the grid came stock? You know, features
like: sorting, filtering, incremental search, saving user preferences, and exporting
to Excel. It'd be even cooler if this type of functionality could be implemented on
any Visual FoxPro grid (regardless of the recordsource) by simply dropping a class
on a form, setting a single property and writing a single line of code. Well, that's
what I have set out to create with the class I present in this blog entry.
</p>
        <p>
          <strong>First Shown at Southwest Fox 2008<br /></strong>At <a href="http://www.swfox.net/home.aspx"><strong><font color="#3399ff">Southwest
Fox 2008</font></strong></a>, I presented a session entitled "Creating a Professional
VFP Application from Start to Finish" in which I showed an earlier version of GridExtras.
I've improved on it since then, so if you attended Southwest Fox 2008 you may want
to get the control and sample from here rather than the session download. For those
of you that didn't attend Southwest Fox 2008 (you should have - it was a blast!),
you can see the basic functionality provided by GridExtras in the screenshots provided
at the bottom of this blog entry.
</p>
        <p>
          <strong>How to Use the Class<br /></strong>I've provided a sample.exe application in the download so you can try it
out and see how it's implemented. However, the basic steps are:
</p>
        <ul>
          <li>
Drop an instance of the gridextras onto your form or container (one gridextras for
each grid you want to enhance). 
</li>
          <li>
Set the GridExtras' GridExpression property to a string that will evaluate at runtime
to the grid you are enhancing - "Thisform.Grid1" is the default value for this property. 
</li>
          <li>
Call the GridExtras' Setup() method whenever your grid is ready to go. I have no way
of knowing if you are setting the recordsource at runtime, or whether you are adding
columns in code, so this method is provided as a way for you to control when GridExtras
will begin interacting with the grid.</li>
        </ul>
        <p>
That's all there is to getting GridExtras up and running for a grid in your application.
As I say, I've included a sample in the download, so if you have any questions about
how this is done just review the sample or you can post a comment here on my blog
and I'll do my best to answer it.
</p>
        <p>
          <strong>Other Properties of Note<br /></strong>There are a few other GridExtras properties you may want to take note of
and use, such as:
</p>
        <ul>
          <li>
CompanyName and ProductName - these properties are used to determine where to save
the user's grid preferences file which is profile isolated (C:\Users\Craig\AppData\Roaming\MyCompany\MyProduct\gridprefs.tmp
on Vista or  C:\Documents and Settings\Craig\Application Data\MyCompany\MyProduct\gridprefs.tmp
on Windows XP) 
</li>
          <li>
AllowGridExport, AllowGridFilter, AllowGridPreferences, AllowGridSort - these properties
allow you to turn certain features of the class off or on depending on your needs. 
</li>
          <li>
TemplateTable - this property determines where GridExtras looks for the gridextras.dbf
which is used to save the grid templates the user creates (user can save their filters
and sorts to be able to easily recreate them at a later time). This property may need
to be set if you plan to keep the gridextras table out on a network path such as with
the shared database folder for your application.</li>
        </ul>
        <p>
          <strong>What's Next<br /></strong>Just have fun with GridExtras and see if it's useful to you and your applications.
In a perfect world, you'd find some way to improve it (add additional export formats,
provide a column lock feature, etc.). If you do improve GridExtras, I'd
appreciate it if you would contact me and share the improvements you've implemented.
Thank you in advanced to those of you that decide to do so.
</p>
        <p>
Until next time... Visual FoxPro Rocks!
</p>
        <p>
          <a href="http://www.sweetpotatosoftware.com/files/GridExtras.zip">Download GridExtras
and Sample (approx. 170 KB)</a>
        </p>
        <p>
          <img src="http://www.sweetpotatosoftware.com/SPSBlog/content/binary/gridextras11.png" border="0" />
        </p>
        <p>
          <strong>Figure 1:</strong> GridExtras provides sorting, incremental search, and filtering
capabilities to any Visual FoxPro grid.
</p>
        <p>
 
</p>
        <p>
          <img src="http://www.sweetpotatosoftware.com/SPSBlog/content/binary/gridextras21.png" border="0" />
        </p>
        <p>
          <strong>Figure 2:</strong> GridExtras has additional features such as the ability
to go semi-transparent and the ability to save the user's preferences (column order
and width).
</p>
        <p>
 
</p>
        <p>
          <img src="http://www.sweetpotatosoftware.com/SPSBlog/content/binary/gridextras31.png" border="0" />
        </p>
        <p>
          <strong>Figure 3:</strong> In addition to the features provided by GridExtras through
a grid's column headers, there is also an icon added to the bottom right of the grid
that allows the user to access the "Grid Templates and Export" screen seen in Figure
4.
</p>
        <p>
 
</p>
        <p>
          <img src="http://www.sweetpotatosoftware.com/SPSBlog/content/binary/gridextras41.png" border="0" />
        </p>
        <p>
          <strong>Figure 4:</strong> The grid templates help the user save grid views so they
can recreate them quickly in the future. The export feature of GridExtras can create
XLS, XLSX, XLB, and XLM Excel formats. The grid's header captions are used to name
the Excel columns when data is exported.
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=d6d71562-1655-4518-9341-527932970583" />
        <br />
        <hr />
This weblog is sponsored by <a href="http://www.sweetpotatosoftware.com">SweetPotato
Software, Inc.</a></body>
      <title>Visual FoxPro Grid Enhancements</title>
      <guid isPermaLink="false">http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,d6d71562-1655-4518-9341-527932970583.aspx</guid>
      <link>http://www.sweetpotatosoftware.com/spsblog/2008/11/25/VisualFoxProGridEnhancements.aspx</link>
      <pubDate>Tue, 25 Nov 2008 00:00:52 GMT</pubDate>
      <description>&lt;p&gt;
&lt;strong&gt;The Visual FoxPro Grid Control&lt;br&gt;
&lt;/strong&gt;I've often been heard to say that Visual FoxPro's grid is one of the greatest
controls ever devised. I still feel that way, but wouldn't it be nice if some of the
functionality that our customers want implemented in the grid came stock? You know,&amp;nbsp;features
like:&amp;nbsp;sorting, filtering, incremental search, saving user preferences, and exporting
to Excel. It'd be even cooler if this type of functionality could be implemented on
any Visual FoxPro grid (regardless of the recordsource) by simply dropping a class
on a form, setting a single property and writing a single line of code. Well, that's
what I have set out to create with the class I present in this blog entry.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;First Shown at Southwest Fox 2008&lt;br&gt;
&lt;/strong&gt;At &lt;a href="http://www.swfox.net/home.aspx"&gt;&lt;strong&gt;&lt;font color=#3399ff&gt;Southwest
Fox 2008&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;, I presented a session entitled "Creating a Professional
VFP Application from Start to Finish" in which I showed an earlier version of GridExtras.
I've improved on it since then, so if you attended Southwest Fox 2008 you may want
to get the control and sample from here rather than the session download. For those
of you that didn't attend Southwest Fox 2008 (you should have - it was a blast!),
you can see the basic functionality provided by GridExtras in the screenshots provided
at the bottom of this blog entry.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;How to Use the Class&lt;br&gt;
&lt;/strong&gt;I've provided a sample.exe application in the download so you can try it
out and see how it's implemented. However, the basic steps are:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Drop an instance of the gridextras onto your form or container (one gridextras for
each grid you want to enhance). 
&lt;li&gt;
Set the GridExtras' GridExpression property to a string that will evaluate at runtime
to the grid you are enhancing - "Thisform.Grid1" is the default value for this property. 
&lt;li&gt;
Call the GridExtras' Setup() method whenever your grid is ready to go. I have no way
of knowing if you are setting the recordsource at runtime, or whether you are adding
columns in code, so this method is provided as a way for you to control when GridExtras
will begin interacting with the grid.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
That's all there is to getting GridExtras up and running for a grid in your application.
As I say, I've included a sample in the download, so if you have any questions about
how this is done just review the sample or you can post a comment here on my blog
and I'll do my best to answer it.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Other Properties of Note&lt;br&gt;
&lt;/strong&gt;There are a few other GridExtras properties you may want to take note of
and use, such as:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
CompanyName and ProductName - these properties are used to determine where to save
the user's grid preferences file which is profile isolated (C:\Users\Craig\AppData\Roaming\MyCompany\MyProduct\gridprefs.tmp
on Vista or&amp;nbsp;&amp;nbsp;C:\Documents and Settings\Craig\Application Data\MyCompany\MyProduct\gridprefs.tmp
on Windows XP) 
&lt;li&gt;
AllowGridExport, AllowGridFilter, AllowGridPreferences, AllowGridSort - these properties
allow you to turn certain features of the class off or on depending on your needs. 
&lt;li&gt;
TemplateTable - this property determines where GridExtras looks for the gridextras.dbf
which is used to save the grid templates the user creates (user can save their filters
and sorts to be able to easily recreate them at a later time). This property may need
to be set if you plan to keep the gridextras table out on a network path such as with
the shared database folder for your application.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;What's Next&lt;br&gt;
&lt;/strong&gt;Just have fun with GridExtras and see if it's useful to you and your applications.
In a perfect world, you'd find some way to improve it (add additional export&amp;nbsp;formats,
provide a column lock feature,&amp;nbsp;etc.). If you do&amp;nbsp;improve GridExtras, I'd
appreciate it if you would contact me and share the improvements you've implemented.
Thank you in advanced to those of you that decide to do so.
&lt;/p&gt;
&lt;p&gt;
Until next time... Visual FoxPro Rocks!
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.sweetpotatosoftware.com/files/GridExtras.zip"&gt;Download GridExtras
and Sample (approx. 170 KB)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.sweetpotatosoftware.com/SPSBlog/content/binary/gridextras11.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Figure 1:&lt;/strong&gt; GridExtras provides sorting, incremental search, and filtering
capabilities to any Visual FoxPro grid.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.sweetpotatosoftware.com/SPSBlog/content/binary/gridextras21.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Figure 2:&lt;/strong&gt; GridExtras has additional features such as the ability
to go semi-transparent and the ability to save the user's preferences (column order
and width).
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.sweetpotatosoftware.com/SPSBlog/content/binary/gridextras31.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Figure 3:&lt;/strong&gt; In addition to the features provided by GridExtras through
a grid's column headers, there is also an icon added to the bottom right of the grid
that allows the user to access the "Grid Templates and Export" screen seen in Figure
4.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.sweetpotatosoftware.com/SPSBlog/content/binary/gridextras41.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Figure 4:&lt;/strong&gt; The grid templates help the user save grid views so they
can recreate them quickly in the future. The export feature of GridExtras can create
XLS, XLSX, XLB, and XLM Excel formats. The grid's header captions are used to name
the Excel columns when data is exported.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=d6d71562-1655-4518-9341-527932970583" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.sweetpotatosoftware.com"&gt;SweetPotato
Software, Inc.&lt;/a&gt;</description>
      <comments>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,d6d71562-1655-4518-9341-527932970583.aspx</comments>
      <category>Information Technology</category>
      <category>Visual Foxpro</category>
    </item>
    <item>
      <trackback:ping>http://www.sweetpotatosoftware.com/spsblog/Trackback.aspx?guid=5f96efd7-f350-4bc8-86c5-caffd9e833eb</trackback:ping>
      <pingback:server>http://www.sweetpotatosoftware.com/spsblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,5f96efd7-f350-4bc8-86c5-caffd9e833eb.aspx</pingback:target>
      <dc:creator>Craig Boyd</dc:creator>
      <wfw:comment>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,5f96efd7-f350-4bc8-86c5-caffd9e833eb.aspx</wfw:comment>
      <wfw:commentRss>http://www.sweetpotatosoftware.com/spsblog/SyndicationService.asmx/GetEntryCommentsRss?guid=5f96efd7-f350-4bc8-86c5-caffd9e833eb</wfw:commentRss>
      <slash:comments>8</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <strong>What is JSON?<br /></strong>If you are unfamiliar with JSON, you can dig into the particulars about it <a href="http://www.json.org/">here</a> and <a href="http://en.wikipedia.org/wiki/JSON">here</a>.
The short explanation is that JSON provides a format for serializing and deserializing
variables, arrays, and class instances. For those of you that may not know what serializing
and deserializing are, think of <strong>serializing</strong> as turning a cursor into
XML and then think of <strong>deserializing</strong> as turning XML back into a cursor.
Basically the process of turning an instance of MySomething into a string and
then turning that string back into an instance of the same MySomething.
</p>
        <p>
Now, besides the obvious advantages of being able to serialize and deserialize VFP
values and objects (persisting them on disk or passing them across the wire, just
to name a couple), it becomes really useful when you find that you have to interact
with Javascript from your Visual FoxPro application. I ran into this while working
with <a href="http://dev.live.com/virtualearth/sdk/">Virtual Earth</a> in a webbrowser
control (more on that in an upcoming blog entry). I wanted to use JSON as part of
my solution because it would allow me to easily move values, instances, and data back
and forth between Visual FoxPro and the Javascript that was running inside a page
being displayed in the webbrowser control. I could have done without it, but it's
a lot more slick when using JSON.
</p>
        <p>
          <strong>JSON for VFP</strong>
          <br />
If you visited the first "<a href="http://www.json.org/">here</a>" in my first paragraph
in the section above you may have noted that they have a rather impressive
list of languages that provide support, in some manner, for JSON at the bottom of
the page. You may have also noted that Visual FoxPro was absent from that list. Now,
that doesn't mean that no one has ever done this sort of thing before. In fact, Rick
Strahl provides VFP/JSON support through his <a href="http://www.west-wind.com/webconnection/wwClient_docs/_1wu18owba.htm">wwJSONSerializer</a> class
and FoxWeb provides similar functionality through it's <a href="http://www.foxweb.com/document/index.htm?page=/document/fwJSONObject.htm">fwJSON</a> object.
And, here in this blog entry, I'm going to provide you with another class that provides
JSON support. So, hopefully someday we can get this class and the others listed
on the json.org site (anyone know who to call or write to?).
</p>
        <p>
          <strong>Why Another JSON Class?<br /></strong>So, if Rick and FoxWeb already provide classes, it begs the question, "Why
did I decide to write one too?". Well...
</p>
        <ul>
          <li>
When I started working on this I didn't know that Rick even provided such a class
in web connect. As for FoxWeb, I've never used it, so I don't know what their object
does. Heck, for all I know there are other classes out there besides these two. If
you know of any others, please feel free to comment on this blog entry with a link. 
</li>
          <li>
My JSON class provides additional support for some things when compared to the functionality
of wwJSONSerializer: 
<ul><li>
Multi-dimensional array support 
</li><li>
Replacer support on stringify 
</li><li>
Reviver support on parse 
</li><li>
Beautification/indetation support 
</li><li>
Performance enhancements via FLL 
</li><li>
A few other things, but those are the main ones</li></ul></li>
          <li>
The implementation of my JSON class is patterned after <a href="http://www.json.org/json2.js">json2.js</a> (by <a href="http://en.wikipedia.org/wiki/Douglas_Crockford">Douglas
Crockford</a>), which means: 
<ul><li>
The main methods are Stringify() and Parse() 
</li><li>
It supports datetimes in ISO8601 format (other formats available) 
</li><li>
Provides the same default escaping of characters (other modes available).</li></ul></li>
          <li>
Because I wanted to try my hand at this?</li>
        </ul>
        <p>
There's no better way that I know of to learn something than to write a wrapper or
even a class that directly interacts with another library or API. So, I wrote a top-notch
JSON class library. I am using it in a production project at this end (my customer
was kind enough to give me permission to share it) and I am blogging about it in the
hopes some of you may find it useful.
</p>
        <p>
          <strong>How to Use the JSON Class<br /></strong>In the class, I have provided lots of comments in the code to help document
this thing. Also, provided in the download is a jsontests.prg that provides some sample
use code you can look at to get started. For the sake of blog brevity... in order
to serialize a Visual FoxPro object to JSON you'd do the following:
</p>
        <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
          <p>
            <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">m.loJSON <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> CREATEOBJECT(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"JSON"</span>)<br />
SET CLASSLIB TO (LOCFILE(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"JSON.VCX"</span>, <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"VCX"</span>, <span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Locate
JSON Class Library"</span>)) additive<br />
m.loObjectIn <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> CREATEOBJECT(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Custom"</span><br />
m.lcObjectJSON <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> m.loJSON.Stringify(m.loObjectIn, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>,
CHR(9))<br />
?m.lcObjectJSON<br /></span>
          </p>
        </span>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <font face="Verdana" size="2">...and
then to deserialize that JSON string you'd do this:</font>
          </span>
        </p>
        <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
          <font face="Verdana" size="2">
            <p>
              <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">m.loObjectOut <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> m.loJSON.Parse(m.lcObjectJSON)<br />
?m.loObjectOut.Class</span>
            </p>
          </font>
        </span>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <font face="Verdana" size="2">As
I say, the code is heavily commented (so check it out) and I'll be doing a blog entry
in the near future regarding a Virtual Earth class library I've written for VFP that
shows some real world uses for JSON within VFP.</font>
          </span>
        </p>
        <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
          <p>
            <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
              <font face="Verdana" size="2">
                <strong>Special
Thank You<br /></strong>I sincerely appreciate the efforts of those of you that have already
been providing valuable feedback, such as <a href="http://stevenblack.com/">Steven
Black</a> and <a href="http://fox.wikis.com/wc.dll?Wiki~MarcLyon~People">Marc Lyon</a>.
Also, <a href="http://www.west-wind.com/Weblog/">Rick Strahl</a>, who provided help
and sage advice to me via <a href="https://twitter.com/craigboyd">Twitter</a> as I
worked through the particulars of this class. It's always nice to have someone advising
you who has already "been there, done that".</font>
            </span>
          </p>
        </span>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <font face="Verdana" size="2">
              <strong>What's
Next<br /></strong>I'm hopeful that those of you that download this class will take the time
to provide me feedback and any suggestions you may have for further improving it.</font>
          </span>
        </p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <font face="Verdana" size="2">Until
next time... Visual FoxPro Rocks!</font>
          </span>
        </p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <font face="Verdana" size="2">
              <a href="http://www.sweetpotatosoftware.com/files/JSON.zip">Download
the JSON class library (approx. 52 KB)</a>
            </font>
          </span>
        </p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <font face="Verdana" size="2">The
download contains the JSON class in both VCX and PRG format. Use whichever one you
are more comfortable with (they are the same).<br /></font>
          </span>
        </p>
        <img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=5f96efd7-f350-4bc8-86c5-caffd9e833eb" />
        <br />
        <hr />
This weblog is sponsored by <a href="http://www.sweetpotatosoftware.com">SweetPotato
Software, Inc.</a></body>
      <title>JSON for Visual FoxPro</title>
      <guid isPermaLink="false">http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,5f96efd7-f350-4bc8-86c5-caffd9e833eb.aspx</guid>
      <link>http://www.sweetpotatosoftware.com/spsblog/2008/11/24/JSONForVisualFoxPro.aspx</link>
      <pubDate>Mon, 24 Nov 2008 12:38:28 GMT</pubDate>
      <description>&lt;p&gt;
&lt;strong&gt;What is JSON?&lt;br&gt;
&lt;/strong&gt;If you are unfamiliar with JSON, you can dig into the particulars about it&amp;nbsp;&lt;a href="http://www.json.org/"&gt;here&lt;/a&gt;&amp;nbsp;and &lt;a href="http://en.wikipedia.org/wiki/JSON"&gt;here&lt;/a&gt;.
The short explanation is that JSON provides a format for serializing and deserializing
variables, arrays, and class instances. For those of you that may not know what serializing
and deserializing are, think of &lt;strong&gt;serializing&lt;/strong&gt; as turning a cursor into
XML and then think of &lt;strong&gt;deserializing&lt;/strong&gt; as turning XML back into a cursor.
Basically the process of turning an instance of&amp;nbsp;MySomething into a string and
then turning that string back into&amp;nbsp;an instance of the same MySomething.
&lt;/p&gt;
&lt;p&gt;
Now, besides the obvious advantages of being able to serialize and deserialize VFP
values and objects (persisting them on disk or passing them across the wire, just
to name a couple), it becomes really useful when you find that you have to interact
with Javascript from your Visual FoxPro application. I ran into this while working
with &lt;a href="http://dev.live.com/virtualearth/sdk/"&gt;Virtual Earth&lt;/a&gt; in a webbrowser
control (more on that in an upcoming blog entry). I wanted to use JSON as part of
my solution because it would allow me to easily move values, instances, and data back
and forth between Visual FoxPro and the Javascript that was running inside a page
being displayed in the webbrowser control. I could have done without it, but it's
a lot more slick when using JSON.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;JSON for VFP&lt;/strong&gt;
&lt;br&gt;
If you visited the first "&lt;a href="http://www.json.org/"&gt;here&lt;/a&gt;" in my first paragraph
in the section above you may have noted&amp;nbsp;that they have a&amp;nbsp;rather impressive
list of languages that provide support, in some manner, for JSON at the bottom of
the page. You may have also noted that Visual FoxPro was absent from that list. Now,
that doesn't mean that no one has ever done this sort of thing before. In fact, Rick
Strahl provides VFP/JSON support through his &lt;a href="http://www.west-wind.com/webconnection/wwClient_docs/_1wu18owba.htm"&gt;wwJSONSerializer&lt;/a&gt;&amp;nbsp;class
and FoxWeb provides similar functionality through it's &lt;a href="http://www.foxweb.com/document/index.htm?page=/document/fwJSONObject.htm"&gt;fwJSON&lt;/a&gt; object.
And, here in this blog entry, I'm going to provide you with another class that provides
JSON support. So, hopefully someday we can get this class and&amp;nbsp;the others&amp;nbsp;listed
on the json.org site (anyone know who to call or write to?).
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Why Another JSON Class?&lt;br&gt;
&lt;/strong&gt;So, if Rick and FoxWeb already provide classes, it begs the question, "Why
did I decide to write one too?". Well...
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
When I started working on this I didn't know that Rick even provided such a class
in web connect. As for FoxWeb, I've never used it, so I don't know what their object
does. Heck, for all I know there are other classes out there besides these two. If
you know of any others, please feel free to comment on this blog entry with a link. 
&lt;li&gt;
My JSON class provides additional support for some things when compared to the functionality
of wwJSONSerializer: 
&lt;ul&gt;
&lt;li&gt;
Multi-dimensional array support 
&lt;li&gt;
Replacer support on stringify 
&lt;li&gt;
Reviver support on parse 
&lt;li&gt;
Beautification/indetation support 
&lt;li&gt;
Performance enhancements via FLL 
&lt;li&gt;
A few other things, but those are the main ones&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
The implementation of my JSON class is patterned after &lt;a href="http://www.json.org/json2.js"&gt;json2.js&lt;/a&gt; (by &lt;a href="http://en.wikipedia.org/wiki/Douglas_Crockford"&gt;Douglas
Crockford&lt;/a&gt;), which means: 
&lt;ul&gt;
&lt;li&gt;
The main methods are Stringify() and Parse() 
&lt;li&gt;
It supports datetimes in ISO8601 format (other formats available) 
&lt;li&gt;
Provides the same default escaping of characters (other modes available).&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
Because I wanted to try my hand at this?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
There's no better way that I know of to learn something than to write a wrapper or
even a class that directly interacts with another library or API. So, I wrote a top-notch
JSON class library. I am using it in a production project at this end (my customer
was kind enough to give me permission to share it) and I am blogging about it in the
hopes some of you may find it useful.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;How to Use the JSON Class&lt;br&gt;
&lt;/strong&gt;In the class, I have provided lots of comments in the code to help document
this thing. Also, provided in the download is a jsontests.prg that provides some sample
use code you can look at to get started. For the sake of blog brevity... in order
to serialize a Visual FoxPro object to JSON you'd do the following:
&lt;/p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt; 
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;m.loJSON &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; CREATEOBJECT(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"JSON"&lt;/span&gt;)&lt;br&gt;
SET CLASSLIB TO (LOCFILE(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"JSON.VCX"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"VCX"&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Locate
JSON Class Library"&lt;/span&gt;)) additive&lt;br&gt;
m.loObjectIn &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; CREATEOBJECT(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Custom"&lt;/span&gt;
&lt;br&gt;
m.lcObjectJSON &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; m.loJSON.Stringify(m.loObjectIn, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;,
CHR(9))&lt;br&gt;
?m.lcObjectJSON&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;/span&gt; 
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana size=2&gt;...and
then to deserialize that JSON string you'd do this:&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana size=2&gt; 
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;m.loObjectOut &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; m.loJSON.Parse(m.lcObjectJSON)&lt;br&gt;
?m.loObjectOut.Class&lt;/span&gt;
&lt;/p&gt;
&lt;/font&gt;&lt;/span&gt; 
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana size=2&gt;As
I say, the code is heavily commented (so check it out) and I'll be doing a blog entry
in the near future regarding a Virtual Earth class library I've written for VFP that
shows some real world uses for JSON within VFP.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt; 
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana size=2&gt;&lt;strong&gt;Special
Thank You&lt;br&gt;
&lt;/strong&gt;I sincerely appreciate the efforts of those of you that&amp;nbsp;have already
been providing valuable feedback,&amp;nbsp;such as &lt;a href="http://stevenblack.com/"&gt;Steven
Black&lt;/a&gt; and &lt;a href="http://fox.wikis.com/wc.dll?Wiki~MarcLyon~People"&gt;Marc Lyon&lt;/a&gt;.
Also, &lt;a href="http://www.west-wind.com/Weblog/"&gt;Rick Strahl&lt;/a&gt;, who provided help
and sage advice to me via &lt;a href="https://twitter.com/craigboyd"&gt;Twitter&lt;/a&gt; as I
worked through the particulars of this class. It's always nice to have someone advising
you who has already "been there, done that".&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/span&gt; 
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana size=2&gt;&lt;strong&gt;What's
Next&lt;br&gt;
&lt;/strong&gt;I'm hopeful that those of you that download this class will take the time
to provide me feedback and any suggestions you may have for further improving it.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana size=2&gt;Until
next time... Visual FoxPro Rocks!&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana size=2&gt;&lt;a href="http://www.sweetpotatosoftware.com/files/JSON.zip"&gt;Download
the JSON class library (approx. 52 KB)&lt;/a&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font face=Verdana size=2&gt;The
download contains the JSON class in both VCX and PRG format. Use whichever one you
are more comfortable with (they are the same).&lt;br&gt;
&lt;/p&gt;
&gt;&gt;&lt;img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=5f96efd7-f350-4bc8-86c5-caffd9e833eb" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.sweetpotatosoftware.com"&gt;SweetPotato
Software, Inc.&lt;/a&gt;</description>
      <comments>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,5f96efd7-f350-4bc8-86c5-caffd9e833eb.aspx</comments>
      <category>Information Technology</category>
      <category>Visual Foxpro</category>
    </item>
    <item>
      <trackback:ping>http://www.sweetpotatosoftware.com/spsblog/Trackback.aspx?guid=58979f42-99c9-4038-82fc-59b6516a71ea</trackback:ping>
      <pingback:server>http://www.sweetpotatosoftware.com/spsblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,58979f42-99c9-4038-82fc-59b6516a71ea.aspx</pingback:target>
      <dc:creator>Craig Boyd</dc:creator>
      <wfw:comment>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,58979f42-99c9-4038-82fc-59b6516a71ea.aspx</wfw:comment>
      <wfw:commentRss>http://www.sweetpotatosoftware.com/spsblog/SyndicationService.asmx/GetEntryCommentsRss?guid=58979f42-99c9-4038-82fc-59b6516a71ea</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <strong>Same Old, Same Old<br /></strong>Far too often developers will either not implement error handling in their
applications (allowing VFP's default error handler to prevail) or they will
display a simple messagebox containing a few pieces of error information such as the
values returned from Visual FoxPro's Error(), Message() and Lineno() functions. In
either case, this type of error handling is usually woefully inadequate. Not only are
these approaches of little use to the user, it is probably disconcerting (if
not a little frightening) to them. The possible end result of these approaches: bugs
go unreported, error information is not captured, and the user's overall confidence
in the application is shaken.
</p>
        <p>
          <strong>A Possible Approach to Error Handling<br /></strong>At <a href="http://www.swfox.net/home.aspx">Southwest Fox 2008</a>, I presented
a session entitled "Creating a Professional VFP Application from Start to Finish"
in which I showed the error handler that I use in a number of applications I have
developed. That error handler is presented here as one possible approach you can take when
implementing error handling in your Visual FoxPro applications. There is sure
to be room for improvement, but the state informaiton it gathers is pretty extensive and
I've found that most users find the error screen (see screen shots below) to
be non-threatening/reassuring when exceptions arise.
</p>
        <p>
          <strong>How to Use the Error Handler<br /></strong>In order to implement the error handler in your own applications, you'll
need the functions and the ON ERROR command that are in the main.prg of the sample
application (provided in the download below). You'll also want to include the issues.scx
form in your project and set the MyCompany, MyProduct, MyTechEmailAddress, and
MyTechPhoneNumber properties of the issues form with your information. That's about
all there is to it. I have included an FLL with the sample, but this is merely used
to facilitate the transmittal of the error information via email. If you implement
another method of transmission (such as a post to a <a href="http://www.west-wind.com/webconnection/">Web
Connection</a> web application), then you needn't include the FLL.
</p>
        <p>
To try the error handler out you can download the sample below and, after setting
the issues form properties as noted above, simply build the project provided and run
the executeable you've built. A form is provided that allows you to submit an issue
manually as a customer would and also to throw an error to see how the error handler
works in an exception situation.
</p>
        <p>
          <strong>Due Credit<br /></strong>Most of the code that you'll find in the main.prg for collecting error information
came from the book "<font face="Courier New"><font face="Verdana"><a href="http://docs.rinet.ru/GlyadiLisu/ch23/ch23.htm">Special
Edition Using Visual FoxPro 6</a>". And, the code that is used to terminate the process
after the exception has occured is from work done by <a href="http://doughennig.blogspot.com/">Doug
Hennig</a>. So, special thanks to those two sources.</font></font></p>
        <p>
          <strong>What's Next<br /></strong>Just have fun with the error handler and see if it's useful to you and your
applications. In a perfect world, you'd find some way to improve it (add screenshot
ability, refactor the code, etc.). If you do improve the error handler, I'd appreciate
it if you would contact me and share the improvements you've implemented. Thank you
in advanced to those of you that decide to do so.
</p>
        <p>
Until next time... Visual FoxPro Rocks!
</p>
        <p>
          <a href="http://www.sweetpotatosoftware.com/files/errorhandler.zip">Download Error
Handling Sample (approx. 41 KB)</a>
        </p>
        <p>
          <img src="http://www.sweetpotatosoftware.com/SPSBlog/content/binary/errorhandler1.png" border="0" />
        </p>
        <p>
          <strong>Figure 1:</strong> The screen the user sees when an exception occurs.
</p>
        <p>
 
</p>
        <p>
          <img src="http://www.sweetpotatosoftware.com/SPSBlog/content/binary/errorhandler2.png" border="0" />
        </p>
        <p>
          <strong>Figure 2:</strong> Respecting the user's privacy, they are allowed to view
what the error report contains before it is sent.
</p>
        <p>
 
</p>
        <p>
          <img src="http://www.sweetpotatosoftware.com/SPSBlog/content/binary/errorhandler3.png" border="0" />
        </p>
        <p>
          <strong>Figure 3:</strong> The screen also allows the user to provide additional information
before submitting the error report.
</p>
        <img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=58979f42-99c9-4038-82fc-59b6516a71ea" />
        <br />
        <hr />
This weblog is sponsored by <a href="http://www.sweetpotatosoftware.com">SweetPotato
Software, Inc.</a></body>
      <title>Professional Error Handling for VFP Applications</title>
      <guid isPermaLink="false">http://www.sweetpotatosoftware.com/spsblog/PermaLink,guid,58979f42-99c9-4038-82fc-59b6516a71ea.aspx</guid>
      <link>http://www.sweetpotatosoftware.com/spsblog/2008/11/24/ProfessionalErrorHandlingForVFPApplications.aspx</link>
      <pubDate>Mon, 24 Nov 2008 11:07:36 GMT</pubDate>
      <description>&lt;p&gt;
&lt;strong&gt;Same Old, Same Old&lt;br&gt;
&lt;/strong&gt;Far too often developers will either not implement error handling in their
applications&amp;nbsp;(allowing VFP's default error handler to prevail)&amp;nbsp;or they will
display a simple messagebox containing a few pieces of error information such as the
values returned from Visual FoxPro's Error(), Message() and Lineno() functions. In
either case, this type of error handling is usually woefully inadequate. Not only&amp;nbsp;are
these approaches&amp;nbsp;of little use to the user, it is probably disconcerting (if
not a little frightening) to them. The possible end result of these approaches: bugs
go unreported, error information is not captured, and the user's overall confidence
in the application is shaken.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;A Possible Approach to Error Handling&lt;br&gt;
&lt;/strong&gt;At &lt;a href="http://www.swfox.net/home.aspx"&gt;Southwest Fox 2008&lt;/a&gt;, I presented
a session entitled "Creating a Professional VFP Application from Start to Finish"
in which I showed the error handler that I use in a number of applications I have
developed. That error handler is presented here as one possible approach you can take&amp;nbsp;when
implementing error handling in your Visual FoxPro applications.&amp;nbsp;There is sure
to be room for improvement, but the state informaiton it gathers is pretty extensive&amp;nbsp;and
I've found that most users find the error screen (see screen shots below)&amp;nbsp;to
be non-threatening/reassuring when exceptions arise.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;How to Use the Error Handler&lt;br&gt;
&lt;/strong&gt;In order to implement the error handler in your own applications, you'll
need the functions and the ON ERROR command that&amp;nbsp;are in the main.prg of the sample
application (provided in the download below). You'll also want to include the issues.scx
form&amp;nbsp;in your project and set the MyCompany, MyProduct, MyTechEmailAddress, and
MyTechPhoneNumber properties of the issues form with your information. That's about
all there is to it. I have included an FLL with the sample, but this is merely used
to facilitate the transmittal of the error information via email. If you implement
another method of transmission (such as a post to a &lt;a href="http://www.west-wind.com/webconnection/"&gt;Web
Connection&lt;/a&gt; web application), then you needn't include the FLL.
&lt;/p&gt;
&lt;p&gt;
To try the error handler out you can download the sample below and, after setting
the issues form properties as noted above, simply build the project provided and run
the executeable you've built. A form is provided that allows you to submit an issue
manually as a customer would and also to throw an error to see how the error handler
works in an exception situation.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Due Credit&lt;br&gt;
&lt;/strong&gt;Most of the code that you'll find in the main.prg for collecting error information
came from&amp;nbsp;the book "&lt;font face="Courier New"&gt;&lt;font face=Verdana&gt;&lt;a href="http://docs.rinet.ru/GlyadiLisu/ch23/ch23.htm"&gt;Special
Edition Using Visual FoxPro 6&lt;/a&gt;". And, the code that is used to terminate the process
after the exception has occured is from work done by &lt;a href="http://doughennig.blogspot.com/"&gt;Doug
Hennig&lt;/a&gt;. So, special thanks to those two sources.&lt;/font&gt;
&lt;/p&gt;
&gt; 
&lt;p&gt;
&lt;strong&gt;What's Next&lt;br&gt;
&lt;/strong&gt;Just have fun with the error handler and see if it's useful to you and your
applications. In a perfect world, you'd find some way to improve it (add screenshot
ability, refactor the code, etc.). If you do&amp;nbsp;improve the error handler, I'd appreciate
it if you would contact me and share the improvements you've implemented. Thank you
in advanced to those of you that decide to do so.
&lt;/p&gt;
&lt;p&gt;
Until next time... Visual FoxPro Rocks!
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.sweetpotatosoftware.com/files/errorhandler.zip"&gt;Download Error
Handling Sample (approx.&amp;nbsp;41 KB)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.sweetpotatosoftware.com/SPSBlog/content/binary/errorhandler1.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Figure 1:&lt;/strong&gt; The screen the user sees when an exception occurs.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.sweetpotatosoftware.com/SPSBlog/content/binary/errorhandler2.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Figure 2:&lt;/strong&gt; Respecting the user's privacy, they are allowed to view
what the error report contains before it is sent.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.sweetpotatosoftware.com/SPSBlog/content/binary/errorhandler3.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Figure 3:&lt;/strong&gt; The screen also allows the user to provide additional information
before submitting the error report.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.sweetpotatosoftware.com/spsblog/aggbug.ashx?id=58979f42-99c9-4038-82fc-59b6516a71ea" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.sweetpotatosoftware.com"&gt;SweetPotato
Software, Inc.&lt;/a&gt;</description>
      <comments>http://www.sweetpotatosoftware.com/spsblog/CommentView,guid,58979f42-99c9-4038-82fc-59b6516a71ea.aspx</comments>
      <category>Information Technology</category>
      <category>Visual Foxpro</category>
    </item>
  </channel>
</rss>