2025-11-28 00:35:46 +09:00

321 lines
12 KiB
C

/********************************************************************++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1985-2007 Microsoft Corporation. All Rights Reserved.
Abstract:
This C file includes sample code for working with contacts using
the Microsoft Peer-to-Peer Collaboration APIs.
Note:
This peer to peer application requires global IPv6 connectivity.
--********************************************************************/
#pragma warning(disable:4201) // nameless struct/union
#include <p2p.h>
#include <stdio.h>
#include <strsafe.h>
#include "Events.h"
#include "shared.h"
//-----------------------------------------------------------------------------
// Function: DisplayWatchListChanged
// Purpose: Called to display a PPEER_EVENT_WATCHLIST_CHANGED_DATA structure
// Parameters:
// pWatchlistChangedData [in] : pointer to a PPEER_EVENT_WATCHLIST_CHANGED_DATA structure
//
void DisplayWatchListChanged(const PEER_EVENT_WATCHLIST_CHANGED_DATA *pWatchlistChangedData)
{
if (pWatchlistChangedData)
{
PrintContact(pWatchlistChangedData->pContact);
wprintf(L"\tChange Type: %s\n", ChangeType(pWatchlistChangedData->changeType));
}
}
//-----------------------------------------------------------------------------
// Function: DisplayPresenceChanged
// Purpose: Called to display a PPEER_EVENT_PRESENCE_CHANGED_DATA structure
// Parameters:
// pPresenceChangedData [in] : pointer to a PPEER_EVENT_PRESENCE_CHANGED_DATA structure
//
void DisplayPresenceChanged(const PEER_EVENT_PRESENCE_CHANGED_DATA *pPresenceChangedData)
{
if (pPresenceChangedData)
{
PrintContact(pPresenceChangedData->pContact);
PrintEndpoint(pPresenceChangedData->pEndpoint);
wprintf(L"\tChange Type: %s\n", ChangeType(pPresenceChangedData->changeType));
wprintf(L"\tPresence: ");
PrintPresenceInformation(pPresenceChangedData->pPresenceInfo);
}
}
//-----------------------------------------------------------------------------
// Function: DisplayApplicationChanged
// Purpose: Called to display a PPEER_EVENT_APPLICATION_CHANGED_DATA structure
// Parameters:
// pApplicationChangedData [in] : pointer to a PPEER_EVENT_APPLICATION_CHANGED_DATA structure
//
void DisplayApplicationChanged(const PEER_EVENT_APPLICATION_CHANGED_DATA *pApplicationChangedData)
{
if (pApplicationChangedData)
{
PrintContact(pApplicationChangedData->pContact);
PrintEndpoint(pApplicationChangedData->pEndpoint);
wprintf(L"\tChange Type: %s\n", ChangeType(pApplicationChangedData->changeType));
PrintApplication(pApplicationChangedData->pApplication);
}
}
//-----------------------------------------------------------------------------
// Function: DisplayObjectChanged
// Purpose: Called to display a PPEER_EVENT_OBJECT_CHANGED_DATA structure
// Parameters:
// pObjectChangedData [in] : pointer to a PPEER_EVENT_OBJECT_CHANGED_DATA structure
//
void DisplayObjectChanged(const PEER_EVENT_OBJECT_CHANGED_DATA *pObjectChangedData)
{
if (pObjectChangedData)
{
PrintContact(pObjectChangedData->pContact);
PrintEndpoint(pObjectChangedData->pEndpoint);
wprintf(L"\tChange Type: %s\n", ChangeType(pObjectChangedData->changeType));
PrintObject(pObjectChangedData->pObject);
}
}
//-----------------------------------------------------------------------------
// Function: DisplayEndpointChanged
// Purpose: Called to display a PPEER_EVENT_ENDPOINT_CHANGED_DATA structure
// Parameters:
// pEndpointChangedData [in] : pointer to a PPEER_EVENT_ENDPOINT_CHANGED_DATA structure
//
VOID DisplayEndpointChanged(const PEER_EVENT_ENDPOINT_CHANGED_DATA *pEndpointChangedData)
{
if (pEndpointChangedData)
{
PrintContact(pEndpointChangedData->pContact);
PrintEndpoint(pEndpointChangedData->pEndpoint);
}
}
//-----------------------------------------------------------------------------
// Function: DisplayPeopleNearMeChanged
// Purpose: Called to display a PPEER_EVENT_PEOPLE_NEAR_ME_CHANGED_DATA structure
// Parameters:
// pPNMChangedData [in] : pointer to a PPEER_EVENT_PEOPLE_NEAR_ME_CHANGED_DATA structure
//
VOID CALLBACK DisplayPeopleNearMeChanged(const PEER_EVENT_PEOPLE_NEAR_ME_CHANGED_DATA *pPNMChangedData)
{
if (pPNMChangedData)
{
wprintf(L"\tChange Type: %s\n", ChangeType(pPNMChangedData->changeType));
if (pPNMChangedData->pPeopleNearMe == NULL)
{
wprintf(L"\t Endpoint: <Me>\n");
}
else
{
PrintEndpoint(&pPNMChangedData->pPeopleNearMe->endpoint);
wprintf(L"\t NickName: %s\n", pPNMChangedData->pPeopleNearMe->pwzNickName);
}
}
}
//-----------------------------------------------------------------------------
// Function: DisplayRequestStatusChanged
// Purpose: Called to display a PPEER_EVENT_REQUEST_STATUS_CHANGED_DATA structure
// Parameters:
// pRequestStatusChangedData [in] : pointer to a PPEER_EVENT_REQUEST_STATUS_CHANGED_DATA structure
//
VOID CALLBACK DisplayRequestStatusChanged(const PEER_EVENT_REQUEST_STATUS_CHANGED_DATA *pRequestStatusChangedData)
{
if (pRequestStatusChangedData)
{
PrintFullEndpoint(pRequestStatusChangedData->pEndpoint, TRUE);
if (SUCCEEDED(pRequestStatusChangedData->hrChange))
{
wprintf(L"Request Status changed event indicates success.\n");
}
else
{
wprintf(L"Request Status changed event indicates failure. HRESULT=0x%x.\n",
pRequestStatusChangedData->hrChange);
PrintError(pRequestStatusChangedData->hrChange);
}
}
}
//-----------------------------------------------------------------------------
// Function: PNMEventHandler
// Purpose: Registers for all event types and prints out the event data
// Parameters: None
//
HRESULT EventHandler()
{
HPEEREVENT hPeerEvent = NULL;
HRESULT hr = S_OK;
PEER_COLLAB_EVENT_REGISTRATION eventReg[11] = {0};
HANDLE hEvent[2];
HANDLE hParentHandle = NULL;
hr = GetParentProcessHandle(&hParentHandle);
if (FAILED(hr))
{
printf("Failed to get parent process handle. Aborting event printing process\n");
hr = E_FAIL;
goto exit;
}
hEvent[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
hEvent[1] = hParentHandle;
eventReg[0].eventType = PEER_EVENT_WATCHLIST_CHANGED;
eventReg[1].eventType = PEER_EVENT_ENDPOINT_CHANGED;
eventReg[2].eventType = PEER_EVENT_ENDPOINT_PRESENCE_CHANGED;
eventReg[3].eventType = PEER_EVENT_ENDPOINT_APPLICATION_CHANGED;
eventReg[4].eventType = PEER_EVENT_ENDPOINT_OBJECT_CHANGED;
eventReg[5].eventType = PEER_EVENT_MY_ENDPOINT_CHANGED;
eventReg[6].eventType = PEER_EVENT_MY_PRESENCE_CHANGED;
eventReg[7].eventType = PEER_EVENT_MY_APPLICATION_CHANGED;
eventReg[8].eventType = PEER_EVENT_MY_OBJECT_CHANGED;
eventReg[9].eventType = PEER_EVENT_PEOPLE_NEAR_ME_CHANGED;
eventReg[10].eventType = PEER_EVENT_REQUEST_STATUS_CHANGED;
// Register to be notified when the request finishes
hr = PeerCollabRegisterEvent(hEvent[0], celems(eventReg), eventReg, &hPeerEvent);
if (SUCCEEDED(hr))
{
while (WaitForMultipleObjects(2, hEvent, FALSE, INFINITE) == WAIT_OBJECT_0)
{
PEER_COLLAB_EVENT_DATA *pEventData = NULL;
// retrieve all event data
while (PeerCollabGetEventData(hPeerEvent, &pEventData) == S_OK)
{
switch(pEventData->eventType)
{
case PEER_EVENT_WATCHLIST_CHANGED:
wprintf(L"PEER_EVENT_WATCHLIST_CHANGED event signalled\n");
break;
case PEER_EVENT_ENDPOINT_CHANGED:
wprintf(L"PEER_EVENT_ENDPOINT_CHANGED\n");
break;
case PEER_EVENT_ENDPOINT_PRESENCE_CHANGED:
wprintf(L"PEER_EVENT_ENDPOINT_PRESENCE_CHANGED event signalled\n");
break;
case PEER_EVENT_ENDPOINT_APPLICATION_CHANGED:
wprintf(L"PEER_EVENT_ENDPOINT_APPLICATION_CHANGED event signalled\n");
break;
case PEER_EVENT_ENDPOINT_OBJECT_CHANGED:
wprintf(L"PEER_EVENT_ENDPOINT_OBJECT_CHANGED event signalled\n");
break;
case PEER_EVENT_MY_ENDPOINT_CHANGED:
wprintf(L"PEER_EVENT_MY_ENDPOINT_CHANGED event signalled\n");
break;
case PEER_EVENT_MY_PRESENCE_CHANGED:
wprintf(L"PEER_EVENT_MY_PRESENCE_CHANGED event signalled\n");
break;
case PEER_EVENT_MY_APPLICATION_CHANGED:
wprintf(L"PEER_EVENT_MY_APPLICATION_CHANGED event signalled\n");
break;
case PEER_EVENT_MY_OBJECT_CHANGED:
wprintf(L"PEER_EVENT_MY_OBJECT_CHANGED event signalled\n");
break;
case PEER_EVENT_PEOPLE_NEAR_ME_CHANGED:
wprintf(L"PEER_EVENT_PEOPLE_NEAR_ME_CHANGED event signalled\n");
break;
case PEER_EVENT_REQUEST_STATUS_CHANGED:
wprintf(L"PEER_EVENT_REQUEST_STATUS_CHANGED event signalled\n");
break;
}
switch (pEventData->eventType)
{
case PEER_EVENT_WATCHLIST_CHANGED:
DisplayWatchListChanged(&pEventData->watchListChangedData);
break;
case PEER_EVENT_ENDPOINT_PRESENCE_CHANGED: //intentional fallthrough
case PEER_EVENT_MY_PRESENCE_CHANGED:
DisplayPresenceChanged(&pEventData->presenceChangedData);
break;
case PEER_EVENT_ENDPOINT_APPLICATION_CHANGED: //intentional fallthrough
case PEER_EVENT_MY_APPLICATION_CHANGED:
DisplayApplicationChanged(&pEventData->applicationChangedData);
break;
case PEER_EVENT_ENDPOINT_OBJECT_CHANGED: //intentional fallthrough
case PEER_EVENT_MY_OBJECT_CHANGED:
DisplayObjectChanged(&pEventData->objectChangedData);
break;
case PEER_EVENT_ENDPOINT_CHANGED: //intentional fallthrough
case PEER_EVENT_MY_ENDPOINT_CHANGED:
DisplayEndpointChanged(&pEventData->endpointChangedData);
break;
case PEER_EVENT_PEOPLE_NEAR_ME_CHANGED:
DisplayPeopleNearMeChanged(&pEventData->peopleNearMeChangedData);
break;
case PEER_EVENT_REQUEST_STATUS_CHANGED:
DisplayRequestStatusChanged(&pEventData->requestStatusChangedData);
break;
default: //do nothing
break;
}
//Print a seperator line
wprintf(L"--------------------------------\n");
SAFE_PEER_FREE_DATA(pEventData);
}
}
}
else
{
wprintf(L"PeerCollabRegisterEvent failed.\nHRESULT=0x%x\n", hr);
PrintError(hr);
}
hr = S_OK;
exit:
if (hPeerEvent != NULL)
{
(void) PeerCollabUnregisterEvent(hPeerEvent);
hPeerEvent = NULL;
}
if (hEvent[0] != NULL)
{
CloseHandle(hEvent[0]);
hEvent[0] = NULL;
}
if (hEvent[1] != NULL)
{
CloseHandle(hEvent[1]);
hEvent[1] = NULL;
}
return hr;
}