Revisão | 0fb421d21251117d91eec0554b0d0ea1df525d33 (tree) |
---|---|
Hora | 2008-08-18 22:33:25 |
Autor | eru <eru01@user...> |
Commiter | eru |
SEH実装(一般保護例外対策)
@@ -140,6 +140,7 @@ ServMgr::ServMgr() | ||
140 | 140 | |
141 | 141 | topmostGui = false; |
142 | 142 | startWithGui = false; |
143 | + preventSS = false; | |
143 | 144 | |
144 | 145 | chanLog=""; |
145 | 146 |
@@ -1106,6 +1107,7 @@ void ServMgr::saveSettings(const char *fn) | ||
1106 | 1107 | |
1107 | 1108 | iniFile.writeBoolValue("topmostGui", servMgr->topmostGui); |
1108 | 1109 | iniFile.writeBoolValue("startWithGui", servMgr->startWithGui); |
1110 | + iniFile.writeBoolValue("preventSS", servMgr->preventSS); | |
1109 | 1111 | #endif |
1110 | 1112 | int i; |
1111 | 1113 |
@@ -1517,12 +1519,11 @@ void ServMgr::loadSettings(const char *fn) | ||
1517 | 1519 | servMgr->guiAntennaNotifyIcon = iniFile.getBoolValue(); |
1518 | 1520 | |
1519 | 1521 | else if (iniFile.isName("topmostGui")) |
1520 | - { | |
1521 | 1522 | servMgr->topmostGui = iniFile.getBoolValue(); |
1522 | - } else if (iniFile.isName("startWithGui")) | |
1523 | - { | |
1523 | + else if (iniFile.isName("startWithGui")) | |
1524 | 1524 | servMgr->startWithGui = iniFile.getBoolValue(); |
1525 | - } | |
1525 | + else if (iniFile.isName("preventSS")) | |
1526 | + servMgr->preventSS = iniFile.getBoolValue(); | |
1526 | 1527 | #endif |
1527 | 1528 | |
1528 | 1529 | // debug |
@@ -419,6 +419,7 @@ public: | ||
419 | 419 | |
420 | 420 | bool topmostGui; // 最前面 |
421 | 421 | bool startWithGui; // 起動時にGUI |
422 | + bool preventSS; // スクリーンセーバーを抑止 | |
422 | 423 | |
423 | 424 | int maxRelaysIndexTxt; // for PCRaw (relay) |
424 | 425 |
@@ -44,9 +44,9 @@ extern int version_ex; // PP | ||
44 | 44 | #if 1 /* for VP extend version */ |
45 | 45 | //#define VERSION_EX 1 |
46 | 46 | static const char *PCP_CLIENT_VERSION_EX_PREFIX = "IM"; // 2bytes only |
47 | -static const int PCP_CLIENT_VERSION_EX_NUMBER = 27; | |
48 | -static const char *PCX_AGENTEX = "PeerCast/0.1218(IM0027-5-2)"; | |
49 | -static const char *PCX_VERSTRING_EX = "v0.1218(IM0027-5-2)"; | |
47 | +static const int PCP_CLIENT_VERSION_EX_NUMBER = 28; | |
48 | +static const char *PCX_AGENTEX = "PeerCast/0.1218(IM0028)"; | |
49 | +static const char *PCX_VERSTRING_EX = "v0.1218(IM0028)"; | |
50 | 50 | #endif |
51 | 51 | |
52 | 52 | // ------------------------------------------------ |
@@ -3,3 +3,6 @@ | ||
3 | 3 | |
4 | 4 | ・リレー上限チェック |
5 | 5 | bool Channel::isFull(); (channel.cpp) |
6 | + | |
7 | +・下流への転送 | |
8 | + void Servent::sendPCPChannel() |
@@ -80,6 +80,7 @@ ULONG_PTR gdiplusToken; | ||
80 | 80 | extern Stats stats; |
81 | 81 | ThreadInfo trafficDlgThread; |
82 | 82 | HWND trafficDlg = NULL; |
83 | +FileStream fs; | |
83 | 84 | |
84 | 85 | // プロトタイプ宣言 |
85 | 86 | void createGUI(HWND); |
@@ -178,20 +179,19 @@ HWND chWnd=NULL; | ||
178 | 179 | void LOG2(const char *fmt,...) |
179 | 180 | { |
180 | 181 | va_list ap; |
181 | - va_start(ap, fmt); | |
182 | + va_start(ap, fmt); | |
182 | 183 | char str[4096]; |
183 | 184 | vsprintf(str,fmt,ap); |
184 | 185 | OutputDebugString(str); |
185 | - va_end(ap); | |
186 | + va_end(ap); | |
186 | 187 | } |
187 | 188 | |
188 | 189 | |
189 | - | |
190 | -// --------------------------------------- | |
191 | -int APIENTRY WinMain(HINSTANCE hInstance, | |
192 | - HINSTANCE hPrevInstance, | |
193 | - LPSTR lpCmdLine, | |
194 | - int nCmdShow) | |
190 | +// -------------------------------------------------- | |
191 | +int WinMainDummy(HINSTANCE hInstance, | |
192 | + HINSTANCE hPrevInstance, | |
193 | + LPSTR lpCmdLine, | |
194 | + int nCmdShow) | |
195 | 195 | { |
196 | 196 | #ifdef _DEBUG |
197 | 197 | // memory leak check |
@@ -270,7 +270,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, | ||
270 | 270 | *end = 0; |
271 | 271 | } |
272 | 272 | |
273 | - | |
273 | + | |
274 | 274 | if (strnicmp(tmpURL,"peercast://",11)==0) |
275 | 275 | { |
276 | 276 | if (strnicmp(tmpURL+11,"pls/",4)==0) |
@@ -295,13 +295,13 @@ int APIENTRY WinMain(HINSTANCE hInstance, | ||
295 | 295 | if (!allowMulti) |
296 | 296 | { |
297 | 297 | HANDLE mutex = CreateMutex(NULL,TRUE,szWindowClass); |
298 | - | |
298 | + | |
299 | 299 | if (GetLastError() == ERROR_ALREADY_EXISTS) |
300 | 300 | { |
301 | 301 | HWND oldWin = FindWindow(szWindowClass,NULL); |
302 | 302 | if (oldWin) |
303 | 303 | { |
304 | - //SendMessage(oldWin,WM_SHOWGUI,0,0); | |
304 | + //SendMessage(oldWin,WM_SHOWGUI,0,0); | |
305 | 305 | if (killMe) |
306 | 306 | { |
307 | 307 | SendMessage(oldWin,WM_DESTROY,0,0); |
@@ -326,7 +326,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, | ||
326 | 326 | |
327 | 327 | if (killMe) |
328 | 328 | return 0; |
329 | - | |
329 | + | |
330 | 330 | MyRegisterClass(hInstance); |
331 | 331 | MyRegisterClass2(hInstance); |
332 | 332 |
@@ -390,7 +390,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, | ||
390 | 390 | } |
391 | 391 | } |
392 | 392 | |
393 | - Shell_NotifyIcon(NIM_DELETE, (NOTIFYICONDATA*)&trayIcon); | |
393 | + Shell_NotifyIcon(NIM_DELETE, (NOTIFYICONDATA*)&trayIcon); | |
394 | 394 | |
395 | 395 | peercastInst->saveSettings(); |
396 | 396 | peercastInst->quit(); |
@@ -401,6 +401,242 @@ int APIENTRY WinMain(HINSTANCE hInstance, | ||
401 | 401 | } |
402 | 402 | |
403 | 403 | |
404 | +// --------------------------------------- | |
405 | +int APIENTRY WinMain(HINSTANCE hInstance, | |
406 | + HINSTANCE hPrevInstance, | |
407 | + LPSTR lpCmdLine, | |
408 | + int nCmdShow) | |
409 | +{ | |
410 | + // SEH handling | |
411 | + __try | |
412 | + { | |
413 | +#if 0 | |
414 | +#ifdef _DEBUG | |
415 | + // memory leak check | |
416 | + ::_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); | |
417 | +#endif | |
418 | + | |
419 | + char tmpURL[8192]; | |
420 | + tmpURL[0]=0; | |
421 | + char *chanURL=NULL; | |
422 | + | |
423 | + hInst = hInstance; | |
424 | + | |
425 | + version_ex = 1; // PP版拡張機能を無効に←大嘘。バージョン表記をEXに | |
426 | + | |
427 | + iniFileName.set(".\\peercast.ini"); | |
428 | + | |
429 | + WIN32_FIND_DATA fd; //JP-EX | |
430 | + HANDLE hFind; //JP-EX | |
431 | + | |
432 | + OSVERSIONINFO osInfo; //JP-EX | |
433 | + osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); //JP-EX | |
434 | + GetVersionEx(&osInfo); | |
435 | + if (osInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) | |
436 | + winDistinctionNT = true; | |
437 | + else | |
438 | + winDistinctionNT = false; | |
439 | + | |
440 | + // off by default now | |
441 | + showGUI = false; | |
442 | + | |
443 | + if (strlen(lpCmdLine) > 0) | |
444 | + { | |
445 | + char *p; | |
446 | + if ((p = strstr(lpCmdLine,"-inifile"))!=NULL) | |
447 | + iniFileName.setFromString(p+8); | |
448 | + | |
449 | + if (strstr(lpCmdLine,"-zen")) | |
450 | + showGUI = false; | |
451 | + | |
452 | + if (strstr(lpCmdLine,"-multi")) | |
453 | + allowMulti = true; | |
454 | + | |
455 | + if (strstr(lpCmdLine,"-kill")) | |
456 | + killMe = true; | |
457 | + | |
458 | + if ((p = strstr(lpCmdLine,"-url"))!=NULL) | |
459 | + { | |
460 | + p+=4; | |
461 | + while (*p) | |
462 | + { | |
463 | + if (*p=='"') | |
464 | + { | |
465 | + p++; | |
466 | + break; | |
467 | + } | |
468 | + if (*p != ' ') | |
469 | + break; | |
470 | + p++; | |
471 | + } | |
472 | + if (*p) | |
473 | + strncpy(tmpURL,p,sizeof(tmpURL)-1); | |
474 | + } | |
475 | + } | |
476 | + | |
477 | + // get current path | |
478 | + { | |
479 | + exePath = iniFileName; | |
480 | + char *s = exePath.cstr(); | |
481 | + char *end = NULL; | |
482 | + while (*s) | |
483 | + { | |
484 | + if (*s++ == '\\') | |
485 | + end = s; | |
486 | + } | |
487 | + if (end) | |
488 | + *end = 0; | |
489 | + } | |
490 | + | |
491 | + | |
492 | + if (strnicmp(tmpURL,"peercast://",11)==0) | |
493 | + { | |
494 | + if (strnicmp(tmpURL+11,"pls/",4)==0) | |
495 | + chanURL = tmpURL+11+4; | |
496 | + else | |
497 | + chanURL = tmpURL+11; | |
498 | + showGUI = false; | |
499 | + } | |
500 | + | |
501 | + | |
502 | + MSG msg; | |
503 | + HACCEL hAccelTable; | |
504 | + | |
505 | + // Initialize global strings | |
506 | + //LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); | |
507 | + //LoadString(hInstance, IDC_APP_TITLE, szWindowClass, MAX_LOADSTRING); | |
508 | + | |
509 | + strcpy(szTitle,"PeerCast"); | |
510 | + strcpy(szWindowClass,"PeerCast"); | |
511 | + strcpy(szWindowClass2,"Main"); | |
512 | + | |
513 | + if (!allowMulti) | |
514 | + { | |
515 | + HANDLE mutex = CreateMutex(NULL,TRUE,szWindowClass); | |
516 | + | |
517 | + if (GetLastError() == ERROR_ALREADY_EXISTS) | |
518 | + { | |
519 | + HWND oldWin = FindWindow(szWindowClass,NULL); | |
520 | + if (oldWin) | |
521 | + { | |
522 | + //SendMessage(oldWin,WM_SHOWGUI,0,0); | |
523 | + if (killMe) | |
524 | + { | |
525 | + SendMessage(oldWin,WM_DESTROY,0,0); | |
526 | + return 0; | |
527 | + } | |
528 | + | |
529 | + if (chanURL) | |
530 | + { | |
531 | + COPYDATASTRUCT copy; | |
532 | + copy.dwData = WM_PLAYCHANNEL; | |
533 | + copy.cbData = strlen(chanURL)+1; // plus null term | |
534 | + copy.lpData = chanURL; | |
535 | + SendMessage(oldWin,WM_COPYDATA,NULL,(LPARAM)©); | |
536 | + }else{ | |
537 | + if (showGUI) | |
538 | + SendMessage(oldWin,WM_SHOWGUI,0,0); | |
539 | + } | |
540 | + } | |
541 | + return 0; | |
542 | + } | |
543 | + } | |
544 | + | |
545 | + if (killMe) | |
546 | + return 0; | |
547 | + | |
548 | + MyRegisterClass(hInstance); | |
549 | + MyRegisterClass2(hInstance); | |
550 | + | |
551 | + // Perform application initialization: | |
552 | + if (!InitInstance (hInstance, nCmdShow)) | |
553 | + return FALSE; | |
554 | + | |
555 | + peercastInst = new MyPeercastInst(); | |
556 | + peercastApp = new MyPeercastApp(); | |
557 | + | |
558 | + peercastInst->init(); | |
559 | + | |
560 | + LOG_DEBUG("Set OS Type: %s",winDistinctionNT?"WinNT":"Win9x"); | |
561 | + | |
562 | + if (peercastApp->clearTemp()) //JP-EX | |
563 | + { | |
564 | + DeleteFile("play.pls"); | |
565 | + hFind = FindFirstFile("*.asx",&fd); | |
566 | + if (hFind != INVALID_HANDLE_VALUE) | |
567 | + { | |
568 | + do | |
569 | + { | |
570 | + DeleteFile((char *)&fd.cFileName); | |
571 | + } | |
572 | + while (FindNextFile(hFind,&fd)); | |
573 | + | |
574 | + FindClose(hFind); | |
575 | + } | |
576 | + } | |
577 | + | |
578 | + if (chanURL) | |
579 | + { | |
580 | + ChanInfo info; | |
581 | + servMgr->procConnectArgs(chanURL,info); | |
582 | + chanMgr->findAndPlayChannel(info,false); | |
583 | + } | |
584 | + | |
585 | + hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_SIMPLE); | |
586 | + | |
587 | + // setup menu notifes | |
588 | + int mask = peercastInst->getNotifyMask(); | |
589 | + if (mask & ServMgr::NT_PEERCAST) | |
590 | + CheckMenuItem(trayMenu,ID_POPUP_SHOWMESSAGES_PEERCAST,MF_CHECKED|MF_BYCOMMAND); | |
591 | + if (mask & ServMgr::NT_BROADCASTERS) | |
592 | + CheckMenuItem(trayMenu,ID_POPUP_SHOWMESSAGES_BROADCASTERS,MF_CHECKED|MF_BYCOMMAND); | |
593 | + if (mask & ServMgr::NT_TRACKINFO) | |
594 | + CheckMenuItem(trayMenu,ID_POPUP_SHOWMESSAGES_TRACKINFO,MF_CHECKED|MF_BYCOMMAND); | |
595 | + | |
596 | + if (servMgr->startWithGui) | |
597 | + { | |
598 | + createGUI((HWND)0); | |
599 | + } | |
600 | + | |
601 | + // Main message loop: | |
602 | + while (GetMessage(&msg, NULL, 0, 0)) | |
603 | + { | |
604 | + if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) | |
605 | + { | |
606 | + TranslateMessage(&msg); | |
607 | + DispatchMessage(&msg); | |
608 | + } | |
609 | + } | |
610 | + | |
611 | + Shell_NotifyIcon(NIM_DELETE, (NOTIFYICONDATA*)&trayIcon); | |
612 | + | |
613 | + peercastInst->saveSettings(); | |
614 | + peercastInst->quit(); | |
615 | + | |
616 | + Gdiplus::GdiplusShutdown(gdiplusToken); | |
617 | + | |
618 | + return msg.wParam; | |
619 | +#endif | |
620 | + WinMainDummy(hInstance, hPrevInstance, lpCmdLine, nCmdShow); | |
621 | + | |
622 | + } __except(EXCEPTION_EXECUTE_HANDLER) | |
623 | + { | |
624 | + fs.openWriteReplace(".\\dump.html"); | |
625 | + sys->logBuf->dumpHTML(fs); | |
626 | + fs.close(); | |
627 | + | |
628 | + MessageBox(NULL, "一般保護違反の為、プログラムは強制終了されます。\n" | |
629 | + "問題解決のためにダンプデータ(dump.html)を提供してください。", "SEH", | |
630 | + MB_OK|MB_ICONWARNING); | |
631 | + | |
632 | + return GetExceptionCode(); | |
633 | + } | |
634 | + | |
635 | + // dummy | |
636 | + return 0; | |
637 | +} | |
638 | + | |
639 | + | |
404 | 640 | |
405 | 641 | // |
406 | 642 | // FUNCTION: MyRegisterClass() |
@@ -1037,6 +1273,15 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) | ||
1037 | 1273 | CheckMenuItem(trayMenu, ID_POPUP_START_WITH_GUI, MF_UNCHECKED|MF_BYCOMMAND); |
1038 | 1274 | } |
1039 | 1275 | |
1276 | + // スクリーンセーバー抑止 | |
1277 | + if (servMgr->preventSS) | |
1278 | + { | |
1279 | + CheckMenuItem(trayMenu, ID_POPUP_PREVENT_SS, MF_CHECKED|MF_BYCOMMAND); | |
1280 | + } else | |
1281 | + { | |
1282 | + CheckMenuItem(trayMenu, ID_POPUP_PREVENT_SS, MF_UNCHECKED|MF_BYCOMMAND); | |
1283 | + } | |
1284 | + | |
1040 | 1285 | SetForegroundWindow(hWnd); |
1041 | 1286 | bool skipMenu=false; |
1042 | 1287 |
@@ -1287,6 +1532,20 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) | ||
1287 | 1532 | } |
1288 | 1533 | break; |
1289 | 1534 | |
1535 | + case ID_POPUP_PREVENT_SS: | |
1536 | + // スクリーンセーバー抑止 | |
1537 | + if (servMgr->preventSS) | |
1538 | + { | |
1539 | + servMgr->preventSS = false; | |
1540 | + CheckMenuItem(trayMenu, ID_POPUP_PREVENT_SS, MF_UNCHECKED|MF_BYCOMMAND); | |
1541 | + } else | |
1542 | + { | |
1543 | + servMgr->preventSS = true; | |
1544 | + CheckMenuItem(trayMenu, ID_POPUP_PREVENT_SS, MF_CHECKED|MF_BYCOMMAND); | |
1545 | + } | |
1546 | + peercastInst->saveSettings(); | |
1547 | + break; | |
1548 | + | |
1290 | 1549 | case ID_POPUP_EXIT_CONFIRM: |
1291 | 1550 | case IDM_EXIT: |
1292 | 1551 | DestroyWindow(hWnd); |
@@ -1298,6 +1557,15 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) | ||
1298 | 1557 | case WM_DESTROY: |
1299 | 1558 | PostQuitMessage(0); |
1300 | 1559 | break; |
1560 | + | |
1561 | + case WM_SYSCOMMAND: | |
1562 | + // なんかアクティブじゃないと送られてこないらしい | |
1563 | + if (servMgr->preventSS && (wParam == SC_SCREENSAVE) && chanMgr->isBroadcasting()) | |
1564 | + return 1; | |
1565 | + else | |
1566 | + return DefWindowProc(hWnd, message, wParam, lParam); | |
1567 | + break; | |
1568 | + | |
1301 | 1569 | default: |
1302 | 1570 | return DefWindowProc(hWnd, message, wParam, lParam); |
1303 | 1571 | } |
@@ -113,6 +113,7 @@ BEGIN | ||
113 | 113 | MENUITEM "再接続時下流維持", ID_POPUP_SHOWGUI, CHECKED |
114 | 114 | MENUITEM "常に手前に表示", ID_POPUP_TOPMOST |
115 | 115 | MENUITEM "起動時、GUIを表示", ID_POPUP_START_WITH_GUI |
116 | + MENUITEM "配信時、ScreenSaverを抑止", ID_POPUP_PREVENT_SS, GRAYED | |
116 | 117 | END |
117 | 118 | MENUITEM SEPARATOR |
118 | 119 | POPUP "終了" |
@@ -158,6 +158,7 @@ | ||
158 | 158 | AdditionalIncludeDirectories="../../../core,../../../core/common" |
159 | 159 | PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
160 | 160 | StringPooling="true" |
161 | + ExceptionHandling="1" | |
161 | 162 | RuntimeLibrary="0" |
162 | 163 | EnableFunctionLevelLinking="true" |
163 | 164 | PrecompiledHeaderFile=".\Release/Simple.pch" |
@@ -108,6 +108,8 @@ | ||
108 | 108 | #define ID_POPUP_START_WITH_GUI 32830 |
109 | 109 | #define ID_POPUP_32831 32831 |
110 | 110 | #define ID_POPUP_TRAFFIC 32832 |
111 | +#define ID_32833 32833 | |
112 | +#define ID_POPUP_PREVENT_SS 32834 | |
111 | 113 | #define IDC_STATIC -1 |
112 | 114 | |
113 | 115 | // Next default values for new objects |
@@ -115,7 +117,7 @@ | ||
115 | 117 | #ifdef APSTUDIO_INVOKED |
116 | 118 | #ifndef APSTUDIO_READONLY_SYMBOLS |
117 | 119 | #define _APS_NEXT_RESOURCE_VALUE 144 |
118 | -#define _APS_NEXT_COMMAND_VALUE 32833 | |
120 | +#define _APS_NEXT_COMMAND_VALUE 32835 | |
119 | 121 | #define _APS_NEXT_CONTROL_VALUE 1025 |
120 | 122 | #define _APS_NEXT_SYMED_VALUE 110 |
121 | 123 | #endif |
@@ -140,6 +140,7 @@ ServMgr::ServMgr() | ||
140 | 140 | |
141 | 141 | topmostGui = false; |
142 | 142 | startWithGui = false; |
143 | + preventSS = false; | |
143 | 144 | |
144 | 145 | chanLog=""; |
145 | 146 |
@@ -1106,6 +1107,7 @@ void ServMgr::saveSettings(const char *fn) | ||
1106 | 1107 | |
1107 | 1108 | iniFile.writeBoolValue("topmostGui", servMgr->topmostGui); |
1108 | 1109 | iniFile.writeBoolValue("startWithGui", servMgr->startWithGui); |
1110 | + iniFile.writeBoolValue("preventSS", servMgr->preventSS); | |
1109 | 1111 | #endif |
1110 | 1112 | int i; |
1111 | 1113 |
@@ -1517,12 +1519,11 @@ void ServMgr::loadSettings(const char *fn) | ||
1517 | 1519 | servMgr->guiAntennaNotifyIcon = iniFile.getBoolValue(); |
1518 | 1520 | |
1519 | 1521 | else if (iniFile.isName("topmostGui")) |
1520 | - { | |
1521 | 1522 | servMgr->topmostGui = iniFile.getBoolValue(); |
1522 | - } else if (iniFile.isName("startWithGui")) | |
1523 | - { | |
1523 | + else if (iniFile.isName("startWithGui")) | |
1524 | 1524 | servMgr->startWithGui = iniFile.getBoolValue(); |
1525 | - } | |
1525 | + else if (iniFile.isName("preventSS")) | |
1526 | + servMgr->preventSS = iniFile.getBoolValue(); | |
1526 | 1527 | #endif |
1527 | 1528 | |
1528 | 1529 | // debug |
@@ -419,6 +419,7 @@ public: | ||
419 | 419 | |
420 | 420 | bool topmostGui; // 最前面 |
421 | 421 | bool startWithGui; // 起動時にGUI |
422 | + bool preventSS; // スクリーンセーバーを抑止 | |
422 | 423 | |
423 | 424 | int maxRelaysIndexTxt; // for PCRaw (relay) |
424 | 425 |
@@ -44,9 +44,9 @@ extern int version_ex; // PP | ||
44 | 44 | #if 1 /* for VP extend version */ |
45 | 45 | //#define VERSION_EX 1 |
46 | 46 | static const char *PCP_CLIENT_VERSION_EX_PREFIX = "IM"; // 2bytes only |
47 | -static const int PCP_CLIENT_VERSION_EX_NUMBER = 27; | |
48 | -static const char *PCX_AGENTEX = "PeerCast/0.1218(IM0027-5-2)"; | |
49 | -static const char *PCX_VERSTRING_EX = "v0.1218(IM0027-5-2)"; | |
47 | +static const int PCP_CLIENT_VERSION_EX_NUMBER = 28; | |
48 | +static const char *PCX_AGENTEX = "PeerCast/0.1218(IM0028)"; | |
49 | +static const char *PCX_VERSTRING_EX = "v0.1218(IM0028)"; | |
50 | 50 | #endif |
51 | 51 | |
52 | 52 | // ------------------------------------------------ |
@@ -3,3 +3,6 @@ | ||
3 | 3 | |
4 | 4 | ・リレー上限チェック |
5 | 5 | bool Channel::isFull(); (channel.cpp) |
6 | + | |
7 | +・下流への転送 | |
8 | + void Servent::sendPCPChannel() |
@@ -80,6 +80,7 @@ ULONG_PTR gdiplusToken; | ||
80 | 80 | extern Stats stats; |
81 | 81 | ThreadInfo trafficDlgThread; |
82 | 82 | HWND trafficDlg = NULL; |
83 | +FileStream fs; | |
83 | 84 | |
84 | 85 | // プロトタイプ宣言 |
85 | 86 | void createGUI(HWND); |
@@ -178,20 +179,19 @@ HWND chWnd=NULL; | ||
178 | 179 | void LOG2(const char *fmt,...) |
179 | 180 | { |
180 | 181 | va_list ap; |
181 | - va_start(ap, fmt); | |
182 | + va_start(ap, fmt); | |
182 | 183 | char str[4096]; |
183 | 184 | vsprintf(str,fmt,ap); |
184 | 185 | OutputDebugString(str); |
185 | - va_end(ap); | |
186 | + va_end(ap); | |
186 | 187 | } |
187 | 188 | |
188 | 189 | |
189 | - | |
190 | -// --------------------------------------- | |
191 | -int APIENTRY WinMain(HINSTANCE hInstance, | |
192 | - HINSTANCE hPrevInstance, | |
193 | - LPSTR lpCmdLine, | |
194 | - int nCmdShow) | |
190 | +// -------------------------------------------------- | |
191 | +int WinMainDummy(HINSTANCE hInstance, | |
192 | + HINSTANCE hPrevInstance, | |
193 | + LPSTR lpCmdLine, | |
194 | + int nCmdShow) | |
195 | 195 | { |
196 | 196 | #ifdef _DEBUG |
197 | 197 | // memory leak check |
@@ -270,7 +270,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, | ||
270 | 270 | *end = 0; |
271 | 271 | } |
272 | 272 | |
273 | - | |
273 | + | |
274 | 274 | if (strnicmp(tmpURL,"peercast://",11)==0) |
275 | 275 | { |
276 | 276 | if (strnicmp(tmpURL+11,"pls/",4)==0) |
@@ -295,13 +295,13 @@ int APIENTRY WinMain(HINSTANCE hInstance, | ||
295 | 295 | if (!allowMulti) |
296 | 296 | { |
297 | 297 | HANDLE mutex = CreateMutex(NULL,TRUE,szWindowClass); |
298 | - | |
298 | + | |
299 | 299 | if (GetLastError() == ERROR_ALREADY_EXISTS) |
300 | 300 | { |
301 | 301 | HWND oldWin = FindWindow(szWindowClass,NULL); |
302 | 302 | if (oldWin) |
303 | 303 | { |
304 | - //SendMessage(oldWin,WM_SHOWGUI,0,0); | |
304 | + //SendMessage(oldWin,WM_SHOWGUI,0,0); | |
305 | 305 | if (killMe) |
306 | 306 | { |
307 | 307 | SendMessage(oldWin,WM_DESTROY,0,0); |
@@ -326,7 +326,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, | ||
326 | 326 | |
327 | 327 | if (killMe) |
328 | 328 | return 0; |
329 | - | |
329 | + | |
330 | 330 | MyRegisterClass(hInstance); |
331 | 331 | MyRegisterClass2(hInstance); |
332 | 332 |
@@ -390,7 +390,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, | ||
390 | 390 | } |
391 | 391 | } |
392 | 392 | |
393 | - Shell_NotifyIcon(NIM_DELETE, (NOTIFYICONDATA*)&trayIcon); | |
393 | + Shell_NotifyIcon(NIM_DELETE, (NOTIFYICONDATA*)&trayIcon); | |
394 | 394 | |
395 | 395 | peercastInst->saveSettings(); |
396 | 396 | peercastInst->quit(); |
@@ -401,6 +401,242 @@ int APIENTRY WinMain(HINSTANCE hInstance, | ||
401 | 401 | } |
402 | 402 | |
403 | 403 | |
404 | +// --------------------------------------- | |
405 | +int APIENTRY WinMain(HINSTANCE hInstance, | |
406 | + HINSTANCE hPrevInstance, | |
407 | + LPSTR lpCmdLine, | |
408 | + int nCmdShow) | |
409 | +{ | |
410 | + // SEH handling | |
411 | + __try | |
412 | + { | |
413 | +#if 0 | |
414 | +#ifdef _DEBUG | |
415 | + // memory leak check | |
416 | + ::_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); | |
417 | +#endif | |
418 | + | |
419 | + char tmpURL[8192]; | |
420 | + tmpURL[0]=0; | |
421 | + char *chanURL=NULL; | |
422 | + | |
423 | + hInst = hInstance; | |
424 | + | |
425 | + version_ex = 1; // PP版拡張機能を無効に←大嘘。バージョン表記をEXに | |
426 | + | |
427 | + iniFileName.set(".\\peercast.ini"); | |
428 | + | |
429 | + WIN32_FIND_DATA fd; //JP-EX | |
430 | + HANDLE hFind; //JP-EX | |
431 | + | |
432 | + OSVERSIONINFO osInfo; //JP-EX | |
433 | + osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); //JP-EX | |
434 | + GetVersionEx(&osInfo); | |
435 | + if (osInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) | |
436 | + winDistinctionNT = true; | |
437 | + else | |
438 | + winDistinctionNT = false; | |
439 | + | |
440 | + // off by default now | |
441 | + showGUI = false; | |
442 | + | |
443 | + if (strlen(lpCmdLine) > 0) | |
444 | + { | |
445 | + char *p; | |
446 | + if ((p = strstr(lpCmdLine,"-inifile"))!=NULL) | |
447 | + iniFileName.setFromString(p+8); | |
448 | + | |
449 | + if (strstr(lpCmdLine,"-zen")) | |
450 | + showGUI = false; | |
451 | + | |
452 | + if (strstr(lpCmdLine,"-multi")) | |
453 | + allowMulti = true; | |
454 | + | |
455 | + if (strstr(lpCmdLine,"-kill")) | |
456 | + killMe = true; | |
457 | + | |
458 | + if ((p = strstr(lpCmdLine,"-url"))!=NULL) | |
459 | + { | |
460 | + p+=4; | |
461 | + while (*p) | |
462 | + { | |
463 | + if (*p=='"') | |
464 | + { | |
465 | + p++; | |
466 | + break; | |
467 | + } | |
468 | + if (*p != ' ') | |
469 | + break; | |
470 | + p++; | |
471 | + } | |
472 | + if (*p) | |
473 | + strncpy(tmpURL,p,sizeof(tmpURL)-1); | |
474 | + } | |
475 | + } | |
476 | + | |
477 | + // get current path | |
478 | + { | |
479 | + exePath = iniFileName; | |
480 | + char *s = exePath.cstr(); | |
481 | + char *end = NULL; | |
482 | + while (*s) | |
483 | + { | |
484 | + if (*s++ == '\\') | |
485 | + end = s; | |
486 | + } | |
487 | + if (end) | |
488 | + *end = 0; | |
489 | + } | |
490 | + | |
491 | + | |
492 | + if (strnicmp(tmpURL,"peercast://",11)==0) | |
493 | + { | |
494 | + if (strnicmp(tmpURL+11,"pls/",4)==0) | |
495 | + chanURL = tmpURL+11+4; | |
496 | + else | |
497 | + chanURL = tmpURL+11; | |
498 | + showGUI = false; | |
499 | + } | |
500 | + | |
501 | + | |
502 | + MSG msg; | |
503 | + HACCEL hAccelTable; | |
504 | + | |
505 | + // Initialize global strings | |
506 | + //LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); | |
507 | + //LoadString(hInstance, IDC_APP_TITLE, szWindowClass, MAX_LOADSTRING); | |
508 | + | |
509 | + strcpy(szTitle,"PeerCast"); | |
510 | + strcpy(szWindowClass,"PeerCast"); | |
511 | + strcpy(szWindowClass2,"Main"); | |
512 | + | |
513 | + if (!allowMulti) | |
514 | + { | |
515 | + HANDLE mutex = CreateMutex(NULL,TRUE,szWindowClass); | |
516 | + | |
517 | + if (GetLastError() == ERROR_ALREADY_EXISTS) | |
518 | + { | |
519 | + HWND oldWin = FindWindow(szWindowClass,NULL); | |
520 | + if (oldWin) | |
521 | + { | |
522 | + //SendMessage(oldWin,WM_SHOWGUI,0,0); | |
523 | + if (killMe) | |
524 | + { | |
525 | + SendMessage(oldWin,WM_DESTROY,0,0); | |
526 | + return 0; | |
527 | + } | |
528 | + | |
529 | + if (chanURL) | |
530 | + { | |
531 | + COPYDATASTRUCT copy; | |
532 | + copy.dwData = WM_PLAYCHANNEL; | |
533 | + copy.cbData = strlen(chanURL)+1; // plus null term | |
534 | + copy.lpData = chanURL; | |
535 | + SendMessage(oldWin,WM_COPYDATA,NULL,(LPARAM)©); | |
536 | + }else{ | |
537 | + if (showGUI) | |
538 | + SendMessage(oldWin,WM_SHOWGUI,0,0); | |
539 | + } | |
540 | + } | |
541 | + return 0; | |
542 | + } | |
543 | + } | |
544 | + | |
545 | + if (killMe) | |
546 | + return 0; | |
547 | + | |
548 | + MyRegisterClass(hInstance); | |
549 | + MyRegisterClass2(hInstance); | |
550 | + | |
551 | + // Perform application initialization: | |
552 | + if (!InitInstance (hInstance, nCmdShow)) | |
553 | + return FALSE; | |
554 | + | |
555 | + peercastInst = new MyPeercastInst(); | |
556 | + peercastApp = new MyPeercastApp(); | |
557 | + | |
558 | + peercastInst->init(); | |
559 | + | |
560 | + LOG_DEBUG("Set OS Type: %s",winDistinctionNT?"WinNT":"Win9x"); | |
561 | + | |
562 | + if (peercastApp->clearTemp()) //JP-EX | |
563 | + { | |
564 | + DeleteFile("play.pls"); | |
565 | + hFind = FindFirstFile("*.asx",&fd); | |
566 | + if (hFind != INVALID_HANDLE_VALUE) | |
567 | + { | |
568 | + do | |
569 | + { | |
570 | + DeleteFile((char *)&fd.cFileName); | |
571 | + } | |
572 | + while (FindNextFile(hFind,&fd)); | |
573 | + | |
574 | + FindClose(hFind); | |
575 | + } | |
576 | + } | |
577 | + | |
578 | + if (chanURL) | |
579 | + { | |
580 | + ChanInfo info; | |
581 | + servMgr->procConnectArgs(chanURL,info); | |
582 | + chanMgr->findAndPlayChannel(info,false); | |
583 | + } | |
584 | + | |
585 | + hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_SIMPLE); | |
586 | + | |
587 | + // setup menu notifes | |
588 | + int mask = peercastInst->getNotifyMask(); | |
589 | + if (mask & ServMgr::NT_PEERCAST) | |
590 | + CheckMenuItem(trayMenu,ID_POPUP_SHOWMESSAGES_PEERCAST,MF_CHECKED|MF_BYCOMMAND); | |
591 | + if (mask & ServMgr::NT_BROADCASTERS) | |
592 | + CheckMenuItem(trayMenu,ID_POPUP_SHOWMESSAGES_BROADCASTERS,MF_CHECKED|MF_BYCOMMAND); | |
593 | + if (mask & ServMgr::NT_TRACKINFO) | |
594 | + CheckMenuItem(trayMenu,ID_POPUP_SHOWMESSAGES_TRACKINFO,MF_CHECKED|MF_BYCOMMAND); | |
595 | + | |
596 | + if (servMgr->startWithGui) | |
597 | + { | |
598 | + createGUI((HWND)0); | |
599 | + } | |
600 | + | |
601 | + // Main message loop: | |
602 | + while (GetMessage(&msg, NULL, 0, 0)) | |
603 | + { | |
604 | + if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) | |
605 | + { | |
606 | + TranslateMessage(&msg); | |
607 | + DispatchMessage(&msg); | |
608 | + } | |
609 | + } | |
610 | + | |
611 | + Shell_NotifyIcon(NIM_DELETE, (NOTIFYICONDATA*)&trayIcon); | |
612 | + | |
613 | + peercastInst->saveSettings(); | |
614 | + peercastInst->quit(); | |
615 | + | |
616 | + Gdiplus::GdiplusShutdown(gdiplusToken); | |
617 | + | |
618 | + return msg.wParam; | |
619 | +#endif | |
620 | + WinMainDummy(hInstance, hPrevInstance, lpCmdLine, nCmdShow); | |
621 | + | |
622 | + } __except(EXCEPTION_EXECUTE_HANDLER) | |
623 | + { | |
624 | + fs.openWriteReplace(".\\dump.html"); | |
625 | + sys->logBuf->dumpHTML(fs); | |
626 | + fs.close(); | |
627 | + | |
628 | + MessageBox(NULL, "一般保護違反の為、プログラムは強制終了されます。\n" | |
629 | + "問題解決のためにダンプデータ(dump.html)を提供してください。", "SEH", | |
630 | + MB_OK|MB_ICONWARNING); | |
631 | + | |
632 | + return GetExceptionCode(); | |
633 | + } | |
634 | + | |
635 | + // dummy | |
636 | + return 0; | |
637 | +} | |
638 | + | |
639 | + | |
404 | 640 | |
405 | 641 | // |
406 | 642 | // FUNCTION: MyRegisterClass() |
@@ -1037,6 +1273,15 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) | ||
1037 | 1273 | CheckMenuItem(trayMenu, ID_POPUP_START_WITH_GUI, MF_UNCHECKED|MF_BYCOMMAND); |
1038 | 1274 | } |
1039 | 1275 | |
1276 | + // スクリーンセーバー抑止 | |
1277 | + if (servMgr->preventSS) | |
1278 | + { | |
1279 | + CheckMenuItem(trayMenu, ID_POPUP_PREVENT_SS, MF_CHECKED|MF_BYCOMMAND); | |
1280 | + } else | |
1281 | + { | |
1282 | + CheckMenuItem(trayMenu, ID_POPUP_PREVENT_SS, MF_UNCHECKED|MF_BYCOMMAND); | |
1283 | + } | |
1284 | + | |
1040 | 1285 | SetForegroundWindow(hWnd); |
1041 | 1286 | bool skipMenu=false; |
1042 | 1287 |
@@ -1287,6 +1532,20 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) | ||
1287 | 1532 | } |
1288 | 1533 | break; |
1289 | 1534 | |
1535 | + case ID_POPUP_PREVENT_SS: | |
1536 | + // スクリーンセーバー抑止 | |
1537 | + if (servMgr->preventSS) | |
1538 | + { | |
1539 | + servMgr->preventSS = false; | |
1540 | + CheckMenuItem(trayMenu, ID_POPUP_PREVENT_SS, MF_UNCHECKED|MF_BYCOMMAND); | |
1541 | + } else | |
1542 | + { | |
1543 | + servMgr->preventSS = true; | |
1544 | + CheckMenuItem(trayMenu, ID_POPUP_PREVENT_SS, MF_CHECKED|MF_BYCOMMAND); | |
1545 | + } | |
1546 | + peercastInst->saveSettings(); | |
1547 | + break; | |
1548 | + | |
1290 | 1549 | case ID_POPUP_EXIT_CONFIRM: |
1291 | 1550 | case IDM_EXIT: |
1292 | 1551 | DestroyWindow(hWnd); |
@@ -1298,6 +1557,15 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) | ||
1298 | 1557 | case WM_DESTROY: |
1299 | 1558 | PostQuitMessage(0); |
1300 | 1559 | break; |
1560 | + | |
1561 | + case WM_SYSCOMMAND: | |
1562 | + // なんかアクティブじゃないと送られてこないらしい | |
1563 | + if (servMgr->preventSS && (wParam == SC_SCREENSAVE) && chanMgr->isBroadcasting()) | |
1564 | + return 1; | |
1565 | + else | |
1566 | + return DefWindowProc(hWnd, message, wParam, lParam); | |
1567 | + break; | |
1568 | + | |
1301 | 1569 | default: |
1302 | 1570 | return DefWindowProc(hWnd, message, wParam, lParam); |
1303 | 1571 | } |
@@ -113,6 +113,7 @@ BEGIN | ||
113 | 113 | MENUITEM "再接続時下流維持", ID_POPUP_SHOWGUI, CHECKED |
114 | 114 | MENUITEM "常に手前に表示", ID_POPUP_TOPMOST |
115 | 115 | MENUITEM "起動時、GUIを表示", ID_POPUP_START_WITH_GUI |
116 | + MENUITEM "配信時、ScreenSaverを抑止", ID_POPUP_PREVENT_SS, GRAYED | |
116 | 117 | END |
117 | 118 | MENUITEM SEPARATOR |
118 | 119 | POPUP "終了" |
@@ -158,6 +158,7 @@ | ||
158 | 158 | AdditionalIncludeDirectories="../../../core,../../../core/common" |
159 | 159 | PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" |
160 | 160 | StringPooling="true" |
161 | + ExceptionHandling="1" | |
161 | 162 | RuntimeLibrary="0" |
162 | 163 | EnableFunctionLevelLinking="true" |
163 | 164 | PrecompiledHeaderFile=".\Release/Simple.pch" |
@@ -108,6 +108,8 @@ | ||
108 | 108 | #define ID_POPUP_START_WITH_GUI 32830 |
109 | 109 | #define ID_POPUP_32831 32831 |
110 | 110 | #define ID_POPUP_TRAFFIC 32832 |
111 | +#define ID_32833 32833 | |
112 | +#define ID_POPUP_PREVENT_SS 32834 | |
111 | 113 | #define IDC_STATIC -1 |
112 | 114 | |
113 | 115 | // Next default values for new objects |
@@ -115,7 +117,7 @@ | ||
115 | 117 | #ifdef APSTUDIO_INVOKED |
116 | 118 | #ifndef APSTUDIO_READONLY_SYMBOLS |
117 | 119 | #define _APS_NEXT_RESOURCE_VALUE 144 |
118 | -#define _APS_NEXT_COMMAND_VALUE 32833 | |
120 | +#define _APS_NEXT_COMMAND_VALUE 32835 | |
119 | 121 | #define _APS_NEXT_CONTROL_VALUE 1025 |
120 | 122 | #define _APS_NEXT_SYMED_VALUE 110 |
121 | 123 | #endif |