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

311 lines
8.8 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 "SignIn.h"
#include "EndpointInfo.h"
#include "Presence.h"
#include "pnm.h"
#include "contacts.h"
#include "Publication.h"
#include "invite.h"
#include "Events.h"
//-----------------------------------------------------------------------------
// Function: PrintMenu
// Purpose: Prints a menu of options to the user
// Parameters: None
//
void PrintMenu()
{
wprintf(L"\n"
L"Sign In and Endpoint Info Presence\n"
L" 1. Sign In 16. Get presence information\n"
L" 2. Sign Out 17. Set presence information\n"
L" 3. Display Sign In Options\n"
L" 4. Set our endpoint name Publication\n"
L" 5. Get our endpoint name 18. Subscribe to a PNM endpoint\n"
L" 6. Display endpoint info 19. Unsubscribe from a PNM endpoint\n"
L" 20. Publish an object\n"
L"People Near Me 21. Delete a published object\n"
L" 7. Enumerate PNM\n"
L" 8. Add a PNM endpoint to contacts Invitations\n"
L" 22. Register this Application\n"
L"Contacts 23. Unregister this Application\n"
L" 9. Export \"Me\" Contact 24. Display Registered Applications\n"
L" 10. Parse Contact 25. Send Invitation\n"
L" 11. Import Contact\n"
L" 12. Delete Contact\n"
L" 13. Display Contacts\n"
L" 14. Set contact watch state\n"
L" 15. Set watch permissions\n"
L"\n"
L" Q. Quit\n"
L"> ");
}
//-----------------------------------------------------------------------------
// Function: PrintMenu
// Purpose: Prints a menu, retrieves the user selection, calls the handler, loops.
// Returns when "Quit" is selected from the menu
// Parameters: None
//
void RunMenu()
{
HRESULT hr;
WCHAR wzBuff[INPUT_BUFSIZE];
int nInput;
// Continuously show the menu to user and respond to their request
//
while (TRUE)
{
PrintMenu();
fflush(stdin);
hr = StringCbGets(wzBuff, sizeof(wzBuff));
if (FAILED(hr))
{
wprintf (L"Invalid input, expected a number between 1 and 25 or Q to quit.\n");
continue;
}
if ((wcsncmp(wzBuff, L"Q", INPUT_BUFSIZE) == 0) || (wcsncmp(wzBuff, L"q", INPUT_BUFSIZE) == 0))
{
// break out of while loop.
//
break;
}
// since wtoi can't distinguish between 0 and an error, note that valid values start at 1, not 0
nInput = _wtoi(wzBuff);
if (nInput < 1 || nInput > 25)
{
printf ("Invalid input, expected a number between 1 and 25 or Q to quit.\n");
continue;
}
switch (nInput)
{
case 1:
SignIn();
break;
case 2:
SignOut();
break;
case 3:
SignInOptions();
break;
case 4:
SetEndpointName();
break;
case 5:
GetEndpointName();
break;
case 6:
DisplayEndpointInformation();
break;
case 7:
EnumeratePeopleNearMe();
break;
case 8:
AddEndpointAsContact();
break;
case 9:
ExportContact();
break;
case 10:
ParseContact();
break;
case 11:
ImportContact();
break;
case 12:
DeleteContact();
break;
case 13:
EnumContacts();
break;
case 14:
SetWatching();
break;
case 15:
SetWatchPermissions();
break;
case 16:
GetPresenceInformation();
break;
case 17:
SetPresenceInformation();
break;
case 18:
SubscribeEndpointData();
break;
case 19:
UnsubscribeEndpointData();
break;
case 20:
PublishEndpointObject();
break;
case 21:
DeleteEndpointObject();
break;
case 22:
RegisterApplication();
break;
case 23:
UnregisterApplication();
break;
case 24:
DisplayApplicationRegistrations();
break;
case 25:
SendInvite();
break;
default:
wprintf(L"Invalid selection.\n");
break;
}
//Pause so that our output doesn't scroll
//off the screen before the user gets a change to
//read it.
wprintf(L"\n\nPress <ENTER> to continue.\n");
fflush(stdin);
(void)StringCbGets(wzBuff, sizeof(wzBuff));
}
}
int __cdecl wmain(int argc, __in_ecount(argc) wchar_t *argv[])
{
HRESULT hr;
BOOL fPeerCollabRunning = FALSE;
hr = PeerCollabStartup(PEER_COLLAB_VERSION);
if (FAILED(hr))
{
goto exit;
}
//PeerCollabStartup was successful. Must call PeerCollabShutdown before we terminate
fPeerCollabRunning = TRUE;
if (argc > 1)
{
if (wcscmp(argv[1], L"/invite") == 0)
{
// When we regsiter ourselves to be launched in response to an
// invite we specify that the command line argument "/invite"
// should be used
//
DisplayAppLauchInfo();
}
else if (wcscmp(argv[1], L"/showevents") == 0)
{
//Run the event handler. This will return once the
//process running the interactive menu exits
printf("----------------------------------------------\n");
printf("Interactive menu is running in original window\n");
printf("\n");
printf("Collaboration events will print to this window\n");
printf("----------------------------------------------\n");
EventHandler();
hr = S_OK;
goto exit;
}
}
{
//Launch a second process that appears in a seperate console window.
//That process will print collaboration events as they occur.
//
//We will use this console window for the interactive menu.
//Launch ourselves as a second process with the "/showevents" command
//line option.
WCHAR cmdLine[512];
STARTUPINFO startupInfo = {0};
PROCESS_INFORMATION procInfo = {0};
ZeroMemory( &startupInfo, sizeof(startupInfo) );
startupInfo.cb = sizeof(startupInfo);
ZeroMemory( &procInfo, sizeof(procInfo) );
StringCchPrintf(cmdLine, celems(cmdLine), L"%s /showevents", argv[0]);
if (!CreateProcess(argv[0], cmdLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &procInfo))
{
printf("Unable to lauch child process.\n");
goto exit;
}
//Close the handles from CreateProcess. We do not need them
CloseHandle(procInfo.hProcess);
CloseHandle(procInfo.hThread);
// Run the menu and allow the user to exercise the collaboration
// sample interactively
//
RunMenu();
}
exit:
if (fPeerCollabRunning != FALSE)
{
PeerCollabShutdown();
}
return SUCCEEDED(hr)?0:-1;
}