|
|
1.1 root 1: /***
2: *CPoly.cpp
3: *
4: * Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
5: *
6: *Purpose:
7: * This module implements the CPoly and CPolyCF classes.
8: *
9: * This module is intended as a sample implementation of the IDispatch
10: * interface, and its purpose is to demonstrate how an object can
11: * expose methods and properties for programatic and cross-process
12: * access via the IDispatch interface.
13: *
14: *Implementation Notes:
15: *
16: *****************************************************************************/
17:
18: #include "spoly.h"
19: #include "cpoint.h"
20: #include "cpoly.h"
21: #include "cenumpt.h"
22:
23: #ifndef _MAC
24: extern CStatBar FAR* g_psb;
25: #endif
26:
27:
28: // our global list of polygons.
29: //
30: POLYLINK FAR* g_ppolylink = (POLYLINK FAR*)NULL;
31:
32: // global count of polygons.
33: //
34: int g_cPoly = 0;
35:
36:
37: CPoly::CPoly()
38: {
39: m_refs = 0;
40: m_xorg = 0;
41: m_yorg = 0;
42: m_width = 0;
43: m_cPoints = 0;
44:
45: m_red = 0;
46: m_green = 0;
47: m_blue = 0;
48:
49: m_ppointlink = NULL;
50: m_ppointlinkLast = NULL;
51: }
52:
53:
54: /***
55: *CPoly *CPoly::Create(void)
56: *Purpose:
57: * Create an instance of a CPoly object, and add it to the global
58: * list of polygons.
59: *
60: *Entry:
61: * None
62: *
63: *Exit:
64: * returns a polygon object, NULL the allocation failed.
65: *
66: ***********************************************************************/
67: CPoly FAR*
68: CPoly::Create()
69: {
70: CPoly FAR* ppoly;
71: POLYLINK FAR* ppolylink;
72:
73: if((ppolylink = new FAR POLYLINK) == (POLYLINK FAR*)NULL)
74: return (CPoly FAR*)NULL;
75:
76: if((ppoly = new FAR CPoly()) == (CPoly FAR*)NULL)
77: return (CPoly FAR*)NULL;
78:
79: ppoly->AddRef();
80:
81: // push the new polygon onto the front of the polygon list.
82: //
83: ++g_cPoly;
84:
85: ppolylink->ppoly = ppoly;
86:
87: ppolylink->next = g_ppolylink;
88: g_ppolylink = ppolylink;
89:
90: #ifndef _MAC
91: SBprintf(g_psb, "#poly = %d", g_cPoly);
92: #endif
93:
94: return ppoly;
95: }
96:
97:
98: //---------------------------------------------------------------------
99: // IUnknown Methods
100: //---------------------------------------------------------------------
101:
102:
103: STDMETHODIMP
104: CPoly::QueryInterface(REFIID riid, void FAR* FAR* ppv)
105: {
106: if(riid != IID_IUnknown){
107: if(riid != IID_IDispatch){
108: *ppv = NULL;
109: return ResultFromScode(E_NOINTERFACE);
110: }
111: }
112:
113: *ppv = this;
114: AddRef();
115: return NOERROR;
116: }
117:
118:
119: STDMETHODIMP_(unsigned long)
120: CPoly::AddRef()
121: {
122: return ++m_refs;
123: }
124:
125:
126: STDMETHODIMP_(unsigned long)
127: CPoly::Release()
128: {
129: POLYLINK FAR* FAR* pppolylink, FAR* ppolylinkDead;
130:
131: if(--m_refs == 0){
132: Reset(); // release all CPoints
133:
134: // remove ourselves from the global list of polygons
135: //
136: for( pppolylink = &g_ppolylink;
137: *pppolylink != NULL;
138: pppolylink = &(*pppolylink)->next)
139: {
140: if((*pppolylink)->ppoly == this){
141: ppolylinkDead = *pppolylink;
142: *pppolylink = (*pppolylink)->next;
143: delete ppolylinkDead;
144: break;
145: }
146: }
147:
148: --g_cPoly;
149:
150: #ifndef _MAC
151: SBprintf(g_psb, "#poly = %d", g_cPoly);
152: #endif
153:
154: delete this;
155: return 0;
156: }
157: return m_refs;
158: }
159:
160:
161: //---------------------------------------------------------------------
162: // IDispatch Methods
163: //---------------------------------------------------------------------
164:
165:
166: /*
167: * NOTE: Support for the following two methods is not available
168: * in this version.
169: *
170: */
171:
172: STDMETHODIMP
173: CPoly::GetTypeInfoCount(unsigned int FAR* pctinfo)
174: {
175: *pctinfo = 0;
176: return NOERROR;
177: }
178:
179:
180: STDMETHODIMP
181: CPoly::GetTypeInfo(unsigned int itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo)
182: {
183: UNUSED(itinfo);
184: UNUSED(lcid);
185: UNUSED(pptinfo);
186:
187: return ResultFromScode(E_NOTIMPL);
188: }
189:
190:
191: /***
192: *HRESULT CPoly::GetIDsOfNames(char**, unsigned int, LCID, long*)
193: *Purpose:
194: * This method translates the given array of names to a corresponding
195: * array of DISPIDs.
196: *
197: * This method deferrs to a common implementation shared by
198: * both the CPoly and CPoint objects. See the description of
199: * 'SPolyGetIDsOfNames()' in dispimpl.cpp for more information.
200: *
201: *Entry:
202: * rgszNames = pointer to an array of names
203: * cNames = the number of names in the rgszNames array
204: * lcid = the callers locale ID
205: *
206: *Exit:
207: * return value = HRESULT
208: * rgdispid = array of DISPIDs corresponding to the rgszNames array
209: * this array will contain -1 for each entry that is not known.
210: *
211: ***********************************************************************/
212: STDMETHODIMP
213: CPoly::GetIDsOfNames(
214: REFIID riid,
215: char FAR* FAR* rgszNames,
216: unsigned int cNames,
217: LCID lcid,
218: DISPID FAR* rgdispid)
219: {
220: static PARAMDESC rgpdAddPoint[] = {
221: {"X"}, {"Y"}
222: };
223: static MEMBERDESC rgmdCPoly[] = {
224: {"DRAW", IDMEMBER_CPOLY_DRAW, NULL, 0},
225: {"RESET", IDMEMBER_CPOLY_RESET, NULL, 0},
226: {"ADDPOINT", IDMEMBER_CPOLY_ADDPOINT, rgpdAddPoint, 2},
227: {"ENUMPOINTS", IDMEMBER_CPOLY_ENUMPOINTS, NULL, 0},
228: {"GETXORIGIN", IDMEMBER_CPOLY_GETXORIGIN, NULL, 0},
229: {"SETXORIGIN", IDMEMBER_CPOLY_SETXORIGIN, NULL, 0},
230: {"GETYORIGIN", IDMEMBER_CPOLY_GETYORIGIN, NULL, 0},
231: {"SETYORIGIN", IDMEMBER_CPOLY_SETYORIGIN, NULL, 0},
232: {"GETWIDTH", IDMEMBER_CPOLY_GETWIDTH, NULL, 0},
233: {"SETWIDTH", IDMEMBER_CPOLY_SETWIDTH, NULL, 0},
234: {"get_red", IDMEMBER_CPOLY_GETRED, NULL, 0},
235: {"set_red", IDMEMBER_CPOLY_SETRED, NULL, 0},
236: {"get_green", IDMEMBER_CPOLY_GETGREEN, NULL, 0},
237: {"set_green", IDMEMBER_CPOLY_SETGREEN, NULL, 0},
238: {"get_blue", IDMEMBER_CPOLY_GETBLUE, NULL, 0},
239: {"set_blue", IDMEMBER_CPOLY_SETBLUE, NULL, 0},
240: {"DUMP", IDMEMBER_CPOLY_DUMP, NULL, 0}
241: };
242:
243: // this object only exposes a "default" interface.
244: //
245: if(riid != IID_NULL)
246: return ResultFromScode(DISP_E_UNKNOWNINTERFACE);
247:
248: return SPolyGetIDsOfNames(
249: rgmdCPoly, DIM(rgmdCPoly), rgszNames, cNames, lcid, rgdispid);
250: }
251:
252:
253: /***
254: *HRESULT CPoly::Invoke(...)
255: *Purpose:
256: * Dispatch a method or property request for objects of type CPoly.
257: *
258: * see the IDispatch document for more information, and a general
259: * description of this method.
260: *
261: *Entry:
262: * dispidMember = the DISPID of the member being requested
263: *
264: * riid = reference to the interface ID of the interface on this object
265: * that the requested member belongs to. IID_NULL means to interpret
266: * the member as belonging to the implementation defined "default"
267: * or "primary" interface.
268: *
269: * lcid = the caller's locale ID
270: *
271: * wFlags = flags indicating the type of access being requested
272: *
273: * pdispparams = pointer to the DISPPARAMS struct containing the
274: * requested members arguments (if any) and its named parameter
275: * DISPIDs (if any).
276: *
277: *Exit:
278: * return value = HRESULT
279: * see the IDispatch spec for a description of possible success codes.
280: *
281: * pvarResult = pointer to a caller allocated VARIANT containing
282: * the members return value (if any).
283: *
284: * pexcepinfo = caller allocated exception info structure, this will
285: * be filled in only if an exception was raised that must be passed
286: * up through Invoke to an enclosing handler.
287: *
288: * puArgErr = pointer to a caller allocated UINT, that will contain the
289: * index of the offending argument if a DISP_E_TYPEMISMATCH error
290: * was returned indicating that one of the arguments was of an
291: * incorrect type and/or could not be reasonably coerced to a proper
292: * type.
293: *
294: ***********************************************************************/
295: STDMETHODIMP
296: CPoly::Invoke(
297: DISPID dispidMember,
298: REFIID riid,
299: LCID lcid,
300: unsigned short wFlags,
301: DISPPARAMS FAR* pdispparams,
302: VARIANT FAR* pvarResult,
303: EXCEPINFO FAR* pexcepinfo,
304: unsigned int FAR* puArgErr)
305: {
306: HRESULT hresult;
307: VARIANTARG varg0, varg1;
308: VARIANT varResultDummy;
309:
310: UNUSED(lcid);
311: UNUSED(pexcepinfo);
312:
313: if(wFlags & ~(DISPATCH_METHOD | DISPATCH_PROPERTYGET | DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYPUTREF))
314: return ResultFromScode(E_INVALIDARG);
315:
316: // this object only exposes a "default" interface.
317: //
318: if(riid != IID_NULL)
319: return ResultFromScode(DISP_E_UNKNOWNINTERFACE);
320:
321: // This makes the following code a bit simpler if the caller
322: // happens to be ignoring the return value. Some implementations
323: // may choose to deal with this differently.
324: //
325: if(pvarResult == (VARIANT FAR*)NULL)
326: pvarResult = &varResultDummy;
327:
328: VariantInit(&varg0);
329: VariantInit(&varg1);
330:
331: // assume the return type is void, unless we find otherwise.
332: VariantInit(pvarResult);
333:
334: switch(dispidMember){
335: case IDMEMBER_CPOLY_DRAW:
336: Draw();
337: break;
338:
339: case IDMEMBER_CPOLY_RESET:
340: Reset();
341: break;
342:
343: case IDMEMBER_CPOLY_DUMP:
344: Dump();
345: break;
346:
347: case IDMEMBER_CPOLY_ADDPOINT:
348: hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
349: if(hresult != NOERROR)
350: return hresult;
351:
352: hresult = DispGetParam(pdispparams, 1, VT_I2, &varg1, puArgErr);
353: if(hresult != NOERROR)
354: return hresult;
355:
356: hresult = AddPoint(V_I2(&varg1), V_I2(&varg0));
357: if(hresult != NOERROR)
358: return hresult;
359: break;
360:
361: case IDMEMBER_CPOLY_ENUMPOINTS:
362: IEnumVARIANT FAR* penum;
363:
364: hresult = EnumPoints(&penum);
365: if(hresult != NOERROR)
366: return hresult;
367:
368: V_VT(pvarResult) = VT_UNKNOWN;
369: hresult = penum->QueryInterface(
370: IID_IUnknown, (void FAR* FAR*)&V_UNKNOWN(pvarResult));
371: if(hresult != NOERROR)
372: return hresult;
373: penum->Release();
374: break;
375:
376: case IDMEMBER_CPOLY_GETXORIGIN:
377: V_VT(pvarResult) = VT_I2;
378: V_I2(pvarResult) = m_xorg;
379: break;
380:
381: case IDMEMBER_CPOLY_SETXORIGIN:
382: hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
383: if(hresult != NOERROR)
384: return hresult;
385: m_xorg = V_I2(&varg0);
386: break;
387:
388: case IDMEMBER_CPOLY_GETYORIGIN:
389: V_VT(pvarResult) = VT_I2;
390: V_I2(pvarResult) = m_yorg;
391: break;
392:
393: case IDMEMBER_CPOLY_SETYORIGIN:
394: hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
395: if(hresult != NOERROR)
396: return hresult;
397: m_yorg = V_I2(&varg0);
398: break;
399:
400: case IDMEMBER_CPOLY_GETWIDTH:
401: V_VT(pvarResult) = VT_I2;
402: V_I2(pvarResult) = GetWidth();
403: break;
404:
405: case IDMEMBER_CPOLY_SETWIDTH:
406: hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
407: if(hresult != NOERROR)
408: return hresult;
409: SetWidth(V_I2(&varg0));
410: break;
411:
412: case IDMEMBER_CPOLY_GETRED:
413: V_VT(pvarResult) = VT_I2;
414: V_I2(pvarResult) = get_red();
415: break;
416:
417: case IDMEMBER_CPOLY_SETRED:
418: hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
419: if(hresult != NOERROR)
420: return hresult;
421: set_red(V_I2(&varg0));
422: break;
423:
424: case IDMEMBER_CPOLY_GETGREEN:
425: V_VT(pvarResult) = VT_I2;
426: V_I2(pvarResult) = get_green();
427: break;
428:
429: case IDMEMBER_CPOLY_SETGREEN:
430: hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
431: if(hresult != NOERROR)
432: return hresult;
433: set_green(V_I2(&varg0));
434: break;
435:
436: case IDMEMBER_CPOLY_GETBLUE:
437: V_VT(pvarResult) = VT_I2;
438: V_I2(pvarResult) = get_blue();
439: break;
440:
441: case IDMEMBER_CPOLY_SETBLUE:
442: hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
443: if(hresult != NOERROR)
444: return hresult;
445: set_blue(V_I2(&varg0));
446: break;
447:
448: default:
449: return ResultFromScode(DISP_E_MEMBERNOTFOUND);
450: }
451:
452: return NOERROR;
453: }
454:
455:
456: //---------------------------------------------------------------------
457: // Introduced Methods
458: //---------------------------------------------------------------------
459:
460:
461: /***
462: *void CPoly::Draw(void)
463: *Purpose:
464: * Draw the polygon, using the current x/y origin and line width
465: * properties.
466: *
467: *Entry:
468: * None
469: *
470: *Exit:
471: * None
472: *
473: ***********************************************************************/
474: void PASCAL
475: CPoly::Draw()
476: {
477: short xorg, yorg;
478: POINTLINK FAR* ppointlinkFirst, FAR* ppointlink;
479:
480: if((ppointlinkFirst = m_ppointlink) == (POINTLINK FAR*)NULL)
481: return;
482:
483: #ifdef _MAC /* { */
484:
485: short x, y;
486: RGBColor rgb;
487: WindowPtr pwndSaved;
488: extern WindowPtr g_pwndClient;
489:
490: GetPort(&pwndSaved);
491: SetPort(g_pwndClient);
492:
493: PenNormal();
494: PenSize(m_width, m_width);
495:
496: rgb.red = m_red;
497: rgb.green = m_green;
498: rgb.blue = m_blue;
499: RGBForeColor(&rgb);
500:
501: xorg = m_xorg;
502: yorg = m_yorg;
503:
504: MoveTo(
505: xorg + ppointlinkFirst->ppoint->m_x,
506: yorg + ppointlinkFirst->ppoint->m_y);
507:
508: for(ppointlink = ppointlinkFirst->next;
509: ppointlink != (POINTLINK FAR*)NULL;
510: ppointlink = ppointlink->next)
511: {
512: x = xorg + ppointlink->ppoint->m_x;
513: y = yorg + ppointlink->ppoint->m_y;
514: LineTo(x, y);
515: }
516:
517: LineTo(
518: xorg + ppointlinkFirst->ppoint->m_x,
519: yorg + ppointlinkFirst->ppoint->m_y);
520:
521: SetPort(pwndSaved);
522:
523: #else /* }{ */
524:
525: HDC hdc;
526: RECT rect;
527: HPEN hpen, hpenOld;
528: extern HWND g_hwndClient;
529:
530: GetClientRect(g_hwndClient, &rect);
531: xorg = m_xorg + (short) rect.left;
532: yorg = m_yorg + (short) rect.top;
533:
534: hdc = GetDC(g_hwndClient);
535: hpen = CreatePen(PS_SOLID, m_width, RGB(m_red, m_green, m_blue));
536: hpenOld = SelectObject(hdc, hpen);
537:
538: #ifdef WIN32
539: MoveToEx(hdc,
540: xorg + ppointlinkFirst->ppoint->m_x,
541: yorg + ppointlinkFirst->ppoint->m_y, NULL);
542: #else
543: MoveTo(hdc,
544: xorg + ppointlinkFirst->ppoint->m_x,
545: yorg + ppointlinkFirst->ppoint->m_y);
546: #endif
547:
548: for(ppointlink = ppointlinkFirst->next;
549: ppointlink != (POINTLINK FAR*)NULL;
550: ppointlink = ppointlink->next)
551: {
552: LineTo(hdc,
553: xorg + ppointlink->ppoint->m_x,
554: yorg + ppointlink->ppoint->m_y);
555: }
556:
557: LineTo(hdc,
558: xorg + ppointlinkFirst->ppoint->m_x,
559: yorg + ppointlinkFirst->ppoint->m_y);
560:
561: SelectObject(hdc, hpenOld);
562: DeleteObject(hpen);
563:
564: ReleaseDC(g_hwndClient, hdc);
565:
566: #endif /* } */
567: }
568:
569:
570: /***
571: *void CPoly::Reset(void)
572: *Purpose:
573: * Release all points referenced by this poly.
574: *
575: *Entry:
576: * None
577: *
578: *Exit:
579: * None
580: *
581: ***********************************************************************/
582: void PASCAL
583: CPoly::Reset()
584: {
585: POINTLINK FAR* ppointlink, FAR* ppointlinkNext;
586:
587: for(ppointlink = m_ppointlink;
588: ppointlink != (POINTLINK FAR*)NULL;
589: ppointlink = ppointlinkNext)
590: {
591: ppointlinkNext = ppointlink->next;
592: ppointlink->ppoint->Release();
593: delete ppointlink;
594: }
595:
596: m_cPoints = 0;
597: m_ppointlink = NULL;
598: m_ppointlinkLast = NULL;
599: }
600:
601:
602: /***
603: *HRESULT CPoly::AddPoint(short, short)
604: *Purpose:
605: * Add a CPoint with the given coordinates to the end of our current
606: * list of points.
607: *
608: *Entry:
609: * x,y = the x and y coordinates of the new point.
610: *
611: *Exit:
612: * return value = HRESULT
613: *
614: ***********************************************************************/
615: HRESULT PASCAL
616: CPoly::AddPoint(short x, short y)
617: {
618: CPoint FAR* ppoint;
619: POINTLINK FAR* ppointlink;
620:
621: ppoint = CPoint::Create();
622: if(ppoint == (CPoint FAR*)NULL)
623: return ResultFromScode(E_OUTOFMEMORY);
624:
625: ppoint->SetX(x);
626: ppoint->SetY(y);
627:
628: ppointlink = new FAR POINTLINK;
629: if(ppointlink == (POINTLINK FAR*)NULL){
630: delete ppoint;
631: return ResultFromScode(E_OUTOFMEMORY);
632: }
633:
634: ppointlink->ppoint = ppoint;
635: ppointlink->next = (POINTLINK FAR*)NULL;
636:
637: if(m_ppointlinkLast == (POINTLINK FAR*)NULL){
638: m_ppointlink = m_ppointlinkLast = ppointlink;
639: }else{
640: m_ppointlinkLast->next = ppointlink;
641: m_ppointlinkLast = ppointlink;
642: }
643:
644: ++m_cPoints;
645:
646: return NOERROR;
647: }
648:
649:
650: /***
651: *HRESULT CPoly::EnumPoints(IEnumVARIANT**);
652: *Purpose:
653: * Return and enumerator for the points in this polygon.
654: *
655: *Entry:
656: * None
657: *
658: *Exit:
659: * return value = HRESULT
660: *
661: * *ppenum = pointer to an IEnumVARIANT for the points in this polygon
662: *
663: ***********************************************************************/
664: HRESULT PASCAL
665: CPoly::EnumPoints(IEnumVARIANT FAR* FAR* ppenum)
666: {
667: unsigned int i;
668: VARIANT var;
669: HRESULT hresult;
670: SAFEARRAY FAR* psa;
671: CEnumPoint FAR* penum;
672: POINTLINK FAR* ppointlink;
673: SAFEARRAYBOUND rgsabound[1];
674:
675: rgsabound[0].lLbound = 0;
676: rgsabound[0].cElements = m_cPoints;
677:
678: psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
679: if(psa == NULL){
680: hresult = ResultFromScode(E_OUTOFMEMORY);
681: goto LError0;
682: }
683:
684: ppointlink = m_ppointlink;
685: for(i = 0; i < m_cPoints; ++i){
686: long ix[1];
687:
688: if(ppointlink == NULL){
689: // this indicates an internal consistency error.
690: // (this test should probably be an assertion)
691: hresult = ResultFromScode(E_FAIL);
692: goto LError1;
693: }
694:
695: V_VT(&var) = VT_DISPATCH;
696: hresult = ppointlink->ppoint->QueryInterface(
697: IID_IDispatch, (void FAR* FAR*)&V_DISPATCH(&var));
698: if(hresult != NOERROR)
699: goto LError1;
700:
701: ix[0] = i;
702: SafeArrayPutElement(psa, ix, &var);
703:
704: ppointlink = ppointlink->next;
705: }
706:
707: hresult = CEnumPoint::Create(psa, &penum);
708: if(hresult != NOERROR)
709: goto LError1;
710:
711: *ppenum = penum;
712:
713: return NOERROR;
714:
715: LError1:;
716: // destroy the array if we were not successful creating the enumerator.
717: SafeArrayDestroy(psa);
718:
719: LError0:;
720: return hresult;
721: }
722:
723: short PASCAL
724: CPoly::GetXOrigin()
725: {
726: return m_xorg;
727: }
728:
729: void PASCAL
730: CPoly::SetXOrigin(short x)
731: {
732: m_xorg = x;
733: }
734:
735: short PASCAL
736: CPoly::GetYOrigin()
737: {
738: return m_yorg;
739: }
740:
741: void PASCAL
742: CPoly::SetYOrigin(short y)
743: {
744: m_yorg = y;
745: }
746:
747: short PASCAL
748: CPoly::GetWidth()
749: {
750: return m_width;
751: }
752:
753: void PASCAL
754: CPoly::SetWidth(short width)
755: {
756: m_width = width;
757: }
758:
759: short PASCAL
760: CPoly::get_red()
761: {
762: return m_red;
763: }
764:
765: void PASCAL
766: CPoly::set_red(short red)
767: {
768: m_red = red;
769: }
770:
771: short PASCAL
772: CPoly::get_green()
773: {
774: return m_green;
775: }
776:
777: void PASCAL
778: CPoly::set_green(short green)
779: {
780: m_green = green;
781: }
782:
783: short PASCAL
784: CPoly::get_blue()
785: {
786: return m_blue;
787: }
788:
789: void PASCAL
790: CPoly::set_blue(short blue)
791: {
792: m_blue = blue;
793: }
794:
795:
796: /***
797: *void CPoly::Dump(void)
798: *Purpose:
799: * Output a debug dump of this instance.
800: *
801: *Entry:
802: * None
803: *
804: *Exit:
805: * None
806: *
807: ***********************************************************************/
808: void PASCAL
809: CPoly::Dump()
810: {
811: #ifdef _MAC
812:
813: // REVIEW: implement for the mac
814:
815: #else
816:
817: char buffer[80];
818: POINTLINK FAR* ppointlink;
819:
820: wsprintf(buffer, "CPoly(0x%x) =\n", (int)this);
821: OutputDebugString(buffer);
822:
823: wsprintf(buffer,
824: " xorg = %d, yorg = %d, width = %d, rgb = {%d,%d,%d}\n points = ",
825: m_xorg, m_yorg, m_width,
826: get_red(),
827: get_green(),
828: get_blue());
829:
830: OutputDebugString(buffer);
831:
832: for(ppointlink = m_ppointlink;
833: ppointlink != (POINTLINK FAR*)NULL;
834: ppointlink = ppointlink->next)
835: {
836: wsprintf(buffer, "{%d,%d}",
837: ppointlink->ppoint->GetX(),
838: ppointlink->ppoint->GetY());
839: OutputDebugString(buffer);
840:
841: wsprintf(buffer, " ");
842: OutputDebugString(buffer);
843: }
844: wsprintf(buffer, "\n");
845: OutputDebugString(buffer);
846:
847: #endif
848: }
849:
850: /***
851: *void CPoly::PolyDraw(void)
852: *Purpose:
853: * Draw all polygons.
854: *
855: *Entry:
856: * None
857: *
858: *Exit:
859: * None
860: *
861: ***********************************************************************/
862: void
863: CPoly::PolyDraw()
864: {
865: POLYLINK FAR* polylink;
866:
867: for(polylink = g_ppolylink;
868: polylink != (POLYLINK FAR*)NULL;
869: polylink = polylink->next)
870: {
871: polylink->ppoly->Draw();
872: }
873: }
874:
875:
876: /***
877: *void PolyTerm(void)
878: *Purpose:
879: * Release all polygons.
880: *
881: *Entry:
882: * None
883: *
884: *Exit:
885: * None
886: *
887: ***********************************************************************/
888: void
889: CPoly::PolyTerm()
890: {
891: POLYLINK FAR* ppolylink;
892: POLYLINK FAR* ppolylinkNext;
893:
894: for(ppolylink = g_ppolylink;
895: ppolylink != (POLYLINK FAR*)NULL;
896: ppolylink = ppolylinkNext)
897: {
898: ppolylinkNext = ppolylink->next;
899: ppolylink->ppoly->Release();
900: delete ppolylink;
901: }
902: }
903:
904:
905: /***
906: *void PolyDump(void)
907: *Purpose:
908: * Invoke the debug Dump() method on all polygons were currently
909: * holding on to.
910: *
911: *Entry:
912: * None
913: *
914: *Exit:
915: * None
916: *
917: ***********************************************************************/
918: void
919: CPoly::PolyDump()
920: {
921: POLYLINK FAR* ppolylink;
922:
923: if(g_ppolylink == (POLYLINK FAR*)NULL){
924: #ifndef _MAC
925: OutputDebugString("\t(none)\n");
926: #endif
927: return;
928: }
929:
930: for(ppolylink = g_ppolylink;
931: ppolylink != (POLYLINK FAR*)NULL;
932: ppolylink = ppolylink->next)
933: {
934: ppolylink->ppoly->Dump();
935: }
936: }
937:
938:
939: //---------------------------------------------------------------------
940: // Implementation of the CPoly Class Factory
941: //---------------------------------------------------------------------
942:
943:
944: CPolyCF::CPolyCF()
945: {
946: m_refs = 0;
947: }
948:
949: IClassFactory FAR*
950: CPolyCF::Create()
951: {
952: CPolyCF FAR* pCF;
953:
954: if((pCF = new FAR CPolyCF()) == NULL)
955: return NULL;
956: pCF->AddRef();
957: return pCF;
958: }
959:
960: STDMETHODIMP
961: CPolyCF::QueryInterface(REFIID riid, void FAR* FAR* ppv)
962: {
963: if(riid != IID_IUnknown){
964: if(riid != IID_IClassFactory){
965: *ppv = NULL;
966: return ResultFromScode(E_NOINTERFACE);
967: }
968: }
969:
970: *ppv = this;
971: ++m_refs;
972: return NOERROR;
973: }
974:
975: STDMETHODIMP_(unsigned long)
976: CPolyCF::AddRef(void)
977: {
978: return ++m_refs;
979: }
980:
981: STDMETHODIMP_(unsigned long)
982: CPolyCF::Release(void)
983: {
984: if(--m_refs == 0){
985: delete this;
986: return 0;
987: }
988: return m_refs;
989: }
990:
991: STDMETHODIMP
992: CPolyCF::CreateInstance(
993: IUnknown FAR* punkOuter,
994: REFIID iid,
995: void FAR* FAR* ppv)
996: {
997: HRESULT hresult;
998: CPoly FAR *ppoly;
999:
1000: UNUSED(punkOuter);
1001:
1002: #ifdef _MAC
1003: if(GetZone() != ApplicZone()){
1004: DebugStr("\pZones do not match");
1005: }
1006:
1007: #endif
1008:
1009: if((ppoly = CPoly::Create()) == NULL){
1010: *ppv = NULL;
1011: return ResultFromScode(E_OUTOFMEMORY);
1012: }
1013: hresult = ppoly->QueryInterface(iid, ppv);
1014: ppoly->Release();
1015: return hresult;
1016: }
1017:
1018: STDMETHODIMP
1019: #ifdef _MAC
1020: CPolyCF::LockServer(unsigned long fLock)
1021: #else
1022: CPolyCF::LockServer(BOOL fLock)
1023: #endif
1024: {
1025: UNUSED(fLock);
1026:
1027: return NOERROR;
1028: }
1029:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.