Annotation of mstools/ole20/samples/spoly2/cpoly.cpp, revision 1.1.1.1

1.1       root        1: /*** 
                      2: *cpoly.cpp - Implementation of the CPoly object.
                      3: *
                      4: *  Copyright (C) 1992, Microsoft Corporation.  All Rights Reserved.
                      5: *  Information Contained Herein Is Proprietary and Confidential.
                      6: *
                      7: *Purpose:
                      8: *  This module implements the CPoly class. This class implements a
                      9: *  number of methods and properties, and exposes them via IDispatch.
                     10: *
                     11: *  This module is intended as a sample implementation of the IDispatch
                     12: *  interface, and its purpose is to demonstrate how an object can
                     13: *  expose methods and properties for programatic and cross-process
                     14: *  access via the IDispatch interface.
                     15: *
                     16: *Implementation Notes:
                     17: *
                     18: *****************************************************************************/
                     19: 
                     20: #include <windows.h>
                     21: #include <ole2.h>
                     22: #if !defined(WIN32)
                     23: #include <olenls.h>
                     24: #endif
                     25: #include <dispatch.h>
                     26: 
                     27: #include "statbar.h"
                     28: #include "cenumpt.h"
                     29: 
                     30: #include "spoly.h"
                     31: #include "cpoint.h"
                     32: #include "cpoly.h"
                     33: 
                     34: 
                     35: // Adjust for WIN16/WIN32 synchronization
                     36: #if defined(WIN32) && !defined(OLE2FINAL)
                     37: #define E_FAIL E_UNSPEC
                     38: #endif
                     39: 
                     40: 
                     41: extern HWND g_hwndClient;
                     42: 
                     43: extern CStatBar FAR* g_psb;
                     44: 
                     45: extern BOOL g_fExitOnLastRelease;
                     46: 
                     47: 
                     48: // our global list of polygons.
                     49: //
                     50: POLYLINK FAR* g_ppolylink = (POLYLINK FAR*)NULL;
                     51: 
                     52: // global count of polygons.
                     53: //
                     54: int g_cPoly = 0;
                     55: 
                     56: 
                     57: CPoly::CPoly()
                     58: {
                     59:     m_refs = 0;
                     60:     m_xorg = 0;
                     61:     m_yorg = 0;
                     62:     m_width = 0;
                     63:     m_cPoints = 0;
                     64: 
                     65:     m_red   = 0;
                     66:     m_green = 0;
                     67:     m_blue  = 0;
                     68: 
                     69:     m_ptinfo = NULL;
                     70: 
                     71:     m_ppointlink = NULL;
                     72:     m_ppointlinkLast = NULL;
                     73: }
                     74: 
                     75: 
                     76: /***
                     77: *CPoly *CPoly::Create(void)
                     78: *Purpose:
                     79: *  Create an instance of a CPoly object, and add it to the global
                     80: *  list of polygons.
                     81: *
                     82: *Entry:
                     83: *  None
                     84: *
                     85: *Exit:
                     86: *  returns a polygon object, NULL the allocation failed.
                     87: *
                     88: ***********************************************************************/
                     89: CPoly FAR*
                     90: CPoly::Create()
                     91: {
                     92:     HRESULT hresult;
                     93:     CPoly FAR* ppoly;
                     94:     ITypeInfo FAR* ptinfo;
                     95:     POLYLINK FAR* ppolylink;
                     96: extern INTERFACEDATA NEAR g_idataCPoly;
                     97: 
                     98: 
                     99:     if((ppolylink = new FAR POLYLINK) == (POLYLINK FAR*)NULL)
                    100:       return (CPoly FAR*)NULL;
                    101: 
                    102:     if((ppoly = new FAR CPoly()) == (CPoly FAR*)NULL)
                    103:       return (CPoly FAR*)NULL;
                    104: 
                    105:     ppoly->AddRef();
                    106: 
                    107:     // create and attach its TypeInfo
                    108:     //
                    109:     hresult = CreateDispTypeInfo(&g_idataCPoly, LOCALE_SYSTEM_DEFAULT, &ptinfo);
                    110:     if(hresult != NOERROR)
                    111:       goto LError0;
                    112: 
                    113:     ppoly->m_ptinfo = ptinfo;
                    114: 
                    115:     // push the new polygon onto the front of the polygon list.
                    116:     //
                    117:     ++g_cPoly;
                    118: 
                    119:     ppolylink->ppoly = ppoly;
                    120: 
                    121:     ppolylink->next = g_ppolylink;
                    122:     g_ppolylink = ppolylink;
                    123: 
                    124:     SBprintf(g_psb, "#poly = %d", g_cPoly);
                    125: 
                    126:     return ppoly;
                    127: 
                    128: 
                    129: LError0:;
                    130:     ppoly->Release();
                    131: 
                    132:     return NULL;
                    133: }
                    134: 
                    135: 
                    136: //---------------------------------------------------------------------
                    137: //                     IUnknown Methods
                    138: //---------------------------------------------------------------------
                    139: 
                    140: 
                    141: STDMETHODIMP
                    142: CPoly::QueryInterface(REFIID riid, void FAR* FAR* ppv)
                    143: {
                    144:     if(riid != IID_IUnknown)
                    145:       if(riid != IID_IDispatch)
                    146:         return ResultFromScode(E_NOINTERFACE);
                    147: 
                    148:     *ppv = this;
                    149:     AddRef();
                    150:     return NOERROR;
                    151: }
                    152: 
                    153: 
                    154: STDMETHODIMP_(ULONG)
                    155: CPoly::AddRef()
                    156: {
                    157:     return ++m_refs;
                    158: }
                    159: 
                    160: 
                    161: STDMETHODIMP_(ULONG)
                    162: CPoly::Release()
                    163: {
                    164:     POLYLINK FAR* FAR* pppolylink, FAR* ppolylinkDead;
                    165: 
                    166:     if(--m_refs == 0){
                    167:       Reset(); // release all CPoints
                    168: 
                    169:       // remove ourselves from the global list of polygons
                    170:       //
                    171:       for( pppolylink = &g_ppolylink;
                    172:          *pppolylink != NULL;
                    173:           pppolylink = &(*pppolylink)->next)
                    174:       {
                    175:        if((*pppolylink)->ppoly == this){
                    176:          ppolylinkDead = *pppolylink;
                    177:          *pppolylink = (*pppolylink)->next;
                    178:          delete ppolylinkDead;
                    179:          break;
                    180:        }
                    181:       }
                    182: 
                    183:       if(m_ptinfo != NULL){
                    184:        m_ptinfo->Release();
                    185:       }
                    186: 
                    187:       --g_cPoly;
                    188: 
                    189: #ifndef _MAC
                    190:       SBprintf(g_psb, "#poly = %d", g_cPoly);
                    191: #endif
                    192: 
                    193:       delete this;
                    194:       return 0;
                    195:     }
                    196:     return m_refs;
                    197: }
                    198: 
                    199: 
                    200: //---------------------------------------------------------------------
                    201: //                     IDispatch Methods
                    202: //---------------------------------------------------------------------
                    203: 
                    204: STDMETHODIMP
                    205: CPoly::GetTypeInfoCount(UINT FAR* pctinfo)
                    206: {
                    207:     // This object has a single *introduced* interface
                    208:     //
                    209:     *pctinfo = 1;
                    210: 
                    211:     return NOERROR;
                    212: }
                    213: 
                    214: 
                    215: STDMETHODIMP
                    216: CPoly::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo)
                    217: {
                    218:     if(itinfo != 0)
                    219:       return ResultFromScode(DISP_E_BADINDEX);
                    220: 
                    221:     m_ptinfo->AddRef();
                    222:     *pptinfo = m_ptinfo;
                    223: 
                    224:     return NOERROR;
                    225: }
                    226: 
                    227: 
                    228: /***
                    229: *HRESULT CPoly::GetIDsOfNames(char**, UINT, LCID, LONG*)
                    230: *Purpose:
                    231: *  This method translates the given array of names to a corresponding
                    232: *  array of DISPIDs.
                    233: *
                    234: *  This method deferrs to a common implementation shared by
                    235: *  both the CPoly and CPoint objects. See the description of
                    236: *  'SPolyGetIDsOfNames()' in dispimpl.cpp for more information.
                    237: *
                    238: *Entry:
                    239: *  rgszNames = pointer to an array of names
                    240: *  cNames = the number of names in the rgszNames array
                    241: *  lcid = the callers locale ID
                    242: *
                    243: *Exit:
                    244: *  return value = HRESULT
                    245: *  rgdispid = array of DISPIDs corresponding to the rgszNames array
                    246: *    this array will contain -1 for each entry that is not known.
                    247: *
                    248: ***********************************************************************/
                    249: STDMETHODIMP
                    250: CPoly::GetIDsOfNames(
                    251:     REFIID riid,
                    252:     char FAR* FAR* rgszNames,
                    253:     UINT cNames,
                    254:     LCID lcid,
                    255:     DISPID FAR* rgdispid)
                    256: {
                    257:     if(riid != IID_NULL)
                    258:       return ResultFromScode(DISP_E_UNKNOWNINTERFACE);
                    259: 
                    260:     return DispGetIDsOfNames(m_ptinfo, rgszNames, cNames, rgdispid);
                    261: }
                    262: 
                    263: 
                    264: /***
                    265: *HRESULT CPoly::Invoke(...)
                    266: *Purpose:
                    267: *  Dispatch a method or property request for objects of type CPoly.
                    268: *
                    269: *  see the IDispatch document for more information, and a general
                    270: *  description of this method.
                    271: *
                    272: *Entry:
                    273: *  dispidMember = the DISPID of the member being requested
                    274: *
                    275: *  riid = reference to the interface ID of the interface on this object
                    276: *    that the requested member belongs to. IID_NULL means to interpret
                    277: *    the member as belonging to the implementation defined "default"
                    278: *    or "primary" interface.
                    279: *
                    280: *  lcid = the caller's locale ID
                    281: *
                    282: *  wFlags = flags indicating the type of access being requested
                    283: *
                    284: *  pdispparams = pointer to the DISPPARAMS struct containing the
                    285: *    requested members arguments (if any) and its named parameter
                    286: *    DISPIDs (if any).
                    287: *
                    288: *Exit:
                    289: *  return value = HRESULT
                    290: *   see the IDispatch spec for a description of possible success codes.
                    291: *
                    292: *  pvarResult = pointer to a caller allocated VARIANT containing
                    293: *    the members return value (if any).
                    294: *
                    295: *  pexcepinfo = caller allocated exception info structure, this will
                    296: *    be filled in only if an exception was raised that must be passed
                    297: *    up through Invoke to an enclosing handler.
                    298: *
                    299: *  puArgErr = pointer to a caller allocated UINT, that will contain the
                    300: *    index of the offending argument if a DISP_E_TYPEMISMATCH error
                    301: *    was returned indicating that one of the arguments was of an
                    302: *    incorrect type and/or could not be reasonably coerced to a proper
                    303: *    type.
                    304: *
                    305: ***********************************************************************/
                    306: STDMETHODIMP
                    307: CPoly::Invoke(
                    308:     DISPID dispidMember,
                    309:     REFIID riid,
                    310:     LCID lcid,
                    311:     WORD wFlags,
                    312:     DISPPARAMS FAR* pdispparams,
                    313:     VARIANT FAR* pvarResult,
                    314:     EXCEPINFO FAR* pexcepinfo,
                    315:     UINT FAR* puArgErr)
                    316: {
                    317:     if(riid != IID_NULL)
                    318:       return ResultFromScode(DISP_E_UNKNOWNINTERFACE);
                    319: 
                    320:     return DispInvoke(
                    321:       this, m_ptinfo,
                    322:       dispidMember, wFlags, pdispparams,
                    323:       pvarResult, pexcepinfo, puArgErr);
                    324: }
                    325: 
                    326: 
                    327: //---------------------------------------------------------------------
                    328: //                     Introduced Methods
                    329: //---------------------------------------------------------------------
                    330: 
                    331: 
                    332: /***
                    333: *void CPoly::Draw(void)
                    334: *Purpose:
                    335: *  Draw the polygon, using the current x/y origin and line width
                    336: *  properties.
                    337: *
                    338: *Entry:
                    339: *  None
                    340: *
                    341: *Exit:
                    342: *  None
                    343: *
                    344: ***********************************************************************/
                    345: void METHODCALLTYPE EXPORT
                    346: CPoly::Draw()
                    347: {
                    348:     POINTLINK FAR* ppointlinkFirst, FAR* ppointlink;
                    349: 
                    350:     if((ppointlinkFirst = m_ppointlink) == (POINTLINK FAR*)NULL)
                    351:       return;
                    352: 
                    353: #ifdef _MAC /* { */
                    354: 
                    355: #else /* }{ */
                    356: 
                    357:     HDC hdc;
                    358:     RECT rect;
                    359:     short xorg, yorg;
                    360:     HPEN hpen, hpenOld;
                    361: 
                    362:     GetClientRect(g_hwndClient, &rect);
                    363:     xorg = m_xorg + (short) rect.left;
                    364:     yorg = m_yorg + (short) rect.top;
                    365: 
                    366:     hdc = GetDC(g_hwndClient);
                    367:     hpen = CreatePen(PS_SOLID, m_width, RGB(m_red, m_green, m_blue));
                    368:     hpenOld = SelectObject(hdc, hpen);
                    369: 
                    370: #ifdef WIN32
                    371:     MoveToEx(hdc,
                    372:       xorg + ppointlinkFirst->ppoint->m_x,
                    373:       yorg + ppointlinkFirst->ppoint->m_y, NULL);
                    374: #else
                    375:     MoveTo(hdc,
                    376:       xorg + ppointlinkFirst->ppoint->m_x,
                    377:       yorg + ppointlinkFirst->ppoint->m_y);
                    378: #endif
                    379: 
                    380:     for(ppointlink = ppointlinkFirst->next;
                    381:        ppointlink != (POINTLINK FAR*)NULL;
                    382:        ppointlink = ppointlink->next)
                    383:     {
                    384:       LineTo(hdc,
                    385:        xorg + ppointlink->ppoint->m_x,
                    386:        yorg + ppointlink->ppoint->m_y);
                    387:     }
                    388: 
                    389:     LineTo(hdc,
                    390:       xorg + ppointlinkFirst->ppoint->m_x,
                    391:       yorg + ppointlinkFirst->ppoint->m_y);
                    392: 
                    393:     SelectObject(hdc, hpenOld);
                    394:     DeleteObject(hpen);
                    395: 
                    396:     ReleaseDC(g_hwndClient, hdc);
                    397: 
                    398: #endif /* } */
                    399: }
                    400: 
                    401: 
                    402: /***
                    403: *void CPoly::Reset(void)
                    404: *Purpose:
                    405: *  Release all points referenced by this poly.
                    406: *
                    407: *Entry:
                    408: *  None
                    409: *
                    410: *Exit:
                    411: *  None
                    412: *
                    413: ***********************************************************************/
                    414: void METHODCALLTYPE EXPORT
                    415: CPoly::Reset()
                    416: {
                    417:     POINTLINK FAR* ppointlink, FAR* ppointlinkNext;
                    418: 
                    419:     for(ppointlink = m_ppointlink;
                    420:        ppointlink != (POINTLINK FAR*)NULL;
                    421:        ppointlink = ppointlinkNext)
                    422:     {
                    423:       ppointlinkNext = ppointlink->next;
                    424:       ppointlink->ppoint->Release();
                    425:       delete ppointlink;
                    426:     }
                    427: 
                    428:     m_cPoints = 0;
                    429:     m_ppointlink = NULL;
                    430:     m_ppointlinkLast = NULL;
                    431: }
                    432: 
                    433: 
                    434: /***
                    435: *HRESULT CPoly::AddPoint(short, short)
                    436: *Purpose:
                    437: *  Add a CPoint with the given coordinates to the end of our current
                    438: *  list of points.
                    439: *
                    440: *Entry:
                    441: *  x,y = the x and y coordinates of the new point.
                    442: *
                    443: *Exit:
                    444: *  return value = HRESULT
                    445: *
                    446: ***********************************************************************/
                    447: HRESULT METHODCALLTYPE
                    448: CPoly::AddPoint(short x, short y)
                    449: {
                    450:     CPoint FAR* ppoint;
                    451:     POINTLINK FAR* ppointlink;
                    452: 
                    453:     ppoint = CPoint::Create();
                    454:     if(ppoint == (CPoint FAR*)NULL)
                    455:       return ResultFromScode(E_OUTOFMEMORY);
                    456: 
                    457:     ppoint->SetX(x);
                    458:     ppoint->SetY(y);
                    459: 
                    460:     ppointlink = new FAR POINTLINK;
                    461:     if(ppointlink == (POINTLINK FAR*)NULL){
                    462:       delete ppoint;
                    463:       return ResultFromScode(E_OUTOFMEMORY);
                    464:     }
                    465: 
                    466:     ppointlink->ppoint = ppoint;
                    467:     ppointlink->next = (POINTLINK FAR*)NULL;
                    468: 
                    469:     if(m_ppointlinkLast == (POINTLINK FAR*)NULL){
                    470:       m_ppointlink = m_ppointlinkLast = ppointlink;
                    471:     }else{
                    472:       m_ppointlinkLast->next = ppointlink;
                    473:       m_ppointlinkLast = ppointlink;
                    474:     }
                    475: 
                    476:     ++m_cPoints;
                    477: 
                    478:     return NOERROR;
                    479: }
                    480: 
                    481: 
                    482: /***
                    483: *IUnknown FAR* CPoly::EnumPoints(void);
                    484: *Purpose:
                    485: *  Return and enumerator for the points in this polygon.
                    486: *
                    487: *Entry:
                    488: *  None
                    489: *
                    490: *Exit:
                    491: *  return value = HRESULT
                    492: *
                    493: *  *ppenum = pointer to an IEnumVARIANT for the points in this polygon
                    494: *
                    495: ***********************************************************************/
                    496: IUnknown FAR* METHODCALLTYPE EXPORT
                    497: CPoly::EnumPoints()
                    498: {
                    499:     UINT i;
                    500:     HRESULT hresult;
                    501:     VARIANT var;
                    502:     SAFEARRAY FAR* psa;
                    503:     IUnknown FAR* punk;
                    504:     CEnumPoint FAR* penum;
                    505:     POINTLINK FAR* ppointlink;
                    506:     SAFEARRAYBOUND rgsabound[1];
                    507: 
                    508:     rgsabound[0].lLbound = 0;
                    509:     rgsabound[0].cElements = m_cPoints;
                    510: 
                    511:     psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
                    512:     if(psa == NULL){
                    513:       hresult = ResultFromScode(E_OUTOFMEMORY);
                    514:       goto LError0;
                    515:     }
                    516: 
                    517:     ppointlink = m_ppointlink;
                    518:     for(i = 0; i < m_cPoints; ++i){
                    519:       LONG ix[1];
                    520: 
                    521:       if(ppointlink == NULL){
                    522:         // this indicates an internal consistency error.
                    523:        // (this test should probably be an assertion)
                    524:         hresult = ResultFromScode(E_FAIL);
                    525:         goto LError1;
                    526:       }
                    527: 
                    528:       V_VT(&var) = VT_DISPATCH;
                    529:       hresult = ppointlink->ppoint->QueryInterface(
                    530:        IID_IDispatch, (void FAR* FAR*)&V_DISPATCH(&var));
                    531:       if(hresult != NOERROR)
                    532:         goto LError1;
                    533: 
                    534:       ix[0] = i;
                    535:       SafeArrayPutElement(psa, ix, &var);
                    536: 
                    537:       ppointlink = ppointlink->next;
                    538:     }
                    539: 
                    540:     hresult = CEnumPoint::Create(psa, &penum);
                    541:     if(hresult != NOERROR)
                    542:       goto LError1;
                    543: 
                    544:     // ownership of the array has passed to the enumerator
                    545:     psa = NULL;
                    546: 
                    547:     hresult = penum->QueryInterface(IID_IUnknown, (void FAR* FAR*)&punk);
                    548:     if(hresult != NOERROR)
                    549:       goto LError2;
                    550: 
                    551:     penum->Release();
                    552: 
                    553:     return punk;
                    554: 
                    555: LError2:;
                    556:     penum->Release();
                    557: 
                    558: LError1:;
                    559:     // destroy the array if we were not successful creating the enumerator.
                    560:     if(psa != NULL)
                    561:       SafeArrayDestroy(psa);
                    562: 
                    563: LError0:;
                    564:     return NULL;
                    565: }
                    566: 
                    567: 
                    568: short METHODCALLTYPE EXPORT
                    569: CPoly::GetXOrigin()
                    570: {
                    571:     return m_xorg;
                    572: }
                    573: 
                    574: void METHODCALLTYPE EXPORT
                    575: CPoly::SetXOrigin(short x)
                    576: {
                    577:     m_xorg = x;
                    578: }
                    579: 
                    580: short METHODCALLTYPE EXPORT
                    581: CPoly::GetYOrigin()
                    582: {
                    583:     return m_yorg;
                    584: }
                    585: 
                    586: void METHODCALLTYPE EXPORT
                    587: CPoly::SetYOrigin(short y)
                    588: {
                    589:     m_yorg = y;
                    590: }
                    591: 
                    592: short METHODCALLTYPE EXPORT
                    593: CPoly::GetWidth()
                    594: {
                    595:     return m_width;
                    596: }
                    597: 
                    598: 
                    599: void METHODCALLTYPE EXPORT
                    600: CPoly::SetWidth(short width)
                    601: {
                    602:     m_width = width;
                    603: }
                    604: 
                    605: short METHODCALLTYPE EXPORT
                    606: CPoly::get_red()
                    607: {
                    608:     return m_red;
                    609: }
                    610: 
                    611: void METHODCALLTYPE EXPORT
                    612: CPoly::set_red(short red)
                    613: {
                    614:     m_red = red;
                    615: }
                    616: 
                    617: short METHODCALLTYPE EXPORT
                    618: CPoly::get_green()
                    619: {
                    620:     return m_green;
                    621: }
                    622: 
                    623: void METHODCALLTYPE EXPORT
                    624: CPoly::set_green(short green)
                    625: {
                    626:     m_green = green;
                    627: }
                    628: 
                    629: short METHODCALLTYPE EXPORT
                    630: CPoly::get_blue()
                    631: {
                    632:     return m_blue;
                    633: }
                    634: 
                    635: void METHODCALLTYPE EXPORT
                    636: CPoly::set_blue(short blue)
                    637: {
                    638:     m_blue = blue;
                    639: }
                    640: 
                    641: 
                    642: /***
                    643: *void CPoly::Dump(void)
                    644: *Purpose:
                    645: *  Output a debug dump of this instance.
                    646: *
                    647: *Entry:
                    648: *  None
                    649: *
                    650: *Exit:
                    651: *  None
                    652: *
                    653: ***********************************************************************/
                    654: void METHODCALLTYPE EXPORT
                    655: CPoly::Dump()
                    656: {
                    657: #ifdef _MAC
                    658: 
                    659:     // REVIEW: implement for the mac
                    660: 
                    661: #else
                    662: 
                    663:     char buffer[80];
                    664:     POINTLINK FAR* ppointlink;
                    665: 
                    666:     wsprintf(buffer, "CPoly(0x%x) =\n", (int)this);
                    667:     OutputDebugString(buffer);
                    668: 
                    669:     wsprintf(buffer,
                    670:       "    xorg = %d, yorg = %d, width = %d, rgb = {%d,%d,%d}\n    points = ",
                    671:       m_xorg, m_yorg, m_width,
                    672:       get_red(),
                    673:       get_green(),
                    674:       get_blue());
                    675: 
                    676:     OutputDebugString(buffer);
                    677: 
                    678:     for(ppointlink = m_ppointlink;
                    679:        ppointlink != (POINTLINK FAR*)NULL;
                    680:        ppointlink = ppointlink->next)
                    681:     {
                    682:       wsprintf(buffer, "{%d,%d}",
                    683:         ppointlink->ppoint->GetX(),
                    684:         ppointlink->ppoint->GetY());
                    685:       OutputDebugString(buffer);
                    686: 
                    687:       wsprintf(buffer, " ");
                    688:       OutputDebugString(buffer);
                    689:     }
                    690:     wsprintf(buffer, "\n");
                    691:     OutputDebugString(buffer);
                    692: 
                    693: #endif
                    694: }
                    695: 
                    696: /***
                    697: *void CPoly::PolyDraw(void)
                    698: *Purpose:
                    699: *  Draw all polygons.
                    700: *
                    701: *Entry:
                    702: *  None
                    703: *
                    704: *Exit:
                    705: *  None
                    706: *
                    707: ***********************************************************************/
                    708: void
                    709: CPoly::PolyDraw()
                    710: {
                    711:     POLYLINK FAR* polylink;
                    712: 
                    713:     for(polylink = g_ppolylink;
                    714:        polylink != (POLYLINK FAR*)NULL;
                    715:        polylink = polylink->next)
                    716:     {
                    717:       polylink->ppoly->Draw();
                    718:     }
                    719: }
                    720: 
                    721: 
                    722: /***
                    723: *void PolyTerm(void)
                    724: *Purpose:
                    725: *  Release all polygons.
                    726: *
                    727: *Entry:
                    728: *  None
                    729: *
                    730: *Exit:
                    731: *  None
                    732: *
                    733: ***********************************************************************/
                    734: void
                    735: CPoly::PolyTerm()
                    736: {
                    737:     POLYLINK FAR* ppolylink;
                    738:     POLYLINK FAR* ppolylinkNext;
                    739: 
                    740:     for(ppolylink = g_ppolylink;
                    741:        ppolylink != (POLYLINK FAR*)NULL;
                    742:        ppolylink = ppolylinkNext)
                    743:     {
                    744:       ppolylinkNext = ppolylink->next;
                    745:       ppolylink->ppoly->Release();
                    746:       delete ppolylink;
                    747:     }
                    748: }
                    749: 
                    750: 
                    751: /***
                    752: *void PolyDump(void)
                    753: *Purpose:
                    754: *  Invoke the debug Dump() method on all polygons were currently
                    755: *  holding on to.
                    756: *
                    757: *Entry:
                    758: *  None
                    759: *
                    760: *Exit:
                    761: *  None
                    762: *
                    763: ***********************************************************************/
                    764: void
                    765: CPoly::PolyDump()
                    766: {
                    767:     POLYLINK FAR* ppolylink;
                    768: 
                    769:     if(g_ppolylink == (POLYLINK FAR*)NULL){
                    770:       OutputDebugString("\t(none)\n");
                    771:       return;
                    772:     }
                    773: 
                    774:     for(ppolylink = g_ppolylink;
                    775:        ppolylink != (POLYLINK FAR*)NULL;
                    776:        ppolylink = ppolylink->next)
                    777:     {
                    778:       ppolylink->ppoly->Dump();
                    779:     }
                    780: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.