//+------------------------------------------------------------------------- // // 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 #pragma hdrstop #include // class definition #include // 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; }