315 lines
6.5 KiB
C++
315 lines
6.5 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1992.
|
|
//
|
|
// File: cubes.cxx
|
|
//
|
|
// Contents: implementations for CCube
|
|
//
|
|
// Functions:
|
|
// CCube::CCube
|
|
// CCube::~CCube
|
|
// CCube::QueryInterface
|
|
// CCube::CreateCube
|
|
// CCube::MoveCube
|
|
// CCube::GetCubePos
|
|
//
|
|
// History: 06-Aug-92 Ricksa Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include <pch.cxx>
|
|
#pragma hdrstop
|
|
#include <ccubes.hxx> // class definition
|
|
#include <iballs.h> // IBalls interface definiton
|
|
|
|
|
|
#define CUBE_WIDTH 20
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CCube::CCube
|
|
//
|
|
// Synopsis: Creates the application window
|
|
//
|
|
// Arguments: [pisb] - ISysBind instance
|
|
//
|
|
// History: 06-Aug-92 Ricksa Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
CCube::CCube(void)
|
|
: _xPos(CUBE_UNDEF),
|
|
_yPos(CUBE_UNDEF)
|
|
{
|
|
CreateCube(0,0);
|
|
GlobalRefs(TRUE);
|
|
|
|
ENLIST_TRACKING(CCube);
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CCube::~CCube
|
|
//
|
|
// Synopsis: Cleans up object
|
|
//
|
|
// History: 06-Aug-92 Ricksa Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
CCube::~CCube(void)
|
|
{
|
|
GlobalRefs(FALSE);
|
|
|
|
// automatic actions are enough
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CCube::QueryInterface
|
|
//
|
|
// Synopsis: Gets called when a WM_COMMAND message received.
|
|
//
|
|
// Arguments: [ifid] - interface instance requested
|
|
// [ppunk] - where to put pointer to interface instance
|
|
//
|
|
// Returns: S_OK or ERROR_BAD_COMMAND
|
|
//
|
|
// History: 06-Aug-92 Ricksa Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
STDMETHODIMP CCube::QueryInterface(REFIID riid, void **ppunk)
|
|
{
|
|
SCODE sc = E_NOINTERFACE;
|
|
*ppunk = NULL;
|
|
|
|
if (IsEqualIID(riid, IID_IUnknown) ||
|
|
IsEqualIID(riid, IID_ICube))
|
|
{
|
|
// Increase the reference count
|
|
*ppunk = (void *)(ICube *) this;
|
|
AddRef();
|
|
|
|
// Set to success
|
|
sc = S_OK;
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CCube::CreateCube
|
|
//
|
|
// Synopsis: Creates a Cube on the screen
|
|
//
|
|
// Arguments: [xPos] - x position for new Cube
|
|
// [yPos] - y position for new Cube
|
|
//
|
|
// Returns: S_OK or ERROR_BAD_COMMAND
|
|
//
|
|
// History: 06-Aug-92 Ricksa Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
STDMETHODIMP CCube::CreateCube(ULONG xPos, ULONG yPos)
|
|
{
|
|
SCODE sc = E_FAIL;
|
|
|
|
if (xPos != (ULONG) -1)
|
|
{
|
|
// Update data
|
|
_xPos = xPos;
|
|
_yPos = yPos;
|
|
sc = S_OK;
|
|
|
|
// Format message for the screen
|
|
Display(TEXT("Create Cube xPos = %ld yPos = %ld\n"), xPos, yPos);
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: CCube::MoveCube
|
|
//
|
|
// Synopsis: Move the Cube from one position to another
|
|
//
|
|
// Arguments: [xPos] - new x position for the Cube
|
|
// [yPos] - new y position for the Cube
|
|
//
|
|
// Returns: S_OK
|
|
//
|
|
// History: 06-Aug-92 Ricksa Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
STDMETHODIMP CCube::MoveCube(ULONG xPos, ULONG yPos)
|
|
{
|
|
// Set the position
|
|
_xPos = xPos;
|
|
_yPos = yPos;
|
|
|
|
// Format message for the screen
|
|
Display(TEXT("Move Cube xPos = %ld yPos = %ld\n"), xPos, yPos);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: CCube::GetCubePos
|
|
//
|
|
// Synopsis: Get the current position of the Cube
|
|
//
|
|
// Arguments: [hWindow] - handle for the window
|
|
//
|
|
// Returns: S_OK
|
|
//
|
|
// History: 06-Aug-92 Ricksa Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
STDMETHODIMP CCube::GetCubePos(ULONG *pxPos, ULONG *pyPos)
|
|
{
|
|
*pxPos = _xPos;
|
|
*pyPos = _yPos;
|
|
|
|
// Format message for the screen
|
|
Display(TEXT("Get Cube Pos xPos = %ld yPos = %ld\n"), _xPos, _yPos);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: CCube::Contains
|
|
//
|
|
// Synopsis: Check if this Cube is contained in the given cube.
|
|
//
|
|
// Arguments: [hWindow] - handle for the window
|
|
// [pICube] - cube to compare with
|
|
//
|
|
// Returns: S_OK
|
|
//
|
|
// History: 06-Aug-92 Ricksa Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
STDMETHODIMP CCube::Contains(IBalls *pIBall)
|
|
{
|
|
ULONG xPos, yPos;
|
|
|
|
SCODE sc = pIBall->GetBallPos(&xPos, &yPos);
|
|
|
|
if (SUCCEEDED(sc))
|
|
{
|
|
if ((abs(xPos - _xPos) < CUBE_WIDTH) &&
|
|
(abs(yPos - _yPos) < CUBE_WIDTH))
|
|
{
|
|
// Format message for the screen
|
|
Display(TEXT("Cube contains in Ball. xPos = %ld yPos = %ld\n"), xPos, yPos);
|
|
}
|
|
else
|
|
{
|
|
// Format message for the screen
|
|
Display(TEXT("Ball Outside Cube. xPos = %ld yPos = %ld\n"), xPos, yPos);
|
|
}
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: CCube::SimpleCall
|
|
//
|
|
// Synopsis: checks the TID and LID to make sure they match the callers.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns: S_OK
|
|
//
|
|
// History: 16-Jan-96 RickHi Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
STDMETHODIMP CCube::SimpleCall(DWORD pidCaller, DWORD tidCaller, GUID lidCaller)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
GUID lid;
|
|
HRESULT hr2 = CoGetCurrentLogicalThreadId(&lid);
|
|
|
|
if (SUCCEEDED(hr2))
|
|
{
|
|
if (!IsEqualGUID(lid, lidCaller))
|
|
{
|
|
// LIDs dont match, error
|
|
hr |= 0x80000001;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return hr2;
|
|
}
|
|
|
|
DWORD tid;
|
|
hr2 = CoGetCallerTID(&tid);
|
|
|
|
if (SUCCEEDED(hr2))
|
|
{
|
|
if (pidCaller == GetCurrentProcessId())
|
|
{
|
|
// if in same process, CoGetCallerTID should return S_OK
|
|
if (hr2 != S_OK)
|
|
{
|
|
hr |= 0x80000002;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// if in different process, CoGetCallerTID should return S_FALSE
|
|
if (hr2 != S_FALSE)
|
|
{
|
|
hr |= 0x80000004;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return hr2;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
STDMETHODIMP CCube::PrepForInputSyncCall(IUnknown *pUnkIn)
|
|
{
|
|
// just remember the input ptr
|
|
|
|
_pUnkIn = pUnkIn;
|
|
_pUnkIn->AddRef();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CCube::InputSyncCall()
|
|
{
|
|
// just attempt to release an Interface Pointer inside an InputSync
|
|
// method.
|
|
|
|
if (_pUnkIn)
|
|
{
|
|
if (_pUnkIn->Release() != 0)
|
|
return RPC_E_CANTCALLOUT_ININPUTSYNCCALL;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|