📄 osxapp.cpp
字号:
/* * osxapp.cpp * PeerCast * * Created by mode7 on Mon Apr 12 2004. * Copyright (c) 2002-2004 peercast.org. All rights reserved. * */// ------------------------------------------------// This program is free software; you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation; either version 2 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// ------------------------------------------------#include "osxapp.h"#include <string>enum { kChannelColumn = 'CHAN' ,kBitRateColumn = 'BITR' ,kStreamColumn = 'STRM' ,kRelayColumn = 'TRLY' ,kListenersColumn = 'LRLY' ,kStatusColumn = 'STAT' ,kKeepColumn = 'KEEP' ,kNumProps = 7};enum { kEventClassPeercast = 'PEER' ,kEventStartChannel = 'STRT' ,kEventUpdateChannel = 'UPDT' ,kEventStopChannel = 'STOP' ,kEventParamChanStatus = 'CSTA' ,kEventParamSystem = 'PSYS' ,typeChanStatus = 'CSTA'};UInt32 propIDList[kNumProps] = { kChannelColumn ,kBitRateColumn ,kStreamColumn ,kRelayColumn ,kListenersColumn ,kStatusColumn ,kKeepColumn};static const UInt32 kPeerCast_AppSignature = FOUR_CHAR_CODE('PCTT');static const UInt32 kPeerCast_TabControlID = 1000;static const char* skYPString = "http://yp.peercast.org/";static const ControlID skBumpButtonID = { 'RLBT', 1000 };static const ControlID skCommentButtonID = { 'RLBT', 1001 };static const ControlID skUpdateVersionButtonID = { 'PCST', 1007 };OSXPeercastApp::OSXPeercastApp( const char *appPath, const char *iniFilename, int argc, char* argv[] ,WindowRef window, const ControlID& dbControlID ): mIniFileName (),mRelayBrowser ( window, dbControlID, static_cast<DataBrowserItemDataProcPtr>(itemDataCallback), static_cast<DataBrowserItemNotificationProcPtr>(itemNotificationCallback) ),mWindowRef ( window ),mUpTime ('PCST', 1001),mDirectConnections ('PCST', 1002),mRelayConnections ('PCST', 1003),mCinCoutConnections ('PCST', 1004),mPGNUConnections ('PCST', 1005),mIncomingConnections('PCST', 1006),mChannelList ( ),mLock ( ),mTabControl ( kPeerCast_AppSignature, kPeerCast_TabControlID, window ),mAppEventHandler ( OSXPeercastApp::appEventHandler ),mMainWindowHandler ( OSXPeercastApp::mainWindowHandler ),mPeercastEventHandler( OSXPeercastApp::peercastEventHandler ),mAppPath ( appPath ){ mIniFileName.set(iniFilename); if (argc > 2) { if (strcmp(argv[1],"-inifile")==0) mIniFileName.setFromString(argv[2]); } DataBrowserPropertyFlags flags; mRelayBrowser.getPropertyFlags( kKeepColumn, &flags ); flags |= kDataBrowserPropertyIsEditable; mRelayBrowser.setPropertyFlags( kKeepColumn, flags ); installAppEventHandler(); mTabControl.installHandler(); installWindowHandler( window ); installPeercastEventHandler( window ); enableNewVersionButton( false );}//------------------------------------------------------------------------OSStatus OSXPeercastApp::installAppEventHandler(){ static const EventTypeSpec appEvents[] = { { kEventClassCommand, kEventCommandProcess } }; return InstallApplicationEventHandler( mAppEventHandler.eventHandler() ,GetEventTypeCount( appEvents ) ,appEvents ,NULL ,NULL ); }//------------------------------------------------------------------------OSStatus OSXPeercastApp::installWindowHandler( WindowRef window ){ static const EventTypeSpec mainWindowEvents[] = { { kEventClassCommand, kEventCommandProcess } ,{ kEventClassWindow, kEventWindowActivated } }; return InstallWindowEventHandler( window ,mMainWindowHandler.eventHandler() ,GetEventTypeCount( mainWindowEvents ) ,mainWindowEvents ,this ,NULL );}//------------------------------------------------------------------------OSStatus OSXPeercastApp::appEventHandler( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData ){ HICommand command; OSStatus err = GetEventParameter( inEvent ,kEventParamDirectObject ,typeHICommand ,NULL ,sizeof(HICommand) ,NULL ,&command ); if( err == noErr ) { switch( command.commandID ) { case FOUR_CHAR_CODE('PHLP'): sys->getURL("http://www.peercast.org/help.php"); break; } } return eventNotHandledErr;}//------------------------------------------------------------------------OSStatus OSXPeercastApp::mainWindowHandler( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData ){ HICommand command; OSXPeercastApp *pOSXApp = static_cast<OSXPeercastApp*>( inUserData ); OSStatus err = GetEventParameter( inEvent ,kEventParamDirectObject ,typeHICommand ,NULL ,sizeof(HICommand) ,NULL ,&command ); if( err == noErr ) { switch( command.commandID ) { case FOUR_CHAR_CODE('save'): pOSXApp->saveSettings(); break; case FOUR_CHAR_CODE('BUMP'): pOSXApp->onBumpClicked(); break; case FOUR_CHAR_CODE('CMNT'): pOSXApp->onCommentClicked(); break; case FOUR_CHAR_CODE('YPBT'): { char serverIP[256]; char buf[256]; servMgr->serverHost.toStr( serverIP ); sprintf( buf, "%s?host=%s", skYPString, serverIP ); sys->getURL( buf ); } break; case FOUR_CHAR_CODE('UPDT'): { sys->callLocalURL("admin?cmd=upgrade",servMgr->serverHost.port); } break; } } return eventNotHandledErr;}//------------------------------------------------------------------------OSStatus OSXPeercastApp::installPeercastEventHandler( WindowRef theWindow ){ static const EventTypeSpec peercastEventTypes[] = { { kEventClassPeercast, kEventStartChannel } ,{ kEventClassPeercast, kEventUpdateChannel } ,{ kEventClassPeercast, kEventStopChannel } }; return InstallEventHandler( GetApplicationEventTarget() ,mPeercastEventHandler.eventHandler() ,GetEventTypeCount( peercastEventTypes ) ,peercastEventTypes, this, NULL );}//------------------------------------------------------------------------void OSXPeercastApp::enableNewVersionButton( const Boolean visible ){ ControlRef newVerButton; GetControlByID( mWindowRef, &skUpdateVersionButtonID, &newVerButton ); if( newVerButton != NULL ) { SetControlVisibility( newVerButton, visible, true ); //Draw1Control( tabControl ); }}//------------------------------------------------------------------------void OSXPeercastApp::addChanStatus( TChanStatusPtr& chanStatus ){ const DataBrowserItemID itemID = reinterpret_cast<DataBrowserItemID>(chanStatus.get()); OSStatus err = mRelayBrowser.addItems( kDataBrowserNoItem, 1, &itemID, kChannelColumn ); if( err == noErr ) { mChannelList.push_back( chanStatus ); }}//------------------------------------------------------------------------void OSXPeercastApp::updateChanStatus( ChanStatus& newStatus ){ TChannelList::iterator iter = findChannel( newStatus.getId() ); if( iter != mChannelList.end() ) { TChanStatusPtr& chanStatus = *iter; chanStatus->update( newStatus ); // copy new status const DataBrowserItemID itemID = reinterpret_cast<DataBrowserItemID>(chanStatus.get()); OSStatus err = mRelayBrowser.updateItems( kDataBrowserNoItem, 1, &itemID, kChannelColumn, kDataBrowserNoItem ); }}//------------------------------------------------------------------------void OSXPeercastApp::removeChanStatus( GnuID& id ){ TChannelList::iterator iter = findChannel( id ); if( iter != mChannelList.end() ) { const TChanStatusPtr& chanStatus = *iter; const DataBrowserItemID itemID = reinterpret_cast<DataBrowserItemID>(chanStatus.get()); OSStatus err = mRelayBrowser.removeItems( kDataBrowserNoItem, 1, &itemID, kChannelColumn ); mChannelList.erase( iter ); // remove from list }}//------------------------------------------------------------------------OSStatus OSXPeercastApp::peercastEventHandler( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData ){ switch( GetEventClass( inEvent ) ) { case kEventClassPeercast: { OSXPeercastApp *pOSXApp = static_cast<OSXPeercastApp*>( inUserData ); switch( GetEventKind( inEvent ) ) { case kEventStartChannel: { TChanXferPkt xferPkt; OSStatus err = GetEventParameter( inEvent, kEventParamChanStatus, typeChanStatus, NULL, sizeof(TChanXferPkt), NULL, &xferPkt ); TChanStatusPtr chanStatus( xferPkt.mpData ); if( err != noErr ) return err; pOSXApp->addChanStatus( chanStatus ); } break; case kEventUpdateChannel: { TChanXferPkt xferPkt; OSStatus err = GetEventParameter( inEvent, kEventParamChanStatus, typeChanStatus, NULL, sizeof(TChanXferPkt), NULL, &xferPkt ); TChanStatusPtr chanStatus( xferPkt.mpData ); if( err != noErr ) return err; if( chanStatus.get() != NULL ) { pOSXApp->updateChanStatus( *chanStatus ); } } break; case kEventStopChannel: { GnuID chanId; OSStatus err = GetEventParameter( inEvent, kEventParamChanStatus, typeChanStatus, NULL, sizeof(GnuID), NULL, &chanId ); if( err != noErr ) return err; pOSXApp->removeChanStatus( chanId ); } break; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -