Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1430 lines
31 KiB

#include "precomp.h"
#include "gcchelp.h"
#include "coder.hpp"
#include "drawobj.hpp"
#include "NMWbObj.h"
extern Coder * g_pCoder;
UINT AllocateFakeGCCHandle(void)
{
return g_localGCCHandle++;
}
void SetFakeGCCHandle(UINT fakeGCCHandle)
{
g_localGCCHandle = fakeGCCHandle;
}
//
// Add drawings/bitmaps etc... to workspace
//
BOOL AddT126ObjectToWorkspace(T126Obj *pObj)
{
WorkspaceObj * pWorkspace = GetWorkspace(pObj->GetWorkspaceHandle());
if(pWorkspace)
{
pWorkspace->AddTail(pObj);
g_numberOfObjects++;
return TRUE;
}
else
{
WARNING_OUT(("Object sent to invalid workspace %d, will be deleted now!!!", GetWorkspace(pObj->GetWorkspaceHandle())));
delete pObj;
return FALSE;
}
}
//
// Cleanup for all pdus we send
//
void SIPDUCleanUp(SIPDU *sipdu)
{
switch(sipdu->choice)
{
//
// Simple cleanup
//
case bitmapDeletePDU_chosen:
case drawingDeletePDU_chosen:
case workspaceDeletePDU_chosen:
case workspaceRefreshStatusPDU_chosen:
break;
//
// Bitmap Create cleanup
//
case bitmapCreatePDU_chosen:
{
if(sipdu->u.bitmapCreatePDU.nonStandardParameters)
{
delete sipdu->u.bitmapCreatePDU.nonStandardParameters;
}
PBitmapCreatePDU_attributes pAttrib;
PBitmapCreatePDU_attributes pNextAttrib;
pAttrib = sipdu->u.bitmapCreatePDU.attributes;
while(pAttrib)
{
pNextAttrib = pAttrib->next;
delete pAttrib;
pAttrib = pNextAttrib;
}
}
break;
case bitmapEditPDU_chosen:
{
BitmapEditPDU_attributeEdits * pAttrib;
BitmapEditPDU_attributeEdits * pNextAttrib;
pAttrib = sipdu->u.bitmapEditPDU.attributeEdits;
while(pAttrib)
{
pNextAttrib = pAttrib->next;
delete pAttrib;
pAttrib = pNextAttrib;
}
}
break;
//
// Bitmap Continue cleanup
//
case bitmapCreateContinuePDU_chosen:
{
if(sipdu->u.bitmapCreateContinuePDU.nonStandardParameters)
{
delete sipdu->u.bitmapCreateContinuePDU.nonStandardParameters;
}
}
break;
//
// Drawing Edit Cleanup
//
case drawingEditPDU_chosen:
{
if(sipdu->u.drawingEditPDU.bit_mask & DrawingEditPDU_attributeEdits_present)
{
PDrawingEditPDU_attributeEdits pAttrib;
PDrawingEditPDU_attributeEdits pNextAttrib;
pAttrib = sipdu->u.drawingEditPDU.attributeEdits;
while(pAttrib)
{
pNextAttrib = pAttrib->next;
delete pAttrib;
pAttrib = pNextAttrib;
}
}
if(sipdu->u.drawingEditPDU.pointListEdits.value[0].subsequentPointEdits.u.pointsDiff16)
{
PPointList_pointsDiff16 drawingPoint = sipdu->u.drawingEditPDU.pointListEdits.value[0].subsequentPointEdits.u.pointsDiff16;
PPointList_pointsDiff16 drawingPointNext = drawingPoint;
while(drawingPointNext)
{
drawingPointNext = drawingPoint->next;
delete drawingPoint;
drawingPoint = drawingPointNext;
}
}
}
break;
//
// Drawing Edit cleanup
//
case drawingCreatePDU_chosen:
{
PDrawingCreatePDU_attributes pNextAttrib;
PDrawingCreatePDU_attributes pAttrib;
pAttrib = sipdu->u.drawingCreatePDU.attributes;
while(pAttrib)
{
pNextAttrib = pAttrib->next;
delete pAttrib;
pAttrib = pNextAttrib;
}
PPointList_pointsDiff16 pNextPoint;
PPointList_pointsDiff16 pPoint;
pPoint = sipdu->u.drawingCreatePDU.pointList.u.pointsDiff16;
while(pPoint)
{
pNextPoint = pPoint->next;
delete pPoint;
pPoint = pNextPoint;
}
}
break;
//
// Non Standard cleanup
//
case siNonStandardPDU_chosen:
if(sipdu->u.siNonStandardPDU.nonStandardTransaction.data.value)
{
delete sipdu->u.siNonStandardPDU.nonStandardTransaction.data.value;
}
break;
//
// Workspace Edit cleanup
//
case workspaceEditPDU_chosen:
{
if(sipdu->u.workspaceEditPDU.bit_mask & viewEdits_present)
{
PWorkspaceEditPDU_viewEdits_Set_action_editView pEditView = sipdu->u.workspaceEditPDU.viewEdits->value.action.u.editView;
PWorkspaceEditPDU_viewEdits_Set_action_editView pNextEditView = pEditView;
while(pNextEditView)
{
pNextEditView = pEditView->next;
delete pEditView;
pEditView = pNextEditView;
}
delete sipdu->u.workspaceEditPDU.viewEdits;
}
}
break;
//
// Workspace Create cleanup
//
case workspaceCreatePDU_chosen:
{
if(sipdu->u.workspaceCreatePDU.viewParameters)
{
if(sipdu->u.workspaceCreatePDU.viewParameters->value.viewAttributes)
{
delete sipdu->u.workspaceCreatePDU.viewParameters->value.viewAttributes;
}
delete sipdu->u.workspaceCreatePDU.viewParameters;
}
if(sipdu->u.workspaceCreatePDU.planeParameters)
{
PWorkspaceCreatePDU_planeParameters_Seq_usage pNextUsage;
PWorkspaceCreatePDU_planeParameters_Seq_usage pUsage = sipdu->u.workspaceCreatePDU.planeParameters->value.usage;
while(pUsage)
{
pNextUsage = pUsage->next;
delete pUsage;
pUsage = pNextUsage;
}
delete sipdu->u.workspaceCreatePDU.planeParameters->value.planeAttributes;
PWorkspaceCreatePDU_planeParameters pNextPlaneParameters;
PWorkspaceCreatePDU_planeParameters pPlaneParameters = sipdu->u.workspaceCreatePDU.planeParameters;
while(pPlaneParameters)
{
pNextPlaneParameters = pPlaneParameters->next;
delete pPlaneParameters;
pPlaneParameters = pNextPlaneParameters;
}
}
}
break;
default:
ERROR_OUT(("UNKNOWN PDU TYPE = %d we may leak memory", sipdu->choice));
break;
}
delete sipdu;
}
//
// Cleans the retry list, when we close down or disconnect
//
void DeleteAllRetryPDUS(void)
{
SIPDU * sipdu;
while((sipdu = (SIPDU *)g_pRetrySendList->RemoveTail()) != NULL)
{
SIPDUCleanUp(sipdu);
}
}
//
// Retry sending buffered pdus and send the new pdu
//
T120Error SendT126PDU(SIPDU * pPDU)
{
MLZ_EntryOut(ZONE_FUNCTION, "SendT126PDU");
//
// First send buffered pdus
//
RetrySend();
//
// Now send the current pdu
//
T120Error rc = SendPDU(pPDU, FALSE);
return rc;
}
//
// Retry sending pdus that couldn't be sent before
//
void RetrySend(void)
{
MLZ_EntryOut(ZONE_FUNCTION, "RetrySend");
if(g_fWaitingForBufferAvailable)
{
return;
}
TRACE_MSG(("RetrySend"));
SIPDU * sipdu;
while((sipdu = (SIPDU *)g_pRetrySendList->RemoveTail()) != NULL)
{
TRACE_DEBUG(("RetrySend sipdu->choice = %d", sipdu->choice));
T120Error rc = SendPDU(sipdu, TRUE);
if(rc == T120_NO_ERROR)
{
TRACE_DEBUG(("RetrySend OK!!!"));
SIPDUCleanUp(sipdu);
}
else
{
TRACE_DEBUG(("RetrySend Failed"));
break;
}
}
}
//
// Send T126 pdus down to the conference
//
T120Error SendPDU(SIPDU * pPDU, BOOL bRetry)
{
MLZ_EntryOut(ZONE_FUNCTION, "SendPDU");
T120Error rc = T120_NO_ERROR;
//
// If we are in a conference
//
if(g_pNMWBOBJ->IsInConference() || g_bSavingFile)
{
ASN1_BUF encodedPDU;
g_pCoder->Encode(pPDU, &encodedPDU);
if(g_bSavingFile)
{
g_pMain->ObjectSave(TYPE_T126_ASN_OBJECT, encodedPDU.value, encodedPDU.length);
}
else
{
if(!g_fWaitingForBufferAvailable)
{
T120Priority ePriority = APPLET_LOW_PRIORITY;
if(pPDU->choice == workspaceCreatePDU_chosen ||
pPDU->choice == workspaceEditPDU_chosen ||
pPDU->choice == workspaceDeletePDU_chosen)
{
//
// Do what the standard says send the pdus in 3 different priorities
//
TRACE_MSG(("SendPDU sending PDU length = %d in APPLET_HIGH_PRIORITY", encodedPDU.length));
rc = g_pNMWBOBJ->SendData(APPLET_HIGH_PRIORITY,
encodedPDU.length,
encodedPDU.value);
TRACE_MSG(("SendPDU sending PDU length = %d in APPLET_MEDIUM_PRIORITY", encodedPDU.length));
if(rc == T120_NO_ERROR)
{
rc = g_pNMWBOBJ->SendData(APPLET_MEDIUM_PRIORITY,
encodedPDU.length,
encodedPDU.value);
}
}
TRACE_MSG(("SendPDU sending PDU length = %d in APPLET_LOW_PRIORITY", encodedPDU.length));
if(rc == T120_NO_ERROR)
{
rc = g_pNMWBOBJ->SendData(ePriority,
encodedPDU.length,
encodedPDU.value);
}
if(rc == MCS_TRANSMIT_BUFFER_FULL)
{
g_fWaitingForBufferAvailable = TRUE;
//
// We need to add it back to the correct position
//
if(bRetry)
{
g_pRetrySendList->AddTail(pPDU);
}
else
{
g_pRetrySendList->AddHead(pPDU);
}
}
}
else
{
rc = MCS_TRANSMIT_BUFFER_FULL;
g_pRetrySendList->AddHead(pPDU);
}
}
// Free the encoder memory
g_pCoder->Free(encodedPDU);
}
return rc;
}
BOOL T126_MCSSendDataIndication(ULONG uSize, LPBYTE pb, ULONG memberID, BOOL bResend)
{
BOOL bRet = TRUE;
SIPDU * pDecodedPDU;
ASN1_BUF InputBuffer;
InputBuffer.length = uSize;
InputBuffer.value = pb;
//
// Decode incoming PDU
if(ASN1_SUCCEEDED(g_pCoder->Decode(&InputBuffer, &pDecodedPDU)))
{
switch(pDecodedPDU->choice)
{
// case (archiveAcknowledgePDU_chosen):
// {
// TRACE_DEBUG((">>> Received a archiveAcknowledgePDU"));
// TRACE_DEBUG(("No action taken"));
// break;
// }
// case (archiveClosePDU_chosen):
// {
// TRACE_DEBUG((">>> Received a archiveClosePDU"));
// TRACE_DEBUG(("No action taken"));
// break;
// }
// case (archiveErrorPDU_chosen):
// {
// TRACE_DEBUG((">>> Received a archiveErrorPDU"));
// TRACE_DEBUG(("No action taken"));
// break;
// }
// case (archiveOpenPDU_chosen):
// {
// TRACE_DEBUG((">>> Received a archiveOpenPDU"));
// TRACE_DEBUG(("No action taken"));
// break;
// }
case (bitmapAbortPDU_chosen):
{
TRACE_DEBUG((">>> Received a bitmapAbortPDU"));
OnBitmapAbortPDU(&pDecodedPDU->u.bitmapAbortPDU, memberID);
break;
}
case (bitmapCheckpointPDU_chosen):
{
TRACE_DEBUG((">>> Received a bitmapCheckpointPDU"));
OnBitmapCheckpointPDU(&pDecodedPDU->u.bitmapCheckpointPDU, memberID);
break;
}
case (bitmapCreatePDU_chosen):
{
TRACE_DEBUG((">>> Received a bitmapCreatePDU"));
OnBitmapCreatePDU(&pDecodedPDU->u.bitmapCreatePDU, memberID, bResend);
break;
}
case (bitmapCreateContinuePDU_chosen):
{
TRACE_DEBUG((">>> Received a bitmapCreateContinuePDU"));
OnBitmapCreateContinuePDU(&pDecodedPDU->u.bitmapCreateContinuePDU, memberID, bResend);
break;
}
case (bitmapDeletePDU_chosen):
{
TRACE_DEBUG((">>> Received a bitmapDeletePDU"));
OnBitmapDeletePDU(&pDecodedPDU->u.bitmapDeletePDU, memberID);
break;
}
case (bitmapEditPDU_chosen):
{
TRACE_DEBUG((">>> Received a bitmapEditPDU"));
OnBitmapEditPDU(&pDecodedPDU->u.bitmapEditPDU, memberID);
break;
}
case (conductorPrivilegeGrantPDU_chosen):
{
TRACE_DEBUG((">>> Received a conductorPrivilegeGrantPDU"));
TRACE_DEBUG(("No action taken"));
break;
}
case (conductorPrivilegeRequestPDU_chosen):
{
TRACE_DEBUG((">>> Received a conductorPrivilegeRequestPDU"));
TRACE_DEBUG(("No action taken"));
break;
}
case (drawingCreatePDU_chosen):
{
TRACE_DEBUG((">>> Received a drawingCreatePDU"));
OnDrawingCreatePDU(&pDecodedPDU->u.drawingCreatePDU, memberID, bResend);
break;
}
case (drawingDeletePDU_chosen):
{
TRACE_DEBUG((">>> Received a drawingDeletePDU"));
OnDrawingDeletePDU(&pDecodedPDU->u.drawingDeletePDU, memberID);
break;
}
case (drawingEditPDU_chosen):
{
TRACE_DEBUG((">>> Received a drawingEditPDU"));
OnDrawingEditPDU(&pDecodedPDU->u.drawingEditPDU, memberID, bResend);
break;
}
// case (remoteEventPermissionGrantPDU_chosen):
// {
// TRACE_DEBUG((">>> Received a remoteEventPermissionGrantPDU"));
// TRACE_DEBUG(("No action taken"));
// break;
// }
// case (remoteEventPermissionRequestPDU_chosen):
// {
// TRACE_DEBUG((">>> Received a remoteEventPermissionRequestPDU"));
// TRACE_DEBUG(("No action taken"));
// break;
// }
// case (remoteKeyboardEventPDU_chosen):
// {
// TRACE_DEBUG((">>> Received a remoteKeyboardEventPDU"));
// TRACE_DEBUG(("No action taken"));
// break;
// }
// case (remotePointingDeviceEventPDU_chosen):
// {
// TRACE_DEBUG((">>> Received a remotePointingDeviceEventPDU"));
// TRACE_DEBUG(("No action taken"));
// break;
// }
// case (remotePrintPDU_chosen):
// {
// TRACE_DEBUG((">>> Received a remotePrintPDU"));
// TRACE_DEBUG(("No action taken"));
// break;
// }
case (siNonStandardPDU_chosen):
{
if(pDecodedPDU->u.siNonStandardPDU.nonStandardTransaction.nonStandardIdentifier.choice == h221nonStandard_chosen)
{
PT126_VENDORINFO pVendorInfo = (PT126_VENDORINFO)pDecodedPDU->u.siNonStandardPDU.nonStandardTransaction.nonStandardIdentifier.u.h221nonStandard.value;
if (!lstrcmp((LPSTR)&pVendorInfo->nonstandardString, NonStandardTextID))
{
TEXTPDU_HEADER *pHeader = (TEXTPDU_HEADER*) pDecodedPDU->u.siNonStandardPDU.nonStandardTransaction.data.value;
switch(pHeader->nonStandardPDU)
{
case textCreatePDU_chosen:
TRACE_DEBUG((">>> Received a textCreatePDU_chosen"));
OnTextCreatePDU((MSTextPDU*)pHeader, memberID, bResend);
break;
case textEditPDU_chosen:
TRACE_DEBUG((">>> Received a textEditPDU_chosen"));
OnTextEditPDU((MSTextPDU*)pHeader, memberID);
break;
case textDeletePDU_chosen:
TRACE_DEBUG((">>> Received a textDeletePDU_chosen"));
OnTextDeletePDU(pHeader, memberID);
break;
default:
TRACE_DEBUG(("Invalid text pdu"));
break;
}
}
}
break;
}
case (workspaceCreatePDU_chosen):
{
TRACE_DEBUG((">>> Received a workspaceCreatePDU"));
OnWorkspaceCreatePDU(&pDecodedPDU->u.workspaceCreatePDU, memberID, bResend);
break;
}
case (workspaceCreateAcknowledgePDU_chosen):
{
TRACE_DEBUG((">>> Received a workspaceCreateAcknowledgePDU"));
OnWorkspaceCreateAcknowledgePDU(&pDecodedPDU->u.workspaceCreateAcknowledgePDU, memberID);
break;
}
case (workspaceDeletePDU_chosen):
{
TRACE_DEBUG((">>> Received a workspaceDeletePDU"));
OnWorkspaceDeletePDU(&pDecodedPDU->u.workspaceDeletePDU, memberID);
break;
}
case (workspaceEditPDU_chosen):
{
TRACE_DEBUG((">>> Received a workspaceEditPDU"));
OnWorkspaceEditPDU(&pDecodedPDU->u.workspaceEditPDU, memberID);
break;
}
case (workspacePlaneCopyPDU_chosen):
{
TRACE_DEBUG((">>> Received a workspacePlaneCopyPDU"));
OnWorkspacePlaneCopyPDU(&pDecodedPDU->u.workspacePlaneCopyPDU, memberID);
break;
}
case (workspaceReadyPDU_chosen):
{
TRACE_DEBUG((">>> Received a workspaceReadyPDU"));
OnWorkspaceReadyPDU(&pDecodedPDU->u.workspaceReadyPDU, memberID);
break;
}
case (workspaceRefreshStatusPDU_chosen):
{
TRACE_DEBUG((">>> Received a workspaceRefreshStatusPDU"));
OnWorkspaceRefreshStatusPDU(&pDecodedPDU->u.workspaceRefreshStatusPDU, memberID);
break;
}
// case (fontPDU_chosen):
// {
// TRACE_DEBUG((">>> Received a fontPDU"));
// TRACE_DEBUG(("No action taken"));
// break;
// }
// case (textCreatePDU_chosen):
// {
// TRACE_DEBUG((">>> Received a textCreatePDU"));
// TRACE_DEBUG(("No action taken"));
// break;
// }
// case (textDeletePDU_chosen):
// {
// TRACE_DEBUG((">>> Received a textDeletePDU"));
// TRACE_DEBUG(("No action taken"));
// break;
// }
// case (textEditPDU_chosen):
// {
// TRACE_DEBUG((">>> Received a textEditPDU"));
// TRACE_DEBUG(("No action taken"));
// break;
// }
// case (videoWindowCreatePDU_chosen):
// {
// TRACE_DEBUG((">>> Received a videoWindowCreatePDU"));
// TRACE_DEBUG(("No action taken"));
// break;
// }
// case (videoWindowDeleatePDU_chosen):
// {
// TRACE_DEBUG((">>> Received a videoWindowDeleatePDU"));
// TRACE_DEBUG(("No action taken"));
// break;
// }
// case (videoWindowEditPDU_chosen):
// {
// TRACE_DEBUG((">>> Received a videoWindowEditPDU"));
// TRACE_DEBUG(("No action taken"));
// break;
// }
default:
bRet = FALSE;
TRACE_DEBUG(("Receive an Unhandled PDU choice = %d", pDecodedPDU->choice));
break;
}
}
//
// Free the decoded pdu
// JOSEF: for performance in the future we could pass
// the decoded buffer to the ui, avoiding more memory allocation.
// But it will be hard to read the code, since the T126 structures
// are a bit confusing.
//
g_pCoder->Free(pDecodedPDU);
return bRet;
}
//
// Delete All Workspaces sent and received
//
void DeleteAllWorkspaces(BOOL sendPDU)
{
T126Obj * pObj;
if(g_pDraw && g_pDraw->m_pTextEditor)
{
g_pDraw->m_pTextEditor->AbortEditGently();
}
g_pCurrentWorkspace = NULL;
g_pConferenceWorkspace = NULL;
while ((pObj = (T126Obj *)g_pListOfWorkspaces->RemoveTail()) != NULL)
{
if(sendPDU)
{
pObj->DeletedLocally();
}
else
{
pObj->ClearDeletionFlags();
}
delete pObj;
}
if(g_pMain)
{
g_pMain->EnableToolbar(FALSE);
g_pMain->UpdatePageButtons();
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
// TEXT PDUS
/////////////////////////////////////////////////////////////////////////////////////////////
void OnTextCreatePDU(MSTextPDU* pCreatePDU, ULONG memberID, BOOL bForcedResend)
{
WorkspaceObj* pWObj;
WbTextEditor * pText;
//
// Check for resend
//
if(!bForcedResend)
{
pWObj = GetWorkspace(pCreatePDU->header.workspaceHandle);
if(pWObj)
{
pText = (WbTextEditor *)pWObj->FindObjectInWorkspace(pCreatePDU->header.textHandle);
if(pText)
{
TRACE_DEBUG(("drawingHandle already used = %d", pCreatePDU->header.textHandle ));
return;
}
}
}
//
// New Drawing object
//
DBG_SAVE_FILE_LINE
pText = new WbTextEditor();
pText->SetWorkspaceHandle(pCreatePDU->header.workspaceHandle);
pText->SetThisObjectHandle(pCreatePDU->header.textHandle);
if(!bForcedResend)
{
//
// Some one sent us this drawing, it is not created locally
//
pText->ClearCreationFlags();
//
// Add a this drawing to the correct workspace
//
if(!AddT126ObjectToWorkspace(pText))
{
return;
}
}
else
{
//
// Add this object and send Create PDU
//
pText->SetAllAttribs();
pText->SetWorkspaceHandle(g_pCurrentWorkspace == NULL ? 0 : g_pCurrentWorkspace->GetWorkspaceHandle());
pText->ClearSelectionFlags();
pText->GetTextAttrib(&pCreatePDU->attrib);
pText->AddToWorkspace();
pText->Draw();
return;
}
pText->TextEditObj(&pCreatePDU->attrib);
pText->Draw();
pText->ResetAttrib();
}
void OnTextDeletePDU(TEXTPDU_HEADER *pHeader, ULONG memberID)
{
T126Obj* pText;
WorkspaceObj* pWorkspace;
// We should find this drawing object
if(FindObjectAndWorkspace(pHeader->textHandle, (T126Obj**)&pText, (WorkspaceObj**)&pWorkspace))
{
pText->SetOwnerID(memberID);
pWorkspace->RemoveT126Object(pText);
}
}
void OnTextEditPDU(MSTextPDU *pEditPDU, ULONG memberID)
{
TextObj* pText;
WorkspaceObj* pWorkspace;
// We should find this drawing object
if(FindObjectAndWorkspace(pEditPDU->header.textHandle, (T126Obj **)&pText, (WorkspaceObj**)&pWorkspace))
{
pText->SetOwnerID(memberID);
pText->TextEditObj(&pEditPDU->attrib);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
// DRAWING PDUS
/////////////////////////////////////////////////////////////////////////////////////////////
void OnDrawingCreatePDU(DrawingCreatePDU * pdrawingCreatePDU, ULONG memberID, BOOL bForcedResend)
{
WorkspaceObj* pWObj;
DrawObj * pDraw;
UINT workspace;
UINT planeID;
//
// If we don't have a drawing handle dont take it
//
if(!(pdrawingCreatePDU->bit_mask & drawingHandle_present))
{
TRACE_DEBUG(("Got a DrawingCreatePDU but no drawingHandle" ));
return;
}
GetDrawingDestinationAddress(&pdrawingCreatePDU->destinationAddress, &workspace, &planeID);
//
// Check for resend
//
if(!bForcedResend)
{
pWObj = GetWorkspace(workspace);
if(pWObj)
{
pDraw = (DrawObj *)pWObj->FindObjectInWorkspace(pdrawingCreatePDU->drawingHandle);
if(pDraw)
{
TRACE_DEBUG(("drawingHandle already used = %d", pdrawingCreatePDU->drawingHandle ));
return;
}
}
}
//
// New Drawing object
//
DBG_SAVE_FILE_LINE
pDraw = new DrawObj(pdrawingCreatePDU);
pDraw->SetOwnerID(memberID);
if(!bForcedResend)
{
//
// Some one sent us this drawing, it is not created locally
//
pDraw->ClearCreationFlags();
//
// Add a this drawing to the correct workspace
//
if(!AddT126ObjectToWorkspace(pDraw))
{
return;
}
}
else
{
//
// Add this object and send Create PDU
//
pDraw->SetAllAttribs();
pDraw->SetWorkspaceHandle(g_pCurrentWorkspace == NULL ? 0 : g_pCurrentWorkspace->GetWorkspaceHandle());
pDraw->ClearSelectionFlags();
pDraw->AddToWorkspace();
pDraw->Draw();
return;
}
//
// Draw it
//
if(pDraw->GetPenThickness())
{
pDraw->Draw();
pDraw->ResetAttrib();
}
}
void OnDrawingDeletePDU(DrawingDeletePDU * pdrawingDeletePDU, ULONG memberID)
{
DrawObj* pDraw;
WorkspaceObj* pWorkspace;
// We should find this drawing object
if(FindObjectAndWorkspace(pdrawingDeletePDU->drawingHandle, (T126Obj **)&pDraw, (WorkspaceObj**)&pWorkspace))
{
pDraw->SetOwnerID(memberID);
pWorkspace->RemoveT126Object((T126Obj*)pDraw);
}
}
void OnDrawingEditPDU(DrawingEditPDU * pdrawingEditPDU, ULONG memberID, BOOL bResend)
{
DrawObj* pDraw;
WorkspaceObj* pWorkspace;
// We should find this drawing object
if(FindObjectAndWorkspace(pdrawingEditPDU->drawingHandle, (T126Obj **)&pDraw, (WorkspaceObj**)&pWorkspace))
{
pDraw->SetOwnerID(memberID);
pDraw->DrawEditObj(pdrawingEditPDU);
}
else
{
//
// We are reading this pdu from disk add the rest of the line to the previous freehand drawing
//
if(bResend)
{
T126Obj * pObj;
pObj = g_pCurrentWorkspace->GetTail();
if(pObj && pObj->GetType() == drawingCreatePDU_chosen &&
(pObj->GraphicTool() == TOOLTYPE_PEN || pObj->GraphicTool() == TOOLTYPE_HIGHLIGHT))
{
pdrawingEditPDU->drawingHandle = pObj->GetThisObjectHandle();
pObj->SetOwnerID(memberID);
((DrawObj*)pObj)->DrawEditObj(pdrawingEditPDU);
}
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
// WORKSPACE PDUS
/////////////////////////////////////////////////////////////////////////////////////////////
BOOL FindObjectAndWorkspace(UINT objectHandle, T126Obj** pObj, WorkspaceObj**pWorkspace)
{
WorkspaceObj * pWrkspc;
T126Obj * pT126Obj;
WBPOSITION pos;
pos = g_pListOfWorkspaces->GetHeadPosition();
while (pos != NULL)
{
pWrkspc = (WorkspaceObj *) g_pListOfWorkspaces->GetNext(pos);
if(pWrkspc)
{
pT126Obj = pWrkspc->FindObjectInWorkspace(objectHandle);
if(pT126Obj)
{
*pObj = pT126Obj;
*pWorkspace = pWrkspc;
return TRUE;
}
}
}
return FALSE;
}
//
// Retrieves workspace from the list of workspaces
//
WorkspaceObj * GetWorkspace(UINT activeWorkspace)
{
WorkspaceObj * pWorkspaceObj;
WBPOSITION pos;
pos = g_pListOfWorkspaces->GetHeadPosition();
while (pos != NULL)
{
pWorkspaceObj = (WorkspaceObj *) g_pListOfWorkspaces->GetNext(pos);
if(pWorkspaceObj->GetWorkspaceHandle() == activeWorkspace)
{
return pWorkspaceObj;
}
}
return NULL;
}
//
// The remote sent us a new workspace
//
void OnWorkspaceCreatePDU(WorkspaceCreatePDU * pWorkspaceCreatePDU, ULONG memberID, BOOL bForcedResend)
{
TRACE_DEBUG(("OnWorkspaceCreatePDU WorkspaceIdentifier = %d", pWorkspaceCreatePDU->workspaceIdentifier.u.activeWorkspace));
WorkspaceObj * pWorkspaceObj;
//
// Check for resend
//
if(!bForcedResend)
{
pWorkspaceObj = GetWorkspace(WorkspaceObj::GetWorkspaceIdentifier(&pWorkspaceCreatePDU->workspaceIdentifier));
if(pWorkspaceObj)
{
return;
}
DBG_SAVE_FILE_LINE
pWorkspaceObj = new WorkspaceObj(pWorkspaceCreatePDU, bForcedResend);
pWorkspaceObj->SetOwnerID(memberID);
}
else
{
DBG_SAVE_FILE_LINE
pWorkspaceObj = new WorkspaceObj(pWorkspaceCreatePDU, bForcedResend);
pWorkspaceObj->SetOwnerID(memberID);
}
}
//
// If we created an unsynchronized workspace the remote has to sen us
// a WorkspaceCreateAcknowledgePDU. Why???
//
void OnWorkspaceCreateAcknowledgePDU(WorkspaceCreateAcknowledgePDU * pWorkspaceCreateAcknowledgePDU, ULONG memberID)
{
TRACE_DEBUG(("OnWorkspaceCreateAcknowledgePDU WorkspaceIdentifier = %d", pWorkspaceCreateAcknowledgePDU->workspaceIdentifier));
}
//
// The remote is deleting the workspace
//
void OnWorkspaceDeletePDU(WorkspaceDeletePDU * pWorkspaceDeletePDU, ULONG memberID)
{
TRACE_DEBUG(("OnWorkspaceDeletePDU WorkspaceIdentifier = %d", pWorkspaceDeletePDU->workspaceIdentifier.u.activeWorkspace));
//
// Find the workspace
//
WorkspaceObj * pWorkspaceObj;
pWorkspaceObj = GetWorkspace(WorkspaceObj::GetWorkspaceIdentifier(&pWorkspaceDeletePDU->workspaceIdentifier));
if(!pWorkspaceObj)
{
return;
}
pWorkspaceObj->SetOwnerID(memberID);
pWorkspaceObj->ClearDeletionFlags();
//
// Reason for deleting
//
TRACE_DEBUG(("OnWorkspaceDeletePDU reason = %d", pWorkspaceDeletePDU->reason.choice));
//
// Remove it from the List Of Workspaces
//
WBPOSITION prevPos;
WBPOSITION pos;
pos = g_pListOfWorkspaces->GetPosition(pWorkspaceObj);
prevPos = g_pListOfWorkspaces->GetHeadPosition();
//
// This is the only workspace we have ?????
//
if(g_pListOfWorkspaces->GetHeadPosition() == g_pListOfWorkspaces->GetTailPosition())
{
RemoveWorkspace(pWorkspaceObj);
g_pCurrentWorkspace = NULL;
if(g_pMain)
{
g_pMain->EnableToolbar(FALSE);
}
}
else
{
//
// If we had a remote pointer
//
BOOL bRemote = FALSE;
if(g_pMain->m_pLocalRemotePointer)
{
bRemote = TRUE;
g_pMain->OnRemotePointer();
}
//
// Remove the workspace and point the current one to the correct one.
//
pWorkspaceObj = RemoveWorkspace(pWorkspaceObj);
g_pConferenceWorkspace = pWorkspaceObj;
if(g_pDraw->IsSynced())
{
g_pMain->GoPage(pWorkspaceObj,FALSE);
}
//
// If we had a remote pointer
//
if(bRemote)
{
g_pMain->OnRemotePointer();
}
}
}
//
// The remote is changing the workspace
//
void OnWorkspaceEditPDU(WorkspaceEditPDU * pWorkspaceEditPDU, ULONG memberID)
{
TRACE_DEBUG(("OnWorkspaceEditPDU WorkspaceIdentifier = %d",pWorkspaceEditPDU->workspaceIdentifier.u.activeWorkspace));
//
// Find the workspace
//
WorkspaceObj * pWorkspaceObj;
pWorkspaceObj = GetWorkspace(WorkspaceObj::GetWorkspaceIdentifier(&pWorkspaceEditPDU->workspaceIdentifier));
if(!pWorkspaceObj)
{
return;
}
pWorkspaceObj->SetOwnerID(memberID);
pWorkspaceObj->WorkspaceEditObj(pWorkspaceEditPDU);
}
void OnWorkspacePlaneCopyPDU(WorkspacePlaneCopyPDU * pWorkspacePlaneCopyPDU, ULONG memberID)
{
TRACE_DEBUG(("OnWorkspacePlaneCopyPDU WorkspaceIdentifier = %d",pWorkspacePlaneCopyPDU->sourceWorkspaceIdentifier));
}
void OnWorkspaceReadyPDU(WorkspaceReadyPDU * pWorkspaceReadyPDU, ULONG memberID)
{
TRACE_DEBUG(("OnWorkspaceReadyPDU WorkspaceIdentifier = %d",pWorkspaceReadyPDU->workspaceIdentifier));
//
// Find the workspace
//
WorkspaceObj * pWorkspaceObj;
pWorkspaceObj = GetWorkspace(WorkspaceObj::GetWorkspaceIdentifier(&pWorkspaceReadyPDU->workspaceIdentifier));
if(!pWorkspaceObj)
{
return;
}
pWorkspaceObj->SetOwnerID(memberID);
//
// This workspace is ready
//
pWorkspaceObj->m_bWorkspaceReady = TRUE;
}
//
// If we got a refreshStatus == TRUE, we have to refresh late joiners
//
void OnWorkspaceRefreshStatusPDU(WorkspaceRefreshStatusPDU * pWorkspaceRefreshStatusPDU, ULONG memberID)
{
if (pWorkspaceRefreshStatusPDU->refreshStatus == TRUE)
{
g_RefresherID = memberID;
}
else
{
//
// The token is out there, try to grab it
//
g_pNMWBOBJ->GrabRefresherToken();
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
// BITMAP PDUS
/////////////////////////////////////////////////////////////////////////////////////////////
void OnBitmapCreatePDU(BitmapCreatePDU * pBitmapCreatePDU, ULONG memberID, BOOL bForcedResend)
{
TRACE_DEBUG(("drawingHandle = %d", pBitmapCreatePDU->bitmapHandle ));
//
// If we find this object, it is because T120 is broadcasting the drawing
// we just sent to T126
//
UINT workspace;
UINT planeID;
GetBitmapDestinationAddress(&pBitmapCreatePDU->destinationAddress, &workspace, &planeID);
//
// Check for resend
//
WorkspaceObj* pWObj;
BitmapObj * pBitmap;
if(!bForcedResend)
{
pWObj = GetWorkspace(workspace);
if(pWObj)
{
pBitmap = (BitmapObj*)pWObj->FindObjectInWorkspace(pBitmapCreatePDU->bitmapHandle);
if(pBitmap)
return;
}
}
//
// New Drawing object
//
DBG_SAVE_FILE_LINE
pBitmap = new BitmapObj(pBitmapCreatePDU);
pBitmap->SetOwnerID(memberID);
if(!bForcedResend)
{
//
// Someone else sent us this bitmap, it was not created locally
//
pBitmap->ClearCreationFlags();
//
// Add a this drawing to the correct workspace
//
if(!AddT126ObjectToWorkspace(pBitmap))
{
return;
}
}
else
{
//
// If we are reading from disk, this has to be added in the current workspace
// and we have to wait until we have the whole bitmap to send it
//
if(pBitmap->m_fMoreToFollow)
{
pBitmap->SetWorkspaceHandle(g_pCurrentWorkspace == NULL ? 0 : g_pCurrentWorkspace->GetWorkspaceHandle());
AddT126ObjectToWorkspace(pBitmap);
}
else
{
//
// Add this object and send Create PDU
//
pBitmap->SetAllAttribs();
pBitmap->AddToWorkspace();
}
}
//
// PASS IT TO UI
//
if(!pBitmap->m_fMoreToFollow)
{
pBitmap->Draw();
}
}
void OnBitmapCreateContinuePDU(BitmapCreateContinuePDU * pBitmapCreateContinuePDU, ULONG memberID, BOOL bForcedResend)
{
WorkspaceObj* pWorkspace;
BitmapObj* pBitmap = NULL;
// We should find this drawing object
//
// If we are loading from file it is in the current workspace
//
if(bForcedResend)
{
ASSERT(g_pCurrentWorkspace);
if(g_pCurrentWorkspace)
{
pBitmap = (BitmapObj*)g_pCurrentWorkspace->FindObjectInWorkspace(pBitmapCreateContinuePDU->bitmapHandle);
}
}
else
{
FindObjectAndWorkspace(pBitmapCreateContinuePDU->bitmapHandle, (T126Obj **)&pBitmap, (WorkspaceObj**)&pWorkspace);
}
if(pBitmap)
{
pBitmap->SetOwnerID(memberID);
//
// Found the previous bitmap, concatenate the data
//
pBitmap->Continue(pBitmapCreateContinuePDU);
//
// PASS IT TO UI
//
if(!pBitmap->m_fMoreToFollow)
{
pBitmap->Draw();
if(bForcedResend)
{
pBitmap->SetAllAttribs();
pBitmap->AddToWorkspace();
}
}
}
}
void OnBitmapCheckpointPDU(BitmapCheckpointPDU * pBitmapCheckPointPDU, ULONG memberID)
{
}
void OnBitmapAbortPDU(BitmapAbortPDU * pBitmapAbortPDU, ULONG memberID)
{
BitmapDeletePDU bitmapDeletePDU;
bitmapDeletePDU.bitmapHandle = pBitmapAbortPDU->bitmapHandle;
bitmapDeletePDU.bit_mask = 0;
//
// Pass it to bitmapDeletePDU
//
OnBitmapDeletePDU(&bitmapDeletePDU, memberID);
}
void OnBitmapEditPDU(BitmapEditPDU * pBitmapEditPDU, ULONG memberID)
{
BitmapObj* pObj;
WorkspaceObj* pWorkspace;
// We should find this drawing object
if(FindObjectAndWorkspace(pBitmapEditPDU->bitmapHandle, (T126Obj **)&pObj, (WorkspaceObj**)&pWorkspace))
{
pObj->SetOwnerID(memberID);
pObj->BitmapEditObj(pBitmapEditPDU);
}
}
void OnBitmapDeletePDU(BitmapDeletePDU * pBitmapDeletePDU, ULONG memberID)
{
BitmapObj* pObj;
WorkspaceObj* pWorkspace;
// We should find this drawing object
if(FindObjectAndWorkspace(pBitmapDeletePDU->bitmapHandle, (T126Obj **)&pObj, (WorkspaceObj**)&pWorkspace))
{
pObj->SetOwnerID(memberID);
pWorkspace->RemoveT126Object((T126Obj*)pObj);
}
}