home *** CD-ROM | disk | FTP | other *** search
/ linuxmafia.com 2016 / linuxmafia.com.tar / linuxmafia.com / pub / palmos / wapuniverse-src-0.3.5.build9.tar.gz / wapuniverse-src-0.3.5.build9.tar / wapuniverse-0.3.5.build9 / WAP.c < prev    next >
C/C++ Source or Header  |  2000-11-12  |  6KB  |  234 lines

  1. //---------------------------------------------------------------------------
  2. // WAP.c
  3. // Contains all platform independant WAP code 
  4. //
  5. // Project: WAPUniverse for PalmOS
  6. // Copyright ⌐ 1999-2000 Filip Onkelinx
  7. //
  8. // http://www.wapuniverse.com/
  9. // filip@onkelinx.com
  10. //
  11. // This program is free software; you can redistribute it and/or
  12. // modify it under the terms of the GNU General Public License
  13. // as published by the Free Software Foundation; either version 2
  14. // of the License, or (at your option) any later version.
  15. //
  16. // This program is distributed in the hope that it will be useful,
  17. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. // GNU General Public License for more details.
  20. //
  21. // You should have received a copy of the GNU General Public License
  22. // along with this program; if not, write to the Free Software 
  23. // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
  24. //
  25. //
  26. // $Workfile: WAP.c $  
  27. // $Author: wapuniverse $  
  28. // $Date: 2000/11/11 20:51:09 $     
  29. // $Revision: 1.8 $
  30. //
  31. // $Header: /cvsroot/wapuniverse/wapuniverse/src/WAP.c,v 1.8 2000/11/11 20:51:09 wapuniverse Exp $
  32. //
  33.  
  34. //---------------------------------------------------------------------------
  35.  
  36. #include "build.h"
  37. #include "WAPUniverse.h"
  38. #include "wsp.h"
  39. #ifdef __palmos__
  40.     #include "dbConn.h"
  41.     #include "dbUrl.h"
  42. #endif
  43.  
  44.  
  45.  
  46. int StringToIPAddr (char *str, unsigned long *addr)
  47. {
  48. //    struct hostent *hp = NULL;
  49. #ifdef __palmos__
  50.     NetHostInfoBufType AppHostInfo;     // DO NOT DELETE !!
  51.     // without this AppHostInfo, gethostbyname() corrupts memory!!!!!!!
  52. #endif
  53.  
  54. // WAP Gateway can only be IP, no DNS name
  55. //    if ((hp = gethostbyname (str)) == NULL) {
  56.     if ((long)(*addr = inet_addr (str)) == -1)
  57.         return 0;
  58. //    }
  59. //    else
  60. //      bcopy ((char *)(hp->h_addr), (char *)addr, hp->h_length);
  61.  
  62.     return 1;
  63. }
  64.  
  65. char * 
  66. gstrcopy(char *dst, const char *src)
  67. {
  68.     char *tmp=dst;
  69.  
  70.     if ( dst==NULL || src==NULL)
  71.         return NULL;
  72.     while (*src)
  73.         *tmp++ = *src++;
  74.     *tmp=0; 
  75.     return(dst);
  76. }
  77.  
  78.  
  79. int 
  80. gstrlen(char *str)
  81. {
  82.     int i=0;
  83.  
  84.     if ( str == NULL)
  85.         return(0);
  86.  
  87.     while (*str++)
  88.         i++;
  89.     return(i);
  90. }
  91.  
  92.  
  93. void
  94. enc_uintvar(char buf[], int *i, int intval)
  95. {
  96.     int j,p;
  97.  
  98.     for (j=4; j>1 ; j--) {
  99.         p = intval>>(7*j) ;
  100.         if (p> 0) {
  101.             buf[*i] = (p);
  102.             (*i)++;
  103.         }
  104.     }
  105.     buf[*i]= intval;
  106.     (*i)++;
  107.  
  108. }
  109.  
  110.  
  111. // connect2server: open the connection to the 'hostname' server
  112. // and return the socket descriptor
  113. int Connect2Server(char *gwip, char *urlStr, GlobalsType *g )
  114. {
  115.     unsigned long host;
  116.     int sock;
  117.  
  118.     if (StringToIPAddr(gwip,&host) != 1) {
  119.         DisplayError("Invalid WAP Gateway IP");
  120.         return -1;
  121.     }
  122.  
  123.     memset((char *) &(g->RmtAddress), 0, sizeof(g->RmtAddress));
  124.     g->RmtAddress.sin_family = AF_INET;
  125.     g->RmtAddress.sin_port = htons(WAP_WSP_CL);
  126.     g->RmtAddress.sin_addr.s_addr = host;
  127.  
  128.     sock = socket(AF_INET, SOCK_DGRAM, 0);             
  129.  
  130.     g->LclAddress.sin_family = AF_INET;
  131.     g->LclAddress.sin_port   = htons(WAP_WSP_CL_LOCAL);
  132.     g->LclAddress.sin_addr.s_addr = INADDR_ANY;
  133.  
  134.     if (bind(sock, (struct sockaddr *) &g->LclAddress, sizeof(g->LclAddress)) < 0) {
  135.         MyErrorFunc("bind failed",WspHostErrStr());
  136.         return -2;
  137.     }
  138.  
  139.     return(sock);
  140. }
  141.  
  142. int wsp_get(int sock, char *gwip, char *urlStr, Boolean remember, GlobalsType *g )
  143. // Boolean remember: true if we are loading a WML page (and not an image), sowe set gLastURL to current URL, needed for relative links later on
  144. {
  145.     unsigned char outbuf[256];
  146.     int i = 0;
  147.  
  148.     // See WSP.PDF for more info
  149.     outbuf[i++]=0x01; // Transaction ID
  150.     outbuf[i++]=WSP_PDU_GET; 
  151.     enc_uintvar(outbuf,&i,gstrlen(urlStr)); // URIlen , uintvar !!
  152.     gstrcopy((outbuf+i), urlStr);
  153.     if(remember)
  154.         gstrcopy(g->WapLastUrl,urlStr);
  155.     i+= gstrlen(urlStr);
  156.     // Start of headers
  157.  
  158.     outbuf[i++]=0x81; // 01 Accept Charset
  159.     outbuf[i++]=0xEA; // 6A = UTF-8
  160.     outbuf[i++]=0x81; // 01 Accept Charset
  161.     outbuf[i++]=0x84; // 04 iso-8859-1 
  162.     outbuf[i++]=0x81; // 01 Accept Charset
  163.     outbuf[i++]=0x03; // 03 us-ascii
  164.     outbuf[i++]=0x02; // 02 Accept Encoding
  165.     outbuf[i++]=0x03; // 03 Token Text ???????
  166.     outbuf[i++]=0xE8; // 68
  167.     outbuf[i++]=0x80; // 00 Accept
  168.     outbuf[i++]=0x94; // 14 application/vnd.wap.wmlc
  169.     outbuf[i++]=0x80; // 00 Accept
  170.     outbuf[i++]=0x95; // 15 application/vnd.wap.wmlscriptc
  171.     outbuf[i++]=0x80; // 00 Accept
  172.     outbuf[i++]=0xA1; // 21 image/vnd.wap.wbmp
  173.     outbuf[i++]=0xA9; // 29 User Agent
  174.     gstrcopy(&(outbuf[i]),AGENT_STRING);
  175.     i+= gstrlen(AGENT_STRING);
  176.     outbuf[i++]=0x00;
  177.     if (sendto(sock,&outbuf,i,0, (struct sockaddr *) &g->RmtAddress,sizeof(g->RmtAddress))<0)
  178.         MyErrorFunc("sendto failed", WspHostErrStr());
  179.  
  180.     return sock;
  181. }
  182.  
  183.  
  184. int wapCreateUrlStr(char target[], char url[], GlobalsType *g)
  185. {
  186. int j,i = 0;
  187.  
  188.   if (!target)
  189.         return(-1);        
  190.   if (target[4] == ':'){ // looks like we got 'http://'
  191.       gstrcopy(url,target);
  192.       return(0);
  193.   }
  194.   if (target[0] == '/'){ // looks like we have relative to server
  195.       // yep, copy 'http://'
  196.       while ( (g->WapLastUrl[i]!= 0) && (i<7)){
  197.           url[i]=g->WapLastUrl[i++];
  198.       }
  199.         // We need till next '/'
  200.       while ( (g->WapLastUrl[i]!= 0) && (g->WapLastUrl[i]!= '/')){
  201.           url[i]=g->WapLastUrl[i++];
  202.       }
  203.       gstrcopy(&url[i],target);
  204.       return(0);
  205.   }else{  // well ... relative to last URL
  206.       while (g->WapLastUrl[i]!= 0){
  207.             if (g->WapLastUrl[i] == '/'){
  208.                   j = i;
  209.           }
  210.           url[i]=g->WapLastUrl[i++];
  211.       }
  212.       gstrcopy(&url[j+1],target);
  213.       return(0);
  214.       
  215.   }      
  216. }
  217.  
  218. // returns socket
  219. int wapGetUrl(dbConnConnection *conn, char *urlstr, Boolean remember, GlobalsType *g )
  220. // Boolean remember: true if we are loading a WML page (and not an image), so we set gLastURL to current URL, needed for relative links later on
  221. {
  222.     int         sock=0;
  223.  
  224.     sock = Connect2Server(conn->ipaddress,urlstr,g);       
  225.     if (sock < 0) {
  226.         return(-1);
  227.     }
  228.     wsp_get(sock,conn->ipaddress,urlstr,remember,g);
  229.  
  230.  
  231.     return(sock);
  232. }
  233.  
  234.