MISC.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:10k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  2. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  3. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  4. // PARTICULAR PURPOSE.
  5. //
  6. // Copyright (C) 1993-1997  Microsoft Corporation.  All Rights Reserved.
  7. //
  8. //  MODULE:   misc.c
  9. //
  10. //  PURPOSE:  Contains all helper functions "global" to the application.
  11. //
  12. //  FUNCTIONS:
  13. //    CenterWindow - Center one window over another.
  14. //    ReceiveInBox - Reads incoming socket data.
  15. //    SendOutBox   - Writes outgoing socket data.
  16. //    AtoH         - Converts ascii string to network order hex
  17. //    BtoH         - Converts ascii byte to hex
  18. //    CleanUp      - closes sockets and detaches winsock dll
  19. //    GetAddrString - Puts IPX address into <network>.<node>.<socket> string format
  20. //    HtoA          - Converts network order hex to ascii string
  21. //    HtoB          - Converts hex byte to asci string
  22. //
  23. //  COMMENTS:
  24. //
  25. //
  26. #include <windows.h>            // required for all Windows applications
  27. #include <windowsx.h>
  28. #include <wsipx.h>
  29. #include "globals.h"            // prototypes specific to this application
  30. //
  31. //  FUNCTION: CenterWindow(HWND, HWND)
  32. //
  33. //  PURPOSE:  Center one window over another.
  34. //
  35. //  PARAMETERS:
  36. //    hwndChild - The handle of the window to be centered.
  37. //    hwndParent- The handle of the window to center on.
  38. //
  39. //  RETURN VALUE:
  40. //
  41. //    TRUE  - Success
  42. //    FALSE - Failure
  43. //
  44. //  COMMENTS:
  45. //
  46. //    Dialog boxes take on the screen position that they were designed
  47. //    at, which is not always appropriate. Centering the dialog over a
  48. //    particular window usually results in a better position.
  49. //
  50. BOOL CenterWindow(HWND hwndChild, HWND hwndParent)
  51. {
  52.     RECT    rcChild, rcParent;
  53.     int     cxChild, cyChild, cxParent, cyParent;
  54.     int     cxScreen, cyScreen, xNew, yNew;
  55.     HDC     hdc;
  56.     // Get the Height and Width of the child window
  57.     GetWindowRect(hwndChild, &rcChild);
  58.     cxChild = rcChild.right - rcChild.left;
  59.     cyChild = rcChild.bottom - rcChild.top;
  60.     // Get the Height and Width of the parent window
  61.     GetWindowRect(hwndParent, &rcParent);
  62.     cxParent = rcParent.right - rcParent.left;
  63.     cyParent = rcParent.bottom - rcParent.top;
  64.     // Get the display limits
  65.     hdc = GetDC(hwndChild);
  66.     cxScreen = GetDeviceCaps(hdc, HORZRES);
  67.     cyScreen = GetDeviceCaps(hdc, VERTRES);
  68.     ReleaseDC(hwndChild, hdc);
  69.     // Calculate new X position, then adjust for screen
  70.     xNew = rcParent.left + ((cxParent - cxChild) / 2);
  71.     if (xNew < 0)
  72.     {
  73.         xNew = 0;
  74.     }
  75.     else if ((xNew + cxChild) > cxScreen)
  76.     {
  77.         xNew = cxScreen - cxChild;
  78.     }
  79.     // Calculate new Y position, then adjust for screen
  80.     yNew = rcParent.top  + ((cyParent - cyChild) / 2);
  81.     if (yNew < 0)
  82.     {
  83.         yNew = 0;
  84.     }
  85.     else if ((yNew + cyChild) > cyScreen)
  86.     {
  87.         yNew = cyScreen - cyChild;
  88.     }
  89.     // Set it, and return
  90.     return SetWindowPos(hwndChild,
  91.                         NULL,
  92.                         xNew, yNew,
  93.                         0, 0,
  94.                         SWP_NOSIZE | SWP_NOZORDER);
  95. }
  96. //
  97. //  FUNCTION: ReceiveInBox(HWND, WPARAM, LPARAM, char *, int)
  98. //
  99. //  PURPOSE:  Reads incoming data from socket
  100. //
  101. //  PARAMETERS:
  102. //    hWnd      - Handle to current window
  103. //    uParam    - WPARAM (unused)
  104. //    lParam    - LPARAM contains event (FD_READ or FD_CLOSE).
  105. //    szRBuf    - Receive Buffer
  106. //    cRBufLen  - size of Receive Buffer
  107. //
  108. //  RETURN VALUE:
  109. //
  110. //    TRUE  - Data Read
  111. //    FALSE - If FD_CLOSE message
  112. //
  113. //  COMMENTS:
  114. //
  115. //    Called if socket has data OR if it is closed.  If closed post
  116. //    WM_DISCONNECTED message.  Else read data and make sure it is
  117. //    NULL terminated.
  118. //
  119. BOOL ReceiveInBox(HWND hWnd, WPARAM uParam, LPARAM lParam, char * szRBuf, int cRBufLen)
  120. {
  121.     char * pRBuf;     // temp buf pointer
  122.     int cBytesRead;   // count of bytes actually read
  123.     
  124.     if (LOWORD(lParam) == FD_CLOSE)                   // Is this a FD_CLOSE event?
  125.     {
  126.         SendMessage(hWnd, MW_DISCONNECTED, 0, 0);     // Yes, post message
  127.         return(FALSE);
  128.     }
  129.     pRBuf = szRBuf;   // Set temp pointer
  130.     cRBufLen--;       // Save room for null terminator
  131.           
  132.     // read socket
  133.     if((cBytesRead = recv(sock, pRBuf, cRBufLen, 0)) != SOCKET_ERROR)
  134.         pRBuf += cBytesRead;    // Move temp pointer to end of buffer
  135.               
  136.     *pRBuf = 0;   // Null terminate - if recv() failed, then prBuf will 
  137.                   // point to first byte of the buffer
  138.     
  139.     return (TRUE);   // We've got a buffer to display
  140. }
  141. //
  142. //  FUNCTION: SendOutBox(char *, int)
  143. //
  144. //  PURPOSE:  Reads incoming data from socket
  145. //
  146. //  PARAMETERS:
  147. //    szSBuf    - Send Buffer
  148. //    cSBufLen  - size of Send Buffer
  149. //
  150. //  COMMENTS:
  151. //
  152. //    Writes send buffer to socket -- repeats until all data is sent.
  153. //
  154. void SendOutBox(char * szSBuf, int cSBufLen)
  155. {
  156.     char * pSBuf;
  157.     int cBytesSent;
  158.     pSBuf = szSBuf; // Set temp pointer
  159.     
  160.     while((cBytesSent = send(sock,
  161.                              pSBuf,
  162.                              cSBufLen,
  163.                              0)) != SOCKET_ERROR)
  164.     {
  165.         pSBuf += cBytesSent;
  166.         cSBufLen -= cBytesSent;
  167.         if(!cSBufLen) return;
  168.     }
  169. }
  170. //
  171. //  FUNCTION: AtoH(char *, char *, int)
  172. //
  173. //  PURPOSE:  Converts ascii string to network order hex
  174. //
  175. //  PARAMETERS:
  176. //    src    - pointer to input ascii string
  177. //    dest   - pointer to output hex
  178. //    destlen - size of dest
  179. //
  180. //  COMMENTS:
  181. //
  182. //    2 ascii bytes make a hex byte so must put 1st ascii byte of pair
  183. //    into upper nibble and 2nd ascii byte of pair into lower nibble.
  184. //
  185. void AtoH(char * src, char * dest, int destlen)
  186. {
  187.     char * srcptr;
  188.     srcptr = src;
  189.     while(destlen--)
  190.     {
  191.     *dest = BtoH(*srcptr++) << 4;    // Put 1st ascii byte in upper nibble.
  192.     *dest++ += BtoH(*srcptr++);      // Add 2nd ascii byte to above.
  193.     }
  194. }
  195. //
  196. //  FUNCTION: BtoH(char *, char *, int)
  197. //
  198. //  PURPOSE:  Converts ascii byte to numeric
  199. //
  200. //  PARAMETERS:
  201. //    ch - ascii byte to convert
  202. //
  203. //  RETURNS:
  204. //    associated numeric value
  205. //
  206. //  COMMENTS:
  207. //
  208. //    Will convert any hex ascii digit to its numeric counterpart.
  209. //    Puts in 0xff if not a valid hex digit.
  210. //
  211. unsigned char BtoH(char ch)
  212. {
  213.     if (ch >= '0' && ch <= '9') return (ch - '0');        // Handle numerals
  214.     if (ch >= 'A' && ch <= 'F') return (ch - 'A' + 0xA);  // Handle capitol hex digits
  215.     if (ch >= 'a' && ch <= 'f') return (ch - 'a' + 0xA);  // Handle small hex digits
  216.     return(255);
  217. }
  218. //
  219. //  FUNCTION: CleanUp(void)
  220. //
  221. //  PURPOSE:  Protocol specific cleanup function
  222. //
  223. //  COMMENTS:
  224. //
  225. //    Deletes our two possible sockets (they might not exist which
  226. //    just means closesocket might return an error -- we don't care).
  227. //
  228. void CleanUp(void)
  229. {
  230.     closesocket(SrvSock);  // Close our server side socket
  231.     closesocket(sock);     // Close our connection specific socket
  232.     WSACleanup();          // Nix the DLL
  233. }
  234. //
  235. //  FUNCTION: GetAddrString(PSOCKADDR_IPX, char *)
  236. //
  237. //  PURPOSE:  Converts IPX address to ascii string for displaying
  238. //
  239. //  PARAMETERS:
  240. //    pSAddr - pointer to socket address struc
  241. //    dest   - pointer to destination string
  242. //
  243. //  COMMENTS:
  244. //
  245. //    Address is in network order to use HtoA to convert to ascii.
  246. //    
  247. //    Final format is 
  248. //      <8 char network address>.<12 char node address>.<4 char sock address>
  249. //
  250. void GetAddrString(PSOCKADDR_IPX pSAddr, char * dest)
  251. {
  252.     char abuf[15];                                // temp buffer
  253.     char * currptr;                               // temp destination pointer
  254.     int saddrlen = sizeof(struct sockaddr_ipx);   // sizeof address struc
  255.     currptr = dest; // initialize destination pointer
  256.     HtoA((char *)&pSAddr->sa_netnum, abuf, 4);    // convert network number
  257.     lstrcpy(currptr, abuf);
  258.     currptr += 8;
  259.     lstrcat(currptr, ".");                        // don't forget seperator
  260.     currptr++;
  261.     
  262.     HtoA((char *)&pSAddr->sa_nodenum, abuf, 6);   // convert node number
  263.     lstrcat(currptr, abuf);
  264.     currptr += 12;
  265.     lstrcat(currptr, ".");                        // seperator
  266.     currptr++;
  267.     HtoA((char *)&pSAddr->sa_socket, abuf, 2);    // convert socket number
  268.     lstrcat(currptr, abuf);
  269.    
  270. }
  271. //
  272. //  FUNCTION: HtoA(char *, char *, int)
  273. //
  274. //  PURPOSE:  Converts network ordered hex to ascii string
  275. //
  276. //  PARAMETERS:
  277. //    src     - pointer to network ordered hex
  278. //    dest    - pointer to ascii string
  279. //    srclen  - size of hex number in bytes
  280. //
  281. //  COMMENTS:
  282. //
  283. //    1 byte hex = 2 bytes ascii so convert high order nibble with HtoB()
  284. //    then convert low order nibble. dest buffer better be 2*srclen + 1.
  285. //
  286. void HtoA(char * src, char * dest, int srclen)
  287. {
  288.     char * destptr; // temp pointers
  289.     UCHAR * srcptr;
  290.         
  291.     srcptr = (UCHAR *)src;
  292.     destptr = dest;
  293.     while(srclen--)
  294.     {
  295.     *destptr++ = HtoB((UCHAR)(*srcptr >> 4));      // Convert high order nibble
  296.     *destptr++ = HtoB((UCHAR)(*srcptr++ & 0x0F));  // Convert low order nibble
  297.     }
  298.     *destptr = 0;  // Null terminator
  299. }
  300. //
  301. //  FUNCTION: HtoB(UCHAR)
  302. //
  303. //  PURPOSE:  Converts hex byte to ascii byte
  304. //
  305. //  PARAMETERS:
  306. //    ch - Hex byte
  307. //                 
  308. //  RETURNS:
  309. //    ascii byte
  310. //
  311. //  COMMENTS:
  312. //
  313. //    We actually only convert a nibble since 1 byte hex = 2 bytes ascii.
  314. //    So if ch > 0xf we just return 'X'.
  315. //
  316. char HtoB(UCHAR ch)
  317. {
  318.     if (ch <= 9) return ('0' + ch);             // handle decimal values
  319.     if (ch <= 0xf) return ('A' + ch - 10);      // handle hexidecimal specific values
  320.     return('X');                                // Someone screwed up
  321. }
  322. //---------------------------------------------------------------------------
  323. //
  324. // FUNCTION:    GetStringRes (int id INPUT ONLY)
  325. //
  326. // COMMENTS:    Load the resource string with the ID given, and return a
  327. //              pointer to it.  Notice that the buffer is common memory so
  328. //              the string must be used before this call is made a second time.
  329. //
  330. //---------------------------------------------------------------------------
  331. LPTSTR GetStringRes (int id)
  332. {
  333.   static TCHAR buffer[MAX_PATH];
  334.   buffer[0]=0;
  335.   LoadString (GetModuleHandle (NULL), id, buffer, MAX_PATH);
  336.   return buffer;
  337. }