cddbdlg.c
上传用户:xmgzy123
上传日期:2007-01-07
资源大小:373k
文件大小:13k
源码类别:

SCSI/ASPI

开发平台:

WINDOWS

  1. /*
  2.  * cddbdlg.c - Copyright (C) 1999,2000 Jay A. Key
  3.  *
  4.  * CDDB options dialog for options property sheet.  CDDB servers and
  5.  * proxy server are configured here.
  6.  *
  7.  **********************************************************************
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  22.  *
  23.  */
  24. #include <windows.h>
  25. #include <windowsx.h>
  26. #include <commctrl.h>
  27. #include <winsock.h>
  28. #include "resources.h"
  29. #include "globals.h"
  30. #include "cddbdlg.h"
  31. BOOL ValidateCDDBDlg( HWND hWnd );
  32. void ConfigureCDDBDlg( HWND hWnd );
  33. void InsertCDDBQueryDialogItems( HWND hWnd, LPCDDBQUERY lpq );
  34. void DoCDDBSitesQuery( HWND hWnd );
  35. DWORD DoCDDBSitesQueryThread( LPVOID lpParam );
  36. BOOL CALLBACK CDDBSiteQueryDlgProc( HWND hWnd, UINT uMsg, WPARAM wParam,
  37.     LPARAM lParam );
  38. void FinishCDDBSitesQuery( HWND hWnd, BOOL bCancelled );
  39. void InsertSites( HWND hWnd );
  40. void SetCDDBServer( HWND hWnd );
  41. // save old settings for output dialog config
  42. static BOOL bInInit = FALSE;
  43. static BOOL bTmpUseProxy;
  44. static BOOL bInCDDBSitesQuery = FALSE;
  45. static char szTmpCDDBServer[81];
  46. static char szTmpProxyAddr[81];
  47. static char szTmpCGI[81];
  48. static int  iTmpHTTPPort;
  49. static CDDBSITE sites[8];
  50. static int numSites = 0;
  51. static const CDDBSITE defSites[2] = {
  52.   { "www.cddb.com", TRUE, 80, "/~cddb/cddb.cgi", "", "", "" },
  53.   { "www.freedb.org", TRUE, 80, "/~cddb/cddb.cgi", "", "", "" }
  54. };
  55. static int iTmpProxyPort;
  56. /*
  57.  * Called in response to PSN_KILLACTIVE.  Should validate all values in the
  58.  * dialog, and save them to the temp variables.
  59.  */
  60. BOOL ValidateCDDBDlg( HWND hWnd )
  61. {
  62.   iTmpProxyPort = GetDlgItemInt( hWnd, IDE_PROXYPORT, NULL, FALSE );
  63.   GetDlgItemText( hWnd, IDE_PROXYSRVR, szTmpProxyAddr, 81 );
  64.   GetDlgItemText( hWnd, IDE_CDDBSERVER, szTmpCDDBServer, 81 );
  65.   GetDlgItemText( hWnd, IDE_CDDBCGI, szTmpCGI, 81 );
  66.   return TRUE;
  67. }
  68. /*
  69.  * Called in response to PSN_SETACTIVE.  Sets dialog items with the values
  70.  * from the temp variables.
  71.  */
  72. void ConfigureCDDBDlg( HWND hWnd )
  73. {
  74.   bInInit = FALSE;
  75.   // if a CDDB operation is active, disable everything in this dialog
  76.   CheckDlgButton( hWnd, IDCKB_USEPROXY, bTmpUseProxy?BST_CHECKED:BST_UNCHECKED );
  77.   SendDlgItemMessage( hWnd, IDE_PROXYSRVR, EM_SETLIMITTEXT, 80, 0L );
  78.   SetDlgItemText( hWnd, IDE_PROXYSRVR, szTmpProxyAddr );
  79.   SendDlgItemMessage( hWnd, IDE_PROXYPORT, EM_SETLIMITTEXT, 5, 0L );
  80.   SetDlgItemInt( hWnd, IDE_PROXYPORT, iTmpProxyPort, FALSE );
  81.   SendDlgItemMessage( hWnd, IDE_CDDBSERVER, EM_SETLIMITTEXT, 80, 0L );
  82.   SendDlgItemMessage( hWnd, IDE_CDDBCGI, EM_SETLIMITTEXT, 80, 0L );
  83.   SetDlgItemText( hWnd, IDE_CDDBSERVER, szTmpCDDBServer );
  84.   SetDlgItemText( hWnd, IDE_CDDBCGI, szTmpCGI );
  85.   // for now both buttons are disabled
  86.   SendDlgItemMessage( hWnd, IDBN_SELECTCDDB, WM_ENABLE, 0, 0L );
  87.   SendDlgItemMessage( hWnd, IDBN_RESETCDDB, WM_ENABLE, 0, 0L );
  88.   // sets the dialog's items with the temporary values.
  89.   if ( bInCDDBQuery )
  90.     {
  91.       SendDlgItemMessage( hWnd, IDE_CDDBSERVER, WM_ENABLE, 0, 0L );
  92.       SendDlgItemMessage( hWnd, IDBN_SELECTCDDB, WM_ENABLE, 0, 0L );
  93.       SendDlgItemMessage( hWnd, IDLB_SERVERLIST, WM_ENABLE, 0, 0L );
  94.       SendDlgItemMessage( hWnd, IDBN_RESETCDDB, WM_ENABLE, 0, 0L );
  95.       SendDlgItemMessage( hWnd, IDCKB_USEPROXY, WM_ENABLE, 0, 0L );
  96.       SendDlgItemMessage( hWnd, IDE_PROXYSRVR, WM_ENABLE, 0, 0L );
  97.       SendDlgItemMessage( hWnd, IDE_PROXYPORT, WM_ENABLE, 0, 0L );
  98.     }
  99.   if ( numSites == 0 )
  100.     {
  101.       numSites = 2;
  102.       sites[0] = defSites[0];
  103.       sites[1] = defSites[1];
  104.     }
  105.   InsertSites( hWnd );
  106.   bInInit = TRUE;
  107. }
  108. BOOL CALLBACK CDDBDlgProc( HWND hWnd, UINT uMsg, WPARAM wParam,
  109.      LPARAM lParam )
  110. {
  111.   //  char buf[81];
  112.   NMHDR *l = (NMHDR *)lParam;
  113.   WORD wID;
  114.   WORD wNotify;
  115.   BOOL bChanged;
  116.   switch( uMsg )
  117.     {
  118.     case WM_INITDIALOG:
  119.       //hOutDlg = hWnd;
  120.       break;
  121.     case WM_COMMAND:
  122.       wID = LOWORD( wParam );
  123.       wNotify = HIWORD( wParam );
  124.       bChanged = TRUE;
  125.       switch( wID )
  126. {
  127. case IDCKB_USEPROXY:
  128.   bTmpUseProxy = !bTmpUseProxy;
  129.   break;
  130. case IDE_PROXYPORT:
  131. case IDE_PROXYSRVR:
  132. case IDE_CDDBSERVER:
  133. case IDE_CDDBCGI:
  134.   if ( wNotify != EN_CHANGE )
  135.     bChanged = FALSE;
  136.   break;
  137. case IDLB_SERVERLIST:
  138.   if ( wNotify == LBN_DBLCLK )
  139.     {
  140.       SetCDDBServer( hWnd );
  141.       //SetFocus( GetDlgItem( hWnd, IDE_CDDBSERVER ) );
  142.     }
  143.   break;
  144. case IDBN_SELECTCDDB:
  145.   // Start the sites query
  146.   DialogBox( ghInstance, "CDDBSiteQueryDialog", hWnd, (DLGPROC)CDDBSiteQueryDlgProc );
  147.   InsertSites( hWnd );
  148.   bChanged = FALSE;
  149.   break;
  150. case IDBN_RESETCDDB:
  151.   numSites = 2;
  152.   InsertSites( hWnd );
  153.   bChanged = FALSE;
  154.   break;
  155. default:
  156.   bChanged = FALSE;
  157.   break;
  158. }
  159.       if ( bInInit && bChanged )
  160. SendMessage( (HWND)GetWindowLong( hWnd, GWL_HWNDPARENT ),
  161.      PSM_CHANGED, (WPARAM)hWnd, 0L );
  162.       break;
  163.     case WM_NOTIFY:
  164.       switch( l->code )
  165. {
  166. case PSN_SETACTIVE:  // sent before page is shown
  167.   ConfigureCDDBDlg( hWnd );
  168.   break;
  169. case PSN_KILLACTIVE:  //losing focus
  170.   if ( ValidateCDDBDlg( hWnd ) )
  171.     // ok to lose focus
  172.     SetWindowLong( hWnd, DWL_MSGRESULT, FALSE );
  173.   else
  174.     {
  175.       // don't use allow loss of focus
  176.       SetWindowLong( hWnd, DWL_MSGRESULT, TRUE );
  177.       return TRUE;
  178.     }
  179.   break;
  180. case PSN_QUERYCANCEL:
  181.   break;
  182. case PSN_APPLY:
  183.   // copy temp vars to global vars
  184.   bUseProxy = bTmpUseProxy;
  185.   lstrcpy( szProxyAddr, szTmpProxyAddr );
  186.   lstrcpy( szCGI, szTmpCGI );
  187.   lstrcpy( szCDDBServer, szTmpCDDBServer );
  188.   iProxyPort = iTmpProxyPort;
  189.   break;
  190. case PSN_HELP:
  191.   break;
  192. case PSN_RESET:
  193.   break;
  194. default:
  195.   break;
  196. }
  197.       break;
  198.     }
  199.   return FALSE;
  200. }
  201. /*
  202.  * Used to initialize the values in the dialog.  If bGet is TRUE, values are
  203.  * read and stored in tmp variables.  Otherwise, the values of the tmp vars
  204.  * are written to the dialogs values.
  205.  */
  206. void GetSetCDDBDlgCurrentVals( BOOL bGet )
  207. {
  208.   if ( bGet )
  209.     {
  210.       bTmpUseProxy = bUseProxy;
  211.       lstrcpy( szTmpProxyAddr, szProxyAddr );
  212.       iTmpProxyPort = iProxyPort;
  213.       lstrcpy( szTmpCGI, szCGI );
  214.       lstrcpy( szTmpCDDBServer, szCDDBServer );
  215.       iTmpHTTPPort = iHTTPPort;
  216.     }
  217.   else
  218.     {
  219.       bUseProxy = bTmpUseProxy;
  220.       lstrcpy( szProxyAddr, szTmpProxyAddr );
  221.       lstrcpy( szCGI, szTmpCGI );
  222.       lstrcpy( szCDDBServer, szTmpCDDBServer );
  223.       iProxyPort = iTmpProxyPort;
  224.       iHTTPPort = iTmpHTTPPort;
  225.     }
  226. }
  227. BOOL CALLBACK MultipleCDDBQueryDlgProc( HWND hWnd, UINT uMsg, WPARAM wParam,
  228. LPARAM lParam )
  229. {
  230.   WORD wID;
  231.   WORD wNotify;
  232.   LPCDDBQUERY lpq;
  233.   if ( uMsg != WM_INITDIALOG )
  234.     lpq = (LPCDDBQUERY)GetWindowLong( hWnd, GWL_USERDATA );
  235.   switch( uMsg )
  236.     {
  237.     case WM_INITDIALOG:
  238.       lpq = (LPCDDBQUERY)lParam;
  239.       InsertCDDBQueryDialogItems( hWnd, lpq );
  240.       SetWindowLong( hWnd, GWL_USERDATA, (LONG)lpq );
  241.       lpq->num = 0;  // default to the first entry
  242.       break;
  243.     case WM_COMMAND:
  244.       wID = LOWORD( wParam );
  245.       wNotify = HIWORD( wParam );
  246.       switch( wID )
  247. {
  248. case IDBN_CDDBQUERYOK:
  249.   lpq->num = SendDlgItemMessage( hWnd, IDLB_CDDBQUERYSELECT,
  250.  LB_GETCURSEL, 0, 0L );
  251.   EndDialog( hWnd, 1 );
  252.   break;
  253. case IDBN_CDDBQUERYCNCL:
  254.   lpq->num = -1;
  255.   EndDialog( hWnd, 0 );
  256.   break;
  257. }
  258.       break;
  259.     }
  260.   return FALSE;
  261. }
  262. void InsertCDDBQueryDialogItems( HWND hWnd, LPCDDBQUERY lpq )
  263. {
  264.   int i;
  265.   char buf[256];
  266.   for( i = 0; i < lpq->num; i++ )
  267.     {
  268.       wsprintf( buf, "%s %s %s / %s", lpq->q[i].categ, lpq->q[i].cddbId,
  269. lpq->q[i].artist, lpq->q[i].title );
  270.       SendDlgItemMessage( hWnd, IDLB_CDDBQUERYSELECT, LB_ADDSTRING,
  271.      0, (LPARAM)buf );
  272.     }
  273.   if ( lpq->num )
  274.     SendDlgItemMessage( hWnd, IDLB_CDDBQUERYSELECT, LB_SETCURSEL, 0, 0L );
  275. }
  276. #define WM_SITEQUERYDONE   (WM_USER+1001)
  277. BOOL CALLBACK CDDBSiteQueryDlgProc( HWND hWnd, UINT uMsg, WPARAM wParam,
  278.     LPARAM lParam )
  279. {
  280.   static BOOL bCancelled;
  281.   HWND hEdit;
  282.   WORD wID;
  283.   switch( uMsg )
  284.     {
  285.     case WM_COMMAND:
  286.       wID = LOWORD( wParam );
  287.       switch( wID )
  288. {
  289. case IDBN_SITEQUERYCANCEL:
  290.   WSACancelBlockingCall();
  291.   break;
  292. }
  293.       break;
  294.     case WM_CTLCOLORSTATIC:
  295.       hEdit = GetDlgItem( hWnd, IDE_SITEQUERY );
  296.       if ( hEdit == (HWND)lParam )
  297. {
  298.   OutputDebugString( "WM_CTLCOLORSTATIC" );
  299.   //SetBkColor( (HDC)wParam, RGB(255,255,255) );
  300.   //SetTextColor( (HDC)wParam, RGB(0,0,0) );
  301.   //SetDlgMsgResult( hWnd, uMsg, GetStockObject( WHITE_BRUSH ) );
  302. }
  303.       break;
  304.     case WM_CTLCOLOREDIT:
  305.       //SetWindowLong( hWnd, DWL_MSGRESULT, NULL );
  306.       OutputDebugString( "WM_CTLCOLOREDIT" );
  307.       //SetBkColor( (HDC)wParam, RGB(255,255,255) );
  308.       //SetTextColor( (HDC)wParam, RGB(0,0,0) );
  309.       break;
  310.     case WM_INITDIALOG:
  311.       bCancelled = FALSE;
  312.       SendDlgItemMessage( hWnd, IDE_SITEQUERY, EM_SETREADONLY,
  313.   (WPARAM)TRUE, 0L );
  314.       DoCDDBSitesQuery( hWnd );
  315.       break;
  316.     case WM_SITEQUERYDONE:
  317.       FinishCDDBSitesQuery( hWnd, bCancelled );
  318.       EndDialog( hWnd, 1 );
  319.       break;
  320.     default:
  321.       return FALSE;
  322.     }
  323.   return TRUE;
  324. }
  325. void DoCDDBSitesQuery( HWND hWnd )
  326. {
  327.   DWORD dwThreadID;
  328.   LPCDDBSITELIST lps;
  329.   bInCDDBSitesQuery = TRUE;
  330.   lps = (LPCDDBSITELIST)GlobalAlloc( GPTR, sizeof(CDDBSITELIST) );
  331.   lps->s = (LPCDDBSITE)GlobalAlloc( GPTR, sizeof(CDDBSITE) * 8 );
  332.   lps->num = 8;
  333.   SetWindowLong( hWnd, GWL_USERDATA, (LONG)lps );
  334.   CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)DoCDDBSitesQueryThread,
  335. (LPVOID)hWnd, 0, &dwThreadID );
  336. }
  337. DWORD DoCDDBSitesQueryThread( LPVOID lpParam )
  338. {
  339.   LPCDDBSITELIST lps;
  340.   HWND hWnd;
  341.   char *logBuf, *p;
  342.   hWnd = (HWND)lpParam;
  343.   lps = (LPCDDBSITELIST)GetWindowLong( hWnd, GWL_USERDATA );;
  344.   p = logBuf = (char *)GlobalAlloc( GPTR, 4096 );
  345.   ZeroMemory( logBuf, 4096 );
  346.   CDDBSetOption( CDDB_OPT_SERVER, szCDDBServer, 0 );
  347.   CDDBSetOption( CDDB_OPT_CGI, szCGI, 0 );
  348.   CDDBSetOption( CDDB_OPT_USEPROXY, "", bUseProxy );
  349.   if ( bUseProxy )
  350.     {
  351.       CDDBSetOption( CDDB_OPT_PROXY, szProxyAddr, 0 );
  352.       CDDBSetOption( CDDB_OPT_PROXYPORT, "", iProxyPort );
  353.     }
  354.   CDDBSetOption( CDDB_OPT_USER, "user@akrip.sourceforge.net", 0 );
  355.   CDDBSetOption( CDDB_OPT_AGENT, "xtractor 0.13", 0 );
  356.   CDDBSetOption( CDDB_OPT_HTTPPORT, "", iHTTPPort );
  357.   wsprintf( p, "Contacting CDDB server "%s:%d%s"rn", szCDDBServer, 80,
  358.     szCGI );
  359.   p += lstrlen( p );
  360.   if ( bUseProxy )
  361.     {
  362.       wsprintf( p, "via proxy "%s:%d"rn", szProxyAddr, iProxyPort );
  363.       p += lstrlen( p );
  364.     }
  365.   SendDlgItemMessage( hWnd, IDE_SITEQUERY, WM_SETTEXT, 0, (LPARAM)logBuf );
  366.   SendDlgItemMessage( hWnd, IDE_SITEQUERY, EM_SETSEL, (WPARAM)(-1), (LPARAM)logBuf );
  367.   CDDBGetServerList( lps );
  368.   bInCDDBSitesQuery = FALSE;
  369.   PostMessage( hWnd, WM_SITEQUERYDONE, 0, 0L );
  370.   GlobalFree( (HGLOBAL)logBuf );
  371.   return 0;
  372. }
  373. /*
  374.  * If not cancelled, place the returned sites in the parent dialog's
  375.  * sitelist
  376.  */
  377. void FinishCDDBSitesQuery( HWND hWnd, BOOL bCancelled )
  378. {
  379.   LPCDDBSITELIST lps;
  380.   int i;
  381.   //char buf[256];
  382.   lps = (LPCDDBSITELIST)GetWindowLong( hWnd, GWL_USERDATA );
  383.   if ( !bCancelled )
  384.     {
  385.       // add www.cddb.com and www.freedb.org
  386.       sites[0] = defSites[0];
  387.       sites[1] = defSites[1];
  388.       // add the rest
  389.       for( i = 0, numSites = 2; i < lps->num && numSites < 8; i++ )
  390. {
  391.   if ( lps->s[i].bHTTP &&
  392.        lstrcmp( lps->s[i].szServer, "www.cddb.com" ) &&
  393.        lstrcmp( lps->s[i].szServer, "www.freedb.org" ) )
  394.     {
  395.       sites[numSites] = lps->s[i];
  396.       numSites++;
  397.     }
  398. }
  399.       // display them in the listbox
  400.     }
  401.   GlobalFree( (HGLOBAL)lps->s );
  402.   GlobalFree( (HGLOBAL)lps );
  403. }
  404. void InsertSites( HWND hWnd )
  405. {
  406.   char buf[256];
  407.   int i;
  408.   // clear the list
  409.   SendDlgItemMessage( hWnd, IDLB_SERVERLIST, LB_RESETCONTENT, 0, 0L );
  410.   for( i = 0; i < numSites; i++ )
  411.     {
  412.       LONG lErr;
  413.       
  414.       //server:port cgi location
  415.       wsprintf( buf, "%s:%d %s %s", sites[i].szServer, sites[i].iPort,
  416. sites[i].szCGI, sites[i].szLocation );
  417.       lErr = SendDlgItemMessage( hWnd, IDLB_SERVERLIST, LB_ADDSTRING,
  418.  0, (LPARAM)buf );
  419.       
  420.       if ( lErr == LB_ERR )
  421. wsprintf( buf, "GetLastError() == %d", GetLastError() );
  422.     }
  423. }
  424. void SetCDDBServer( HWND hWnd )
  425. {
  426.   int i;
  427.   i = SendDlgItemMessage( hWnd, IDLB_SERVERLIST, LB_GETCURSEL, 0, 0L );
  428.   if ( i == LB_ERR )
  429.     return;
  430.   SendDlgItemMessage( hWnd, IDE_CDDBSERVER, WM_SETTEXT, 0, (LPARAM)sites[i].szServer );
  431.   SendDlgItemMessage( hWnd, IDE_CDDBCGI, WM_SETTEXT, 0, (LPARAM)sites[i].szCGI );
  432.   iTmpHTTPPort = sites[i].iPort;
  433. }