// operating system includes #include "windows.h" #include "winsock.h" #include "commctrl.h" // run-time library includes #include "stdio.h" #include "string.h" // helper library includes #include "..\CDC\CDC.h" // application includes #include "resource.h" #include "..\relay\cdtime.h" #include "..\relay\remote.h" // useful strings char g_szNull[] = ""; const char g_szClass[] = "NSMCDWND"; const char g_szError[] = "Error"; const char g_szPerformer[] = "Performer"; const char g_szSong[] = "Song"; const char g_szAlbum[] = "Album"; const char g_szStyle[] = "Style"; const char g_szComposer[] = "Composer"; // return from DialogBox char g_szbuf[80]; HWND g_hWnd; HINSTANCE g_hInst; SOCKET g_sock = INVALID_SOCKET; RECT g_rStatus = { 10, 10, 250, 80 }; #define Assert(x) { if (!(x)) _asm int 3 } typedef struct { unsigned short fFlags; CDTime cdtStart; CDTime cdtLength; } TRACKINFO; #define TIF_PLAYED typedef struct { unsigned long xID; unsigned short iFirst; unsigned short cTracks; CDTime cdtTotal; unsigned short fFlags; TRACKINFO * pTrackInfo; } DISCINFO; #define DIF_PRESENT 0x0001 typedef struct { unsigned short Disc; unsigned short Track; } PLAYLISTITEM; HGLOBAL g_hPlaylist = NULL; int g_cPlaylist; int g_iPlaylistCur; /////////////////////////////////////// enum { PLAY, PAUSE, STOP, NODISC, RANDOM } g_status; HANDLE CreateInheritMutex(void) { SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; return CreateMutex(&sa,FALSE,NULL); } int LVGetSelected(HWND hList) { int cItem = SendMessage(hList,LVM_GETITEMCOUNT,0,0); int i; UINT stateMask = LVIS_SELECTED; for (i=0; ih_addr,phe->h_length); if (connect(g_sock,(PSOCKADDR)&sin,sizeof(sin)) < 0) { closesocket(g_sock); MessageBox(hWnd,"connect() failed","Error",MB_OK); break; } MessageBox(hWnd,"connect() worked!","Success!", MB_OK); EnableWindow(GetDlgItem(hWnd,IDC_SKIP),TRUE); EnableWindow(GetDlgItem(hWnd,IDC_CONNECT),FALSE); } break; case IDC_SKIP: { REMOTECMD k=NextTrack; ::send(g_sock,(char *)&k,sizeof(k),0); } break; case IDC_RESTARTTRACK: { REMOTECMD k=RestartTrack; ::send(g_sock,(char *)&k,sizeof(k),0); } break; case IDC_PLAYTRACK: { char buf[80]; reqPLAYTRACK *req = (reqPLAYTRACK *)(buf+sizeof(REMOTECMD)); req->disc = GetDlgItemInt(hWnd,IDC_DISC,NULL,FALSE); req->track = GetDlgItemInt(hWnd,IDC_TRACK,NULL,FALSE); *(REMOTECMD *)buf = PlayTrack; ::send(g_sock,buf,sizeof(REMOTECMD)+sizeof(reqPLAYTRACK),0); } break; case IDC_PLAYDISC: { char buf[80]; reqPLAYDISC *req = (reqPLAYDISC *)(buf+sizeof(REMOTECMD)); req->disc = GetDlgItemInt(hWnd,IDC_DISC,NULL,FALSE); *(REMOTECMD *)buf = PlayDisc; ::send(g_sock,buf,sizeof(REMOTECMD)+sizeof(reqPLAYDISC),0); } break; case IDC_GETTRACKINFO: { REMOTECMD k=GetTrackInfo; reqGETTRACKINFO rti; char buf[200]; ::send(g_sock,(char *)&k,sizeof(k),0); ::recv(g_sock,(char *)&rti,sizeof(rti),0); wsprintf(buf,"Disc %d; track %d; Artist: %s; Disc: %s", rti.disc,rti.track,rti.szartist,rti.szdisc); MessageBox(hWnd,buf,"Track Info",MB_OK); } break; } break; case WM_DESTROY: if (g_sock != INVALID_SOCKET) closesocket(g_sock); PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, uParam, lParam); } return 0; } //////////////////////////////////////////////////////////////////////////// // // // //////////////////////////////////////////////////////////////////////////// int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { g_hInst = hInstance; InitCommonControls(); // Startup Windows sockets subsystem { WSADATA wsad; ::WSAStartup(MAKEWORD(1,1),&wsad); } WNDCLASS wc; // Fill in window class structure with parameters that describe the // main window. wc.style = 0; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1)); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); wc.lpszMenuName = NULL;//MAKEINTRESOURCE(IDR_MENU1); wc.lpszClassName = g_szClass; RegisterClass(&wc); g_hWnd = CreateWindow( g_szClass, g_szNull, WS_OVERLAPPED | WS_CAPTION, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!g_hWnd) return FALSE; ShowWindow(g_hWnd,nCmdShow); UpdateWindow(g_hWnd); MSG msg; while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } ::WSACleanup(); return 0; }