Beispiel #1
0
Register() {
    REPO *addr;
    int x;
    int id = semget(SEM_REPO, 1, 0666 | IPC_CREAT | IPC_EXCL);

    //printf("%d\n", id);
    if(id == -1) {
        sem_rep_id = semget(SEM_REPO, 1, 0666 );
        semctl(sem_rep_id, 0, GETVAL, x);
        SemOperation(sem_rep_id, 0, -1);
        shared_id = shmget(ID_REPO, sizeof(REPO), 0666);
        sem_log_id = semget(SEM_LOG, 1, 0666);
        addr = (REPO*)shmat(shared_id, NULL, 0);
        (*addr).active_servers = (*addr).active_servers + 1;
        (*addr).servers[(*addr).active_servers - 1].client_msgid = ownMSG;
        (*addr).servers[(*addr).active_servers - 1].server_msgid = servers_id;
        (*addr).servers[(*addr).active_servers - 1].clients = 0;
        SortServers(addr);
        printf("x1\n");
        shmdt(addr);
        printf("x1\n");
        SemOperation(sem_rep_id, 0, 1);

    }
    else {
        printf("x2\n");
        sem_rep_id = id;
        semctl(sem_rep_id, 0, SETVAL, 0);
        x = semctl(sem_rep_id, 0, GETVAL, x);
        shared_id = shmget(ID_REPO, sizeof(REPO), 0666 | IPC_CREAT);
        addr = (REPO*)shmat(shared_id, NULL, 0);
        (*addr).active_clients = 0;
        (*addr).active_rooms = 0;
        (*addr).active_servers = 1;
        (*addr).servers[0].client_msgid = ownMSG;
        (*addr).servers[0].server_msgid = servers_id;
        (*addr).servers[0].clients = 0;
        sem_log_id = semget(SEM_LOG, 1, 0666 | IPC_CREAT);
        semctl(sem_log_id, 0, SETVAL, 1);
        shmdt(addr);
        SemOperation(sem_rep_id, 0, 1);
        x = semctl(sem_rep_id, 0, GETVAL, x);
    }
    //semctl(sem_rep_id, 0, IPC_RMID, 0); printf("x\n");

}
void CFolderJoin::UpdateGetServices(HSURFACE hDestSurf)
{
	int nState = GetGameSpyClientMgr()->GetState();


	switch (nState)
	{
		case sl_idle:		// done updating
		{
			SortServers();
			m_bNeedServerSorting = FALSE;
			HSTRING hStr = g_pLTClient->FormatString(IDS_STATUS_QUERYDONE);
			SetDummyStatusState(hStr, 1000, FSS_IDLE);
			g_pLTClient->FreeString(hStr);
			break;
		}

		case sl_listxfer:	// getting list
		{
			HSTRING hStr = g_pLTClient->FormatString(IDS_STATUS_GETLIST);
			SetStatusText(hStr);
			g_pLTClient->FreeString(hStr);
			break;
		}

		case sl_lanlist:	// searching lan
		{
			HSTRING hStr = g_pLTClient->FormatString(IDS_STATUS_GETLIST);
			SetStatusText(hStr);
			g_pLTClient->FreeString(hStr);
			break;
		}

		case sl_querying:	// querying servers
		{
			HSTRING hStr = g_pLTClient->FormatString(IDS_STATUS_QUERY, GetGameSpyClientMgr()->GetProgress(), m_nNumServersListed);
			SetStatusText(hStr);
			g_pLTClient->FreeString(hStr);
			break;
		}
	}
}
void CFolderJoin::Update(HSURFACE hDestSurf)
{

	// Let the GameSpy client manager update...

	GetGameSpyClientMgr()->Update();


	// Update based on our current state...

	switch (m_nState)
	{
		case FSS_IDLE:
		{
			UpdateIdle(hDestSurf);
			break;
		}

		case FSS_GETSERVICES:
		{
			UpdateGetServices(hDestSurf);
			break;
		}

		case FSS_GETPINGS:
		{
			UpdateGetPings(hDestSurf);
			break;
		}

		case FSS_GETALLDATA:
		{
			UpdateGetAllData(hDestSurf);
			break;
		}

		case FSS_GETSELPING:
		{
			UpdateGetSelPing(hDestSurf);
			break;
		}

		case FSS_DUMMYSTATUS:
		{
			UpdateDummyStatus(hDestSurf);
			break;
		}
	}


	// Update our sub menus...

	UpdateLists();


	// Check for required sorting...

	if (m_bNeedServerSorting)
	{
        m_bNeedServerSorting = LTFALSE;
		SortServers();
	}


	// Enable or disable the join control as necessary...

    m_pJoin->Enable((GetCurGameServerHandle() != LTNULL));
}
uint32 CFolderJoin::OnCommand(uint32 dwCommand, uint32 dwParam1, uint32 dwParam2)
{
	switch(dwCommand)
	{
	case CMD_SELECT_SERVER:
		{
			int nIndex = m_pServerList->GetSelectedItem();
            void* pGame = LTNULL;
			if (nIndex != CListCtrl::kNoSelection)
			{
				pGame = (void*)m_pServerList->GetControl(nIndex)->GetParam1();
			}

			if (pGame != GetCurGameServerHandle())
			{
				SetCurGameServerHandle(pGame);
				SetState(FSS_GETALLDATA);

			}
			UpdatePlayers(TRUE);


		} break;
	case CMD_REFRESH_SERVERS:
		{
			SetState(FSS_GETSERVICES);
			break;
		}

	case CMD_REPING_SERVERS:
		{
			//SetState(FSS_GETPINGS);
			break;
		}

	case CMD_VERSION_FILTER:
		{
			m_nVersionFilter = !m_nVersionFilter;
            m_pVersionFilter->UpdateData(LTFALSE);
			ForceNextUpdate();

		} break;

	case CMD_GAME_FILTER:
		{
			m_nGameFilter++;
			if (m_nGameFilter > NGT_FILTER_LAST)
				m_nGameFilter = 0;
            m_pGameFilter->UpdateData(LTFALSE);
			ForceNextUpdate();

		} break;
	case CMD_POP_FILTER:
		{
			m_nPopFilter++;
			if (m_nPopFilter > POP_FILTER_LAST)
				m_nPopFilter = 0;
            m_pPopFilter->UpdateData(LTFALSE);
			ForceNextUpdate();

		} break;
	case CMD_SORT_SERV_NAME:
		{
			SetServerSort(FSS_SORT_NAME);
			SortServers();
		} break;

	case CMD_SORT_SERV_PLAYERS:
		{
			SetServerSort(FSS_SORT_PLAYERS);
			SortServers();
		} break;
	case CMD_SORT_SERV_PING:
		{
			SetServerSort(FSS_SORT_PING);
			SortServers();
		} break;
	case CMD_SORT_SERV_GAME:
		{
			SetServerSort(FSS_SORT_GAME);
			SortServers();
		} break;
	case CMD_SORT_SERV_MAP:
		{
			SetServerSort(FSS_SORT_MAP);
			SortServers();
		} break;
	case CMD_SORT_PLYR_NAME:
		{
			SetPlayerSort(FSS_SORT_NAME);
			SortPlayers();
		} break;
	case CMD_SORT_PLYR_SCORE:
		{
			SetPlayerSort(FSS_SORT_FRAGS);
			SortPlayers();
		} break;
	case CMD_SORT_PLYR_PING:
		{
			SetPlayerSort(FSS_SORT_PING);
			SortPlayers();
		} break;
	case CMD_EDIT_PASS:
		{
			SetCapture(LTNULL);
			m_pPassEdit->UpdateData();
			RemoveFixedControl(m_pPassEdit);
			RemoveFixedControl(m_pPassLabel);
			RemoveFixedControl(m_pPassBack);
			m_bAskingForPassword = LTFALSE;
			ForceMouseUpdate();
			JoinCurGame(LTTRUE);
		} break;
	case CMD_JOIN:
		{
			CGameSpyServer* pGame = GetGameSpyClientMgr()->GetServerFromHandle(m_pCurServerHandle);
		    if (g_pGameClientShell->IsInWorld() && pGame)
		    {

				if (IsCurrentGame(pGame))
				{
					HLOCALOBJ hPlayerObj = g_pLTClient->GetClientObject();
					if (g_pGameClientShell->IsInWorld() && hPlayerObj)
					{
						g_pInterfaceMgr->ChangeState(GS_PLAYING);
					}
				}
				else
				{
					HSTRING hString = g_pLTClient->FormatString(IDS_ENDCURRENTGAME);
					g_pInterfaceMgr->ShowMessageBox(hString,LTMB_YESNO,JoinCallBack,this);
					g_pLTClient->FreeString(hString);
				}
		    }
		    else
		    {
				JoinCurGame();
		    }


		} break;

	default:
		return CBaseFolder::OnCommand(dwCommand,dwParam1,dwParam2);
	}
	return 1;
};