Advertisement
Guest User

VFP HTTP

a guest
Apr 16th, 2016
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. DEFINE CLASS SocketWrapper As Custom
  2.   * Based on Anatoliy Mogylevets SMTP code at http://fox.wikis.com/wc.dll?Wiki~SendSmtpEmail
  3.   #DEFINE SMTP_PORT    25
  4.   #DEFINE http_PORT    80
  5.   #DEFINE AF_INET       2
  6.   #DEFINE SOCK_STREAM   1
  7.   #DEFINE IPPROTO_TCP   6
  8.   #DEFINE SOCKET_ERROR -1
  9.   #DEFINE FD_READ       1
  10.  
  11.     host     = ""
  12.     IP       = ""
  13.     Port     = 80
  14.     hSocket  = 0
  15.     cIn      = ''
  16.     WaitForRead = 0
  17.  
  18.   PROCEDURE Init()
  19.     THIS.decl
  20.     IF WSAStartup(0x202, Repli(Chr(0),512)) <> 0
  21.     * unable to initialize Winsock on this computer
  22.         RETURN .F.
  23.     ENDIF
  24.     RETURN .T.
  25.   ENDPROC
  26.  
  27.   PROCEDURE Destroy
  28.     = WSACleanup()
  29.   ENDPROC
  30.  
  31.   PROCEDURE Host_Assign( vNewVal )
  32.     if empty(vNewVal)
  33.       THIS.IP = ''
  34.     else
  35.       THIS.IP = THIS.GetIP(vNewVal)
  36.     endif
  37.     if not empty(THIS.IP)
  38.       THIS.Host = vNewVal
  39.     else
  40.       THIS.Host = ''
  41.     endif
  42.   ENDPROC
  43.  
  44.   PROTECTED FUNCTION GetIP( pcHost )
  45.   #DEFINE HOSTENT_SIZE 16
  46.       LOCAL nStruct, nSize, cBuffer, nAddr, cIP
  47.       nStruct = gethostbyname(pcHost)
  48.       IF nStruct = 0
  49.           RETURN ""
  50.       ENDIF
  51.       cBuffer = Repli(Chr(0), HOSTENT_SIZE)
  52.       cIP = Repli(Chr(0), 4)
  53.       = CopyMemory(@cBuffer, nStruct, HOSTENT_SIZE)
  54.       = CopyMemory(@cIP, THIS.buf2dword(SUBS(cBuffer,13,4)),4)
  55.       = CopyMemory(@cIP, THIS.buf2dword(cIP),4)
  56.   RETURN inet_ntoa(THIS.buf2dword(cIP))
  57.   ENDFUNC
  58.  
  59.   PROTECTED FUNCTION Connect
  60.     LOCAL cBuffer, cPort, cHost, lResult
  61.     THIS.hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
  62.     IF THIS.hSocket = SOCKET_ERROR
  63.         RETURN .F.
  64.     ENDIF
  65.    
  66.     cPort = THIS.num2word(htons(THIS.Port))
  67.     nHost = inet_addr(THIS.IP)
  68.     cHost = THIS.num2dword(nHost)
  69.     cBuffer = THIS.num2word(AF_INET) + cPort + cHost + Repli(Chr(0),8)
  70.     lResult = (ws_connect(THIS.hSocket, @cBuffer, Len(cBuffer))=0)
  71.   RETURN lResult
  72.  
  73.   FUNCTION httpGet( pcServer, pcUrl )
  74.     LOCAL lResult
  75.     THIS.Host = pcServer
  76.     IF THIS.Connect()
  77.         THIS.snd("GET "+pcURL+" http/1.0"+crlf)
  78.         THIS.snd("Accept: */*"+crlf)
  79.         THIS.snd("Accept-Language: en-us"+crlf)
  80.         THIS.snd("Accept-Encoding: gzip, deflate"+crlf)
  81.         THIS.snd("User-Agent: Mozilla/4.0"+crlf)
  82.         THIS.snd("Host: "+pcServer+crlf)
  83.         THIS.snd("Pragma: no-cache"+crlf)
  84.         THIS.snd(crlf,.t.) && End of headers
  85.         *info=url encoded string
  86.         lResult = .T.
  87.     ELSE
  88.         lResult = .F.
  89.     ENDIF
  90.     THIS.Disconnect()
  91.   ENDFUNC
  92.  
  93.   FUNCTION httpPost( pcServer, pcUrl, pcData, poFdbk )
  94.     LOCAL lResult, lnLen, lnComplete, lcRemain, lcSnd
  95.     THIS.Host = pcServer
  96.     IF THIS.Connect()
  97.         THIS.snd("POST "+pcURL+" http/1.0"+crlf)
  98.         THIS.snd("Content-Type:application/x-www-form-urlencoded"+crlf)
  99.         THIS.snd("Accept: */*"+crlf)
  100.         THIS.snd("Accept-Language: en-us"+crlf)
  101.         THIS.snd("Accept-Encoding: gzip, deflate"+crlf)
  102.         THIS.snd("User-Agent: Mozilla/4.0"+crlf)
  103.         THIS.snd("Host: "+pcServer+crlf)
  104.         lnLen = len(pcData)
  105.         THIS.snd("Content-Length: "+tran(lnLen)+crlf)
  106.         THIS.snd("Pragma: no-cache"+crlf)
  107.         THIS.snd(crlf) && End of headers
  108.         * If we have a valid feedback object, provide feedback
  109.         if vartype(poFdbk)='O' and PEMStatus(poFdbk,'Feedback',5) ;
  110.            and upper(PEMStatus(poFdbk,'Feedback',3))='METHOD'
  111.           lcRemain   = pcData
  112.           lnComplete = 0
  113.           poFdbk.Feedback( 0 )
  114.           do while len(lcRemain)>0
  115.             lcSnd      = LEFT( lcRemain, 100 )
  116.             lcRemain   = SUBSTR( lcRemain, 101 )
  117.             THIS.snd(lcSnd)
  118.             lnComplete = lnComplete+len(lcSnd)
  119.             poFdbk.Feedback( lnComplete/lnLen*100 )
  120.           enddo
  121.           THIS.snd('',.t.) && get a response, too.
  122.         else && no feedback object, just send one big chunk.
  123.           THIS.snd(pcData,.t.) && get a response, too.
  124.         endif
  125.         lResult = .T.
  126.     ELSE
  127.         lResult = .F.
  128.     ENDIF
  129.     THIS.Disconnect()
  130.   ENDFUNC
  131.  
  132.   FUNCTION SendMail( pcSender, pcRecipient, pcSubject, pcBody )
  133.     LOCAL lResult
  134.     IF THIS.Connect()
  135.         THIS.snd("HELO", .T.)
  136.         THIS.snd("MAIL FROM:<" + pcSender + ">", .T.)
  137.         THIS.snd("RCPT TO:<" + pcRecipient + ">", .T.)
  138.         THIS.snd("DATA", .T.)
  139.         THIS.snd("From: " + pcSender)
  140.         THIS.snd("To: " + pcRecipient)
  141.         THIS.snd("Subject: " + pcSubject)
  142.         THIS.snd("")
  143.         THIS.snd(pcBody)
  144.         THIS.snd(".", .T.)
  145.         THIS.snd("QUIT", .T.)
  146.         lResult = .T.
  147.     ELSE
  148.         = MessageB("Unable to connect to [" + THIS.Host +;
  149.             "] on port " + LTRIM(STR(SMTP_PORT)) + ". ",;
  150.             48, " Connection error")
  151.         lResult = .F.
  152.     ENDIF
  153.     THIS.Disconnect()
  154.   RETURN lResult
  155.   ENDFUNC
  156.  
  157.   Function URLencode
  158.   LPARAMETER pcInStr
  159.   *  ' encode Percent signs
  160.   *  '        Double Quotes
  161.   *  '        CarriageReturn / LineFeeds
  162.  
  163.   LOCAL lcOut, lnI
  164.     * StrTran is WAY faster than building the string in memory
  165.     lcOut = StrTran(pcInStr, [%], '%25' )
  166.     lcOut = StrTran(lcOut,   [+], '%2B' )
  167.     lcOut = StrTran(lcOut,   [ ], '+'   )
  168.     for lnI = 0 to 31
  169.       lcOut = StrTran( lcOut, chr(lnI), '%' + Right( Transform(lnI,'@0'), 2 ) )
  170.     endfor
  171.     for lnI = 127 to 255
  172.       lcOut = StrTran( lcOut, chr(lnI), '%' + Right( Transform(lnI,'@0'), 2 ) )
  173.     endfor
  174.  
  175.     RETURN lcOut
  176.  
  177. *!*  LOCAL lcIn, lcOut, lnI, lnCh
  178. *!*        lcIn = StrTran(pcInStr, [%], '%25' )
  179. *!*        lcIn = StrTran(lcIn,    [+], '%2B' )
  180. *!*        lcIn = StrTran(lcIn,    [ ], '+'   )
  181. *!*        lcIn = StrTran(lcIn,    ["], '%22' )
  182. *!*        lcIn = StrTran(lcIn,    [,], '%2C' )
  183. *!*        lcIn = StrTran(lcIn,    ['], '%27' )
  184. *!*        lcIn = StrTran(lcIn,    [=], '%3D' )
  185. *!*        lcIn = StrTran(lcIn,    [&], '%26' )
  186. *!*        lcIn = StrTran(lcIn,    [`], '%60' )
  187. *!*        lcOut = ''
  188. *!*        for lnI = 1 to len(lcIn)
  189. *!*          lcCh = Substr(lcIn,lnI,1)
  190. *!*          lnCh = Asc(lcCh)
  191. *!*          if not between( lnCh, 33, 126 )
  192. *!*            lcCh = '%' + Right( Transform(lnCh,'@0'), 2 )
  193. *!*          endif
  194. *!*          lcOut = lcOut + lcCh
  195. *!*        endfor
  196. *!*        RETURN lcOut
  197.   ENDFUNC && UrlEncode
  198.  
  199.   FUNCTION Disconnect
  200.     if THIS.hSocket<>SOCKET_ERROR
  201.       = closesocket(THIS.hSocket)
  202.     endif
  203.     THIS.hSocket = SOCKET_ERROR
  204.   ENDFUNC
  205.  
  206.   FUNCTION snd(cData, lResponse)
  207.     LOCAL cBuffer, nResult, cResponse
  208.     cBuffer = cData && + CrLf
  209.     nResult = send(THIS.hSocket, @cBuffer, Len(cBuffer), 0)
  210.     IF nResult = SOCKET_ERROR
  211.         RETURN .F.
  212.     ENDIF
  213.     IF Not lResponse
  214.         RETURN .T.
  215.     ENDIF
  216.  
  217.     LOCAL hEventRead, nWait, cRead
  218.     DO WHILE .T.
  219.         * creating event, linking it to the socket and wait
  220.         hEventRead = WSACreateEvent()
  221.         = WSAEventSelect(THIS.hSocket, hEventRead, FD_READ)
  222.  
  223.         * 1000 milliseconds can be not enough
  224.         THIS.WaitForRead = WSAWaitForMultipleEvents(1, @hEventRead, 0, 2000, 0)
  225.         = WSACloseEvent(hEventRead)
  226.  
  227.         IF THIS.WaitForRead <> 0 && error or timeout
  228.             EXIT
  229.         ENDIF
  230.        
  231.         * reading data from connected socket
  232.         THIS.cIn = THIS.cIn+THIS.Rd()
  233.     ENDDO
  234.   RETURN .T.
  235.   ENDFUNC
  236.  
  237.   PROTECTED FUNCTION Rd
  238.   #DEFINE READ_SIZE 16384
  239.     LOCAL cRecv, nRecv, nFlags
  240.     cRecv = Repli(Chr(0), READ_SIZE)
  241.     nFlags = 0
  242.     nRecv = recv(THIS.hSocket, @cRecv, READ_SIZE, nFlags)
  243.     RETURN Iif(nRecv<=0, "", LEFT(cRecv, nRecv))
  244.   ENDFUNC
  245.  
  246.   PROCEDURE decl
  247.     DECLARE INTEGER gethostbyname IN ws2_32 STRING host
  248.     DECLARE STRING inet_ntoa IN ws2_32 INTEGER in_addr
  249.     DECLARE INTEGER socket IN ws2_32 INTEGER af, INTEGER tp, INTEGER pt
  250.     DECLARE INTEGER closesocket IN ws2_32 INTEGER s
  251.     DECLARE INTEGER WSACreateEvent IN ws2_32
  252.     DECLARE INTEGER WSACloseEvent IN ws2_32 INTEGER hEvent
  253.     DECLARE GetSystemTime IN kernel32 STRING @lpSystemTime
  254.     DECLARE INTEGER inet_addr IN ws2_32 STRING cp
  255.     DECLARE INTEGER htons IN ws2_32 INTEGER hostshort
  256.     DECLARE INTEGER WSAStartup IN ws2_32 INTEGER wVerRq, STRING lpWSAData
  257.     DECLARE INTEGER WSACleanup IN ws2_32
  258.  
  259.     DECLARE INTEGER connect IN ws2_32 AS ws_connect ;
  260.         INTEGER s, STRING @sname, INTEGER namelen
  261.  
  262.     DECLARE INTEGER send IN ws2_32;
  263.         INTEGER s, STRING @buf, INTEGER buflen, INTEGER flags
  264.  
  265.     DECLARE INTEGER recv IN ws2_32;
  266.         INTEGER s, STRING @buf, INTEGER buflen, INTEGER flags
  267.  
  268.     DECLARE INTEGER WSAEventSelect IN ws2_32;
  269.         INTEGER s, INTEGER hEventObject, INTEGER lNetworkEvents
  270.  
  271.     DECLARE INTEGER WSAWaitForMultipleEvents IN ws2_32;
  272.         INTEGER cEvents, INTEGER @lphEvents, INTEGER fWaitAll,;
  273.         INTEGER dwTimeout, INTEGER fAlertable
  274.  
  275.     DECLARE RtlMoveMemory IN kernel32 As CopyMemory;
  276.         STRING @Dest, INTEGER Src, INTEGER nLength
  277.   ENDPROC
  278.  
  279.   FUNCTION buf2dword(lcBuffer)
  280.     RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
  281.         BitLShift(Asc(SUBSTR(lcBuffer, 2,1)), 8) +;
  282.         BitLShift(Asc(SUBSTR(lcBuffer, 3,1)), 16) +;
  283.         BitLShift(Asc(SUBSTR(lcBuffer, 4,1)), 24)
  284.   ENDFUNC
  285.  
  286.   FUNCTION num2dword(lnValue)
  287.   #DEFINE m0 256
  288.   #DEFINE m1 65536
  289.   #DEFINE m2 16777216
  290.       IF lnValue < 0
  291.           lnValue = 0x100000000 + lnValue
  292.       ENDIF
  293.       LOCAL b0, b1, b2, b3
  294.       b3 = Int(lnValue/m2)
  295.       b2 = Int((lnValue - b3*m2)/m1)
  296.       b1 = Int((lnValue - b3*m2 - b2*m1)/m0)
  297.       b0 = Mod(lnValue, m0)
  298.   RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3)
  299.   ENDFUNC
  300.  
  301.   FUNCTION num2word(lnValue)
  302.     RETURN Chr(MOD(m.lnValue,256)) + CHR(INT(m.lnValue/256))
  303.   ENDFUNC
  304. ENDDEFI
  305. *!*  LOCAL lcIn, lcOut, lnI, lnCh
  306. *!*        lcIn = StrTran(pcInStr, [%], '%25' )
  307. *!*        lcIn = StrTran(lcIn,    [+], '%2B' )
  308. *!*        lcIn = StrTran(lcIn,    [ ], '+'   )
  309. *!*        lcIn = StrTran(lcIn,    ["], '%22' )
  310. *!*        lcIn = StrTran(lcIn,    [,], '%2C' )
  311. *!*        lcIn = StrTran(lcIn,    ['], '%27' )
  312. *!*        lcIn = StrTran(lcIn,    [=], '%3D' )
  313. *!*        lcIn = StrTran(lcIn,    [&], '%26' )
  314. *!*        lcIn = StrTran(lcIn,    [`], '%60' )
  315. *!*        lcOut = ''
  316. *!*        for lnI = 1 to len(lcIn)
  317. *!*          lcCh = Substr(lcIn,lnI,1)
  318. *!*          lnCh = Asc(lcCh)
  319. *!*          if not between( lnCh, 33, 126 )
  320. *!*            lcCh = '%' + Right( Transform(lnCh,'@0'), 2 )
  321. *!*          endif
  322. *!*          lcOut = lcOut + lcCh
  323. *!*        endfor
  324. *!*        RETURN lcOut
  325.   ENDFUNC && UrlEncode
  326.  
  327.   FUNCTION Disconnect
  328.     if THIS.hSocket<>SOCKET_ERROR
  329.       = closesocket(THIS.hSocket)
  330.     endif
  331.     THIS.hSocket = SOCKET_ERROR
  332.   ENDFUNC
  333.  
  334.   FUNCTION snd(cData, lResponse)
  335.     LOCAL cBuffer, nResult, cResponse
  336.     cBuffer = cData && + CrLf
  337.     nResult = send(THIS.hSocket, @cBuffer, Len(cBuffer), 0)
  338.     IF nResult = SOCKET_ERROR
  339.         RETURN .F.
  340.     ENDIF
  341.     IF Not lResponse
  342.         RETURN .T.
  343.     ENDIF
  344.  
  345.     LOCAL hEventRead, nWait, cRead
  346.     DO WHILE .T.
  347.         * creating event, linking it to the socket and wait
  348.         hEventRead = WSACreateEvent()
  349.         = WSAEventSelect(THIS.hSocket, hEventRead, FD_READ)
  350.  
  351.         * 1000 milliseconds can be not enough
  352.         THIS.WaitForRead = WSAWaitForMultipleEvents(1, @hEventRead, 0, 2000, 0)
  353.         = WSACloseEvent(hEventRead)
  354.  
  355.         IF THIS.WaitForRead <> 0 && error or timeout
  356.             EXIT
  357.         ENDIF
  358.        
  359.         * reading data from connected socket
  360.         THIS.cIn = THIS.cIn+THIS.Rd()
  361.     ENDDO
  362.   RETURN .T.
  363.   ENDFUNC
  364.  
  365.   PROTECTED FUNCTION Rd
  366.   #DEFINE READ_SIZE 16384
  367.     LOCAL cRecv, nRecv, nFlags
  368.     cRecv = Repli(Chr(0), READ_SIZE)
  369.     nFlags = 0
  370.     nRecv = recv(THIS.hSocket, @cRecv, READ_SIZE, nFlags)
  371.     RETURN Iif(nRecv<=0, "", LEFT(cRecv, nRecv))
  372.   ENDFUNC
  373.  
  374.   PROCEDURE decl
  375.     DECLARE INTEGER gethostbyname IN ws2_32 STRING host
  376.     DECLARE STRING inet_ntoa IN ws2_32 INTEGER in_addr
  377.     DECLARE INTEGER socket IN ws2_32 INTEGER af, INTEGER tp, INTEGER pt
  378.     DECLARE INTEGER closesocket IN ws2_32 INTEGER s
  379.     DECLARE INTEGER WSACreateEvent IN ws2_32
  380.     DECLARE INTEGER WSACloseEvent IN ws2_32 INTEGER hEvent
  381.     DECLARE GetSystemTime IN kernel32 STRING @lpSystemTime
  382.     DECLARE INTEGER inet_addr IN ws2_32 STRING cp
  383.     DECLARE INTEGER htons IN ws2_32 INTEGER hostshort
  384.     DECLARE INTEGER WSAStartup IN ws2_32 INTEGER wVerRq, STRING lpWSAData
  385.     DECLARE INTEGER WSACleanup IN ws2_32
  386.  
  387.     DECLARE INTEGER connect IN ws2_32 AS ws_connect ;
  388.         INTEGER s, STRING @sname, INTEGER namelen
  389.  
  390.     DECLARE INTEGER send IN ws2_32;
  391.         INTEGER s, STRING @buf, INTEGER buflen, INTEGER flags
  392.  
  393.     DECLARE INTEGER recv IN ws2_32;
  394.         INTEGER s, STRING @buf, INTEGER buflen, INTEGER flags
  395.  
  396.     DECLARE INTEGER WSAEventSelect IN ws2_32;
  397.         INTEGER s, INTEGER hEventObject, INTEGER lNetworkEvents
  398.  
  399.     DECLARE INTEGER WSAWaitForMultipleEvents IN ws2_32;
  400.         INTEGER cEvents, INTEGER @lphEvents, INTEGER fWaitAll,;
  401.         INTEGER dwTimeout, INTEGER fAlertable
  402.  
  403.     DECLARE RtlMoveMemory IN kernel32 As CopyMemory;
  404.         STRING @Dest, INTEGER Src, INTEGER nLength
  405.   ENDPROC
  406.  
  407.   FUNCTION buf2dword(lcBuffer)
  408.     RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
  409.         BitLShift(Asc(SUBSTR(lcBuffer, 2,1)), 8) +;
  410.         BitLShift(Asc(SUBSTR(lcBuffer, 3,1)), 16) +;
  411.         BitLShift(Asc(SUBSTR(lcBuffer, 4,1)), 24)
  412.   ENDFUNC
  413.  
  414.   FUNCTION num2dword(lnValue)
  415.   #DEFINE m0 256
  416.   #DEFINE m1 65536
  417.   #DEFINE m2 16777216
  418.       IF lnValue < 0
  419.           lnValue = 0x100000000 + lnValue
  420.       ENDIF
  421.       LOCAL b0, b1, b2, b3
  422.       b3 = Int(lnValue/m2)
  423.       b2 = Int((lnValue - b3*m2)/m1)
  424.       b1 = Int((lnValue - b3*m2 - b2*m1)/m0)
  425.       b0 = Mod(lnValue, m0)
  426.   RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3)
  427.   ENDFUNC
  428.  
  429.   FUNCTION num2word(lnValue)
  430.     RETURN Chr(MOD(m.lnValue,256)) + CHR(INT(m.lnValue/256))
  431.   ENDFUNC
  432. ENDDEFI
  433. *!*        lcIn = StrTran(pcInStr, [%], '%25' )
  434. *!*        lcIn = StrTran(lcIn,    [+], '%2B' )
  435. *!*        lcIn = StrTran(lcIn,    [ ], '+'   )
  436. *!*        lcIn = StrTran(lcIn,    ["], '%22' )
  437. *!*        lcIn = StrTran(lcIn,    [,], '%2C' )
  438. *!*        lcIn = StrTran(lcIn,    ['], '%27' )
  439. *!*        lcIn = StrTran(lcIn,    [=], '%3D' )
  440. *!*        lcIn = StrTran(lcIn,    [&], '%26' )
  441. *!*        lcIn = StrTran(lcIn,    [`], '%60' )
  442. *!*        lcOut = ''
  443. *!*        for lnI = 1 to len(lcIn)
  444. *!*          lcCh = Substr(lcIn,lnI,1)
  445. *!*          lnCh = Asc(lcCh)
  446. *!*          if not between( lnCh, 33, 126 )
  447. *!*            lcCh = '%' + Right( Transform(lnCh,'@0'), 2 )
  448. *!*          endif
  449. *!*          lcOut = lcOut + lcCh
  450. *!*        endfor
  451. *!*        RETURN lcOut
  452.   ENDFUNC && UrlEncode
  453.  
  454.   FUNCTION Disconnect
  455.     if THIS.hSocket<>SOCKET_ERROR
  456.       = closesocket(THIS.hSocket)
  457.     endif
  458.     THIS.hSocket = SOCKET_ERROR
  459.   ENDFUNC
  460.  
  461.   FUNCTION snd(cData, lResponse)
  462.     LOCAL cBuffer, nResult, cResponse
  463.     cBuffer = cData && + CrLf
  464.     nResult = send(THIS.hSocket, @cBuffer, Len(cBuffer), 0)
  465.     IF nResult = SOCKET_ERROR
  466.         RETURN .F.
  467.     ENDIF
  468.     IF Not lResponse
  469.         RETURN .T.
  470.     ENDIF
  471.  
  472.     LOCAL hEventRead, nWait, cRead
  473.     DO WHILE .T.
  474.         * creating event, linking it to the socket and wait
  475.         hEventRead = WSACreateEvent()
  476.         = WSAEventSelect(THIS.hSocket, hEventRead, FD_READ)
  477.  
  478.         * 1000 milliseconds can be not enough
  479.         THIS.WaitForRead = WSAWaitForMultipleEvents(1, @hEventRead, 0, 2000, 0)
  480.         = WSACloseEvent(hEventRead)
  481.  
  482.         IF THIS.WaitForRead <> 0 && error or timeout
  483.             EXIT
  484.         ENDIF
  485.        
  486.         * reading data from connected socket
  487.         THIS.cIn = THIS.cIn+THIS.Rd()
  488.     ENDDO
  489.   RETURN .T.
  490.   ENDFUNC
  491.  
  492.   PROTECTED FUNCTION Rd
  493.   #DEFINE READ_SIZE 16384
  494.     LOCAL cRecv, nRecv, nFlags
  495.     cRecv = Repli(Chr(0), READ_SIZE)
  496.     nFlags = 0
  497.     nRecv = recv(THIS.hSocket, @cRecv, READ_SIZE, nFlags)
  498.     RETURN Iif(nRecv<=0, "", LEFT(cRecv, nRecv))
  499.   ENDFUNC
  500.  
  501.   PROCEDURE decl
  502.     DECLARE INTEGER gethostbyname IN ws2_32 STRING host
  503.     DECLARE STRING inet_ntoa IN ws2_32 INTEGER in_addr
  504.     DECLARE INTEGER socket IN ws2_32 INTEGER af, INTEGER tp, INTEGER pt
  505.     DECLARE INTEGER closesocket IN ws2_32 INTEGER s
  506.     DECLARE INTEGER WSACreateEvent IN ws2_32
  507.     DECLARE INTEGER WSACloseEvent IN ws2_32 INTEGER hEvent
  508.     DECLARE GetSystemTime IN kernel32 STRING @lpSystemTime
  509.     DECLARE INTEGER inet_addr IN ws2_32 STRING cp
  510.     DECLARE INTEGER htons IN ws2_32 INTEGER hostshort
  511.     DECLARE INTEGER WSAStartup IN ws2_32 INTEGER wVerRq, STRING lpWSAData
  512.     DECLARE INTEGER WSACleanup IN ws2_32
  513.  
  514.     DECLARE INTEGER connect IN ws2_32 AS ws_connect ;
  515.         INTEGER s, STRING @sname, INTEGER namelen
  516.  
  517.     DECLARE INTEGER send IN ws2_32;
  518.         INTEGER s, STRING @buf, INTEGER buflen, INTEGER flags
  519.  
  520.     DECLARE INTEGER recv IN ws2_32;
  521.         INTEGER s, STRING @buf, INTEGER buflen, INTEGER flags
  522.  
  523.     DECLARE INTEGER WSAEventSelect IN ws2_32;
  524.         INTEGER s, INTEGER hEventObject, INTEGER lNetworkEvents
  525.  
  526.     DECLARE INTEGER WSAWaitForMultipleEvents IN ws2_32;
  527.         INTEGER cEvents, INTEGER @lphEvents, INTEGER fWaitAll,;
  528.         INTEGER dwTimeout, INTEGER fAlertable
  529.  
  530.     DECLARE RtlMoveMemory IN kernel32 As CopyMemory;
  531.         STRING @Dest, INTEGER Src, INTEGER nLength
  532.   ENDPROC
  533.  
  534.   FUNCTION buf2dword(lcBuffer)
  535.     RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
  536.         BitLShift(Asc(SUBSTR(lcBuffer, 2,1)), 8) +;
  537.         BitLShift(Asc(SUBSTR(lcBuffer, 3,1)), 16) +;
  538.         BitLShift(Asc(SUBSTR(lcBuffer, 4,1)), 24)
  539.   ENDFUNC
  540.  
  541.   FUNCTION num2dword(lnValue)
  542.   #DEFINE m0 256
  543.   #DEFINE m1 65536
  544.   #DEFINE m2 16777216
  545.       IF lnValue < 0
  546.           lnValue = 0x100000000 + lnValue
  547.       ENDIF
  548.       LOCAL b0, b1, b2, b3
  549.       b3 = Int(lnValue/m2)
  550.       b2 = Int((lnValue - b3*m2)/m1)
  551.       b1 = Int((lnValue - b3*m2 - b2*m1)/m0)
  552.       b0 = Mod(lnValue, m0)
  553.   RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3)
  554.   ENDFUNC
  555.  
  556.   FUNCTION num2word(lnValue)
  557.     RETURN Chr(MOD(m.lnValue,256)) + CHR(INT(m.lnValue/256))
  558.   ENDFUNC
  559. ENDDEFI
  560. *!*        lcIn = StrTran(lcIn,    [+], '%2B' )
  561. *!*        lcIn = StrTran(lcIn,    [ ], '+'   )
  562. *!*        lcIn = StrTran(lcIn,    ["], '%22' )
  563. *!*        lcIn = StrTran(lcIn,    [,], '%2C' )
  564. *!*        lcIn = StrTran(lcIn,    ['], '%27' )
  565. *!*        lcIn = StrTran(lcIn,    [=], '%3D' )
  566. *!*        lcIn = StrTran(lcIn,    [&], '%26' )
  567. *!*        lcIn = StrTran(lcIn,    [`], '%60' )
  568. *!*        lcOut = ''
  569. *!*        for lnI = 1 to len(lcIn)
  570. *!*          lcCh = Substr(lcIn,lnI,1)
  571. *!*          lnCh = Asc(lcCh)
  572. *!*          if not between( lnCh, 33, 126 )
  573. *!*            lcCh = '%' + Right( Transform(lnCh,'@0'), 2 )
  574. *!*          endif
  575. *!*          lcOut = lcOut + lcCh
  576. *!*        endfor
  577. *!*        RETURN lcOut
  578.   ENDFUNC && UrlEncode
  579.  
  580.   FUNCTION Disconnect
  581.     if THIS.hSocket<>SOCKET_ERROR
  582.       = closesocket(THIS.hSocket)
  583.     endif
  584.     THIS.hSocket = SOCKET_ERROR
  585.   ENDFUNC
  586.  
  587.   FUNCTION snd(cData, lResponse)
  588.     LOCAL cBuffer, nResult, cResponse
  589.     cBuffer = cData && + CrLf
  590.     nResult = send(THIS.hSocket, @cBuffer, Len(cBuffer), 0)
  591.     IF nResult = SOCKET_ERROR
  592.         RETURN .F.
  593.     ENDIF
  594.     IF Not lResponse
  595.         RETURN .T.
  596.     ENDIF
  597.  
  598.     LOCAL hEventRead, nWait, cRead
  599.     DO WHILE .T.
  600.         * creating event, linking it to the socket and wait
  601.         hEventRead = WSACreateEvent()
  602.         = WSAEventSelect(THIS.hSocket, hEventRead, FD_READ)
  603.  
  604.         * 1000 milliseconds can be not enough
  605.         THIS.WaitForRead = WSAWaitForMultipleEvents(1, @hEventRead, 0, 2000, 0)
  606.         = WSACloseEvent(hEventRead)
  607.  
  608.         IF THIS.WaitForRead <> 0 && error or timeout
  609.             EXIT
  610.         ENDIF
  611.        
  612.         * reading data from connected socket
  613.         THIS.cIn = THIS.cIn+THIS.Rd()
  614.     ENDDO
  615.   RETURN .T.
  616.   ENDFUNC
  617.  
  618.   PROTECTED FUNCTION Rd
  619.   #DEFINE READ_SIZE 16384
  620.     LOCAL cRecv, nRecv, nFlags
  621.     cRecv = Repli(Chr(0), READ_SIZE)
  622.     nFlags = 0
  623.     nRecv = recv(THIS.hSocket, @cRecv, READ_SIZE, nFlags)
  624.     RETURN Iif(nRecv<=0, "", LEFT(cRecv, nRecv))
  625.   ENDFUNC
  626.  
  627.   PROCEDURE decl
  628.     DECLARE INTEGER gethostbyname IN ws2_32 STRING host
  629.     DECLARE STRING inet_ntoa IN ws2_32 INTEGER in_addr
  630.     DECLARE INTEGER socket IN ws2_32 INTEGER af, INTEGER tp, INTEGER pt
  631.     DECLARE INTEGER closesocket IN ws2_32 INTEGER s
  632.     DECLARE INTEGER WSACreateEvent IN ws2_32
  633.     DECLARE INTEGER WSACloseEvent IN ws2_32 INTEGER hEvent
  634.     DECLARE GetSystemTime IN kernel32 STRING @lpSystemTime
  635.     DECLARE INTEGER inet_addr IN ws2_32 STRING cp
  636.     DECLARE INTEGER htons IN ws2_32 INTEGER hostshort
  637.     DECLARE INTEGER WSAStartup IN ws2_32 INTEGER wVerRq, STRING lpWSAData
  638.     DECLARE INTEGER WSACleanup IN ws2_32
  639.  
  640.     DECLARE INTEGER connect IN ws2_32 AS ws_connect ;
  641.         INTEGER s, STRING @sname, INTEGER namelen
  642.  
  643.     DECLARE INTEGER send IN ws2_32;
  644.         INTEGER s, STRING @buf, INTEGER buflen, INTEGER flags
  645.  
  646.     DECLARE INTEGER recv IN ws2_32;
  647.         INTEGER s, STRING @buf, INTEGER buflen, INTEGER flags
  648.  
  649.     DECLARE INTEGER WSAEventSelect IN ws2_32;
  650.         INTEGER s, INTEGER hEventObject, INTEGER lNetworkEvents
  651.  
  652.     DECLARE INTEGER WSAWaitForMultipleEvents IN ws2_32;
  653.         INTEGER cEvents, INTEGER @lphEvents, INTEGER fWaitAll,;
  654.         INTEGER dwTimeout, INTEGER fAlertable
  655.  
  656.     DECLARE RtlMoveMemory IN kernel32 As CopyMemory;
  657.         STRING @Dest, INTEGER Src, INTEGER nLength
  658.   ENDPROC
  659.  
  660.   FUNCTION buf2dword(lcBuffer)
  661.     RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
  662.         BitLShift(Asc(SUBSTR(lcBuffer, 2,1)), 8) +;
  663.         BitLShift(Asc(SUBSTR(lcBuffer, 3,1)), 16) +;
  664.         BitLShift(Asc(SUBSTR(lcBuffer, 4,1)), 24)
  665.   ENDFUNC
  666.  
  667.   FUNCTION num2dword(lnValue)
  668.   #DEFINE m0 256
  669.   #DEFINE m1 65536
  670.   #DEFINE m2 16777216
  671.       IF lnValue < 0
  672.           lnValue = 0x100000000 + lnValue
  673.       ENDIF
  674.       LOCAL b0, b1, b2, b3
  675.       b3 = Int(lnValue/m2)
  676.       b2 = Int((lnValue - b3*m2)/m1)
  677.       b1 = Int((lnValue - b3*m2 - b2*m1)/m0)
  678.       b0 = Mod(lnValue, m0)
  679.   RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3)
  680.   ENDFUNC
  681.  
  682.   FUNCTION num2word(lnValue)
  683.     RETURN Chr(MOD(m.lnValue,256)) + CHR(INT(m.lnValue/256))
  684.   ENDFUNC
  685. ENDDEFI
  686. *!*        lcIn = StrTran(lcIn,    [ ], '+'   )
  687. *!*        lcIn = StrTran(lcIn,    ["], '%22' )
  688. *!*        lcIn = StrTran(lcIn,    [,], '%2C' )
  689. *!*        lcIn = StrTran(lcIn,    ['], '%27' )
  690. *!*        lcIn = StrTran(lcIn,    [=], '%3D' )
  691. *!*        lcIn = StrTran(lcIn,    [&], '%26' )
  692. *!*        lcIn = StrTran(lcIn,    [`], '%60' )
  693. *!*        lcOut = ''
  694. *!*        for lnI = 1 to len(lcIn)
  695. *!*          lcCh = Substr(lcIn,lnI,1)
  696. *!*          lnCh = Asc(lcCh)
  697. *!*          if not between( lnCh, 33, 126 )
  698. *!*            lcCh = '%' + Right( Transform(lnCh,'@0'), 2 )
  699. *!*          endif
  700. *!*          lcOut = lcOut + lcCh
  701. *!*        endfor
  702. *!*        RETURN lcOut
  703.   ENDFUNC && UrlEncode
  704.  
  705.   FUNCTION Disconnect
  706.     if THIS.hSocket<>SOCKET_ERROR
  707.       = closesocket(THIS.hSocket)
  708.     endif
  709.     THIS.hSocket = SOCKET_ERROR
  710.   ENDFUNC
  711.  
  712.   FUNCTION snd(cData, lResponse)
  713.     LOCAL cBuffer, nResult, cResponse
  714.     cBuffer = cData && + CrLf
  715.     nResult = send(THIS.hSocket, @cBuffer, Len(cBuffer), 0)
  716.     IF nResult = SOCKET_ERROR
  717.         RETURN .F.
  718.     ENDIF
  719.     IF Not lResponse
  720.         RETURN .T.
  721.     ENDIF
  722.  
  723.     LOCAL hEventRead, nWait, cRead
  724.     DO WHILE .T.
  725.         * creating event, linking it to the socket and wait
  726.         hEventRead = WSACreateEvent()
  727.         = WSAEventSelect(THIS.hSocket, hEventRead, FD_READ)
  728.  
  729.         * 1000 milliseconds can be not enough
  730.         THIS.WaitForRead = WSAWaitForMultipleEvents(1, @hEventRead, 0, 2000, 0)
  731.         = WSACloseEvent(hEventRead)
  732.  
  733.         IF THIS.WaitForRead <> 0 && error or timeout
  734.             EXIT
  735.         ENDIF
  736.        
  737.         * reading data from connected socket
  738.         THIS.cIn = THIS.cIn+THIS.Rd()
  739.     ENDDO
  740.   RETURN .T.
  741.   ENDFUNC
  742.  
  743.   PROTECTED FUNCTION Rd
  744.   #DEFINE READ_SIZE 16384
  745.     LOCAL cRecv, nRecv, nFlags
  746.     cRecv = Repli(Chr(0), READ_SIZE)
  747.     nFlags = 0
  748.     nRecv = recv(THIS.hSocket, @cRecv, READ_SIZE, nFlags)
  749.     RETURN Iif(nRecv<=0, "", LEFT(cRecv, nRecv))
  750.   ENDFUNC
  751.  
  752.   PROCEDURE decl
  753.     DECLARE INTEGER gethostbyname IN ws2_32 STRING host
  754.     DECLARE STRING inet_ntoa IN ws2_32 INTEGER in_addr
  755.     DECLARE INTEGER socket IN ws2_32 INTEGER af, INTEGER tp, INTEGER pt
  756.     DECLARE INTEGER closesocket IN ws2_32 INTEGER s
  757.     DECLARE INTEGER WSACreateEvent IN ws2_32
  758.     DECLARE INTEGER WSACloseEvent IN ws2_32 INTEGER hEvent
  759.     DECLARE GetSystemTime IN kernel32 STRING @lpSystemTime
  760.     DECLARE INTEGER inet_addr IN ws2_32 STRING cp
  761.     DECLARE INTEGER htons IN ws2_32 INTEGER hostshort
  762.     DECLARE INTEGER WSAStartup IN ws2_32 INTEGER wVerRq, STRING lpWSAData
  763.     DECLARE INTEGER WSACleanup IN ws2_32
  764.  
  765.     DECLARE INTEGER connect IN ws2_32 AS ws_connect ;
  766.         INTEGER s, STRING @sname, INTEGER namelen
  767.  
  768.     DECLARE INTEGER send IN ws2_32;
  769.         INTEGER s, STRING @buf, INTEGER buflen, INTEGER flags
  770.  
  771.     DECLARE INTEGER recv IN ws2_32;
  772.         INTEGER s, STRING @buf, INTEGER buflen, INTEGER flags
  773.  
  774.     DECLARE INTEGER WSAEventSelect IN ws2_32;
  775.         INTEGER s, INTEGER hEventObject, INTEGER lNetworkEvents
  776.  
  777.     DECLARE INTEGER WSAWaitForMultipleEvents IN ws2_32;
  778.         INTEGER cEvents, INTEGER @lphEvents, INTEGER fWaitAll,;
  779.         INTEGER dwTimeout, INTEGER fAlertable
  780.  
  781.     DECLARE RtlMoveMemory IN kernel32 As CopyMemory;
  782.         STRING @Dest, INTEGER Src, INTEGER nLength
  783.   ENDPROC
  784.  
  785.   FUNCTION buf2dword(lcBuffer)
  786.     RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
  787.         BitLShift(Asc(SUBSTR(lcBuffer, 2,1)), 8) +;
  788.         BitLShift(Asc(SUBSTR(lcBuffer, 3,1)), 16) +;
  789.         BitLShift(Asc(SUBSTR(lcBuffer, 4,1)), 24)
  790.   ENDFUNC
  791.  
  792.   FUNCTION num2dword(lnValue)
  793.   #DEFINE m0 256
  794.   #DEFINE m1 65536
  795.   #DEFINE m2 16777216
  796.       IF lnValue < 0
  797.           lnValue = 0x100000000 + lnValue
  798.       ENDIF
  799.       LOCAL b0, b1, b2, b3
  800.       b3 = Int(lnValue/m2)
  801.       b2 = Int((lnValue - b3*m2)/m1)
  802.       b1 = Int((lnValue - b3*m2 - b2*m1)/m0)
  803.       b0 = Mod(lnValue, m0)
  804.   RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3)
  805.   ENDFUNC
  806.  
  807.   FUNCTION num2word(lnValue)
  808.     RETURN Chr(MOD(m.lnValue,256)) + CHR(INT(m.lnValue/256))
  809.   ENDFUNC
  810. ENDDEFI
  811. *!*        lcIn = StrTran(lcIn,    ["], '%22' )
  812. *!*        lcIn = StrTran(lcIn,    [,], '%2C' )
  813. *!*        lcIn = StrTran(lcIn,    ['], '%27' )
  814. *!*        lcIn = StrTran(lcIn,    [=], '%3D' )
  815. *!*        lcIn = StrTran(lcIn,    [&], '%26' )
  816. *!*        lcIn = StrTran(lcIn,    [`], '%60' )
  817. *!*        lcOut = ''
  818. *!*        for lnI = 1 to len(lcIn)
  819. *!*          lcCh = Substr(lcIn,lnI,1)
  820. *!*          lnCh = Asc(lcCh)
  821. *!*          if not between( lnCh, 33, 126 )
  822. *!*            lcCh = '%' + Right( Transform(lnCh,'@0'), 2 )
  823. *!*          endif
  824. *!*          lcOut = lcOut + lcCh
  825. *!*        endfor
  826. *!*        RETURN lcOut
  827.  ENDFUNC && UrlEncode
  828.  
  829.  FUNCTION Disconnect
  830.    if THIS.hSocket<>SOCKET_ERROR
  831.      = closesocket(THIS.hSocket)
  832.    endif
  833.    THIS.hSocket = SOCKET_ERROR
  834.  ENDFUNC
  835.  
  836.  FUNCTION snd(cData, lResponse)
  837.    LOCAL cBuffer, nResult, cResponse
  838.    cBuffer = cData && + CrLf
  839.    nResult = send(THIS.hSocket, @cBuffer, Len(cBuffer), 0)
  840.    IF nResult = SOCKET_ERROR
  841.        RETURN .F.
  842.    ENDIF
  843.    IF Not lResponse
  844.        RETURN .T.
  845.    ENDIF
  846.  
  847.    LOCAL hEventRead, nWait, cRead
  848.    DO WHILE .T.
  849.        * creating event, linking it to the socket and wait
  850.        hEventRead = WSACreateEvent()
  851.        = WSAEventSelect(THIS.hSocket, hEventRead, FD_READ)
  852.  
  853.        * 1000 milliseconds can be not enough
  854.        THIS.WaitForRead = WSAWaitForMultipleEvents(1, @hEventRead, 0, 2000, 0)
  855.        = WSACloseEvent(hEventRead)
  856.  
  857.        IF THIS.WaitForRead <> 0 && error or timeout
  858.            EXIT
  859.        ENDIF
  860.        
  861.        * reading data from connected socket
  862.        THIS.cIn = THIS.cIn+THIS.Rd()
  863.    ENDDO
  864.  RETURN .T.
  865.  ENDFUNC
  866.  
  867.  PROTECTED FUNCTION Rd
  868.  #DEFINE READ_SIZE 16384
  869.    LOCAL cRecv, nRecv, nFlags
  870.    cRecv = Repli(Chr(0), READ_SIZE)
  871.    nFlags = 0
  872.    nRecv = recv(THIS.hSocket, @cRecv, READ_SIZE, nFlags)
  873.    RETURN Iif(nRecv<=0, "", LEFT(cRecv, nRecv))
  874.  ENDFUNC
  875.  
  876.  PROCEDURE decl
  877.    DECLARE INTEGER gethostbyname IN ws2_32 STRING host
  878.    DECLARE STRING inet_ntoa IN ws2_32 INTEGER in_addr
  879.    DECLARE INTEGER socket IN ws2_32 INTEGER af, INTEGER tp, INTEGER pt
  880.    DECLARE INTEGER closesocket IN ws2_32 INTEGER s
  881.    DECLARE INTEGER WSACreateEvent IN ws2_32
  882.    DECLARE INTEGER WSACloseEvent IN ws2_32 INTEGER hEvent
  883.    DECLARE GetSystemTime IN kernel32 STRING @lpSystemTime
  884.    DECLARE INTEGER inet_addr IN ws2_32 STRING cp
  885.    DECLARE INTEGER htons IN ws2_32 INTEGER hostshort
  886.    DECLARE INTEGER WSAStartup IN ws2_32 INTEGER wVerRq, STRING lpWSAData
  887.    DECLARE INTEGER WSACleanup IN ws2_32
  888.  
  889.    DECLARE INTEGER connect IN ws2_32 AS ws_connect ;
  890.        INTEGER s, STRING @sname, INTEGER namelen
  891.  
  892.    DECLARE INTEGER send IN ws2_32;
  893.        INTEGER s, STRING @buf, INTEGER buflen, INTEGER flags
  894.  
  895.    DECLARE INTEGER recv IN ws2_32;
  896.        INTEGER s, STRING @buf, INTEGER buflen, INTEGER flags
  897.  
  898.    DECLARE INTEGER WSAEventSelect IN ws2_32;
  899.        INTEGER s, INTEGER hEventObject, INTEGER lNetworkEvents
  900.  
  901.    DECLARE INTEGER WSAWaitForMultipleEvents IN ws2_32;
  902.        INTEGER cEvents, INTEGER @lphEvents, INTEGER fWaitAll,;
  903.        INTEGER dwTimeout, INTEGER fAlertable
  904.  
  905.    DECLARE RtlMoveMemory IN kernel32 As CopyMemory;
  906.        STRING @Dest, INTEGER Src, INTEGER nLength
  907.  ENDPROC
  908.  
  909.  FUNCTION buf2dword(lcBuffer)
  910.    RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
  911.        BitLShift(Asc(SUBSTR(lcBuffer, 2,1)), 8) +;
  912.        BitLShift(Asc(SUBSTR(lcBuffer, 3,1)), 16) +;
  913.        BitLShift(Asc(SUBSTR(lcBuffer, 4,1)), 24)
  914.  ENDFUNC
  915.  
  916.  FUNCTION num2dword(lnValue)
  917.  #DEFINE m0 256
  918.  #DEFINE m1 65536
  919.  #DEFINE m2 16777216
  920.      IF lnValue < 0
  921.          lnValue = 0x100000000 + lnValue
  922.      ENDIF
  923.      LOCAL b0, b1, b2, b3
  924.      b3 = Int(lnValue/m2)
  925.      b2 = Int((lnValue - b3*m2)/m1)
  926.      b1 = Int((lnValue - b3*m2 - b2*m1)/m0)
  927.      b0 = Mod(lnValue, m0)
  928.  RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3)
  929.  ENDFUNC
  930.  
  931.  FUNCTION num2word(lnValue)
  932.    RETURN Chr(MOD(m.lnValue,256)) + CHR(INT(m.lnValue/256))
  933.  ENDFUNC
  934. ENDDEFINE
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement