00001
00034 #include "stdafx.h"
00035
00036 namespace AxPipe {
00045 bool
00046 CSink::DoSegWork(CSeg *pSeg) {
00047 bool fPropagate;
00048
00049 switch (pSeg->Type()) {
00050 case eSegTypeOpen:
00051 fPropagate = OutOpen();
00052
00053 m_fIsOpen = true;
00054 return fPropagate;
00055 break;
00056
00057 case eSegTypeFlush:
00058 return OutFlush();
00059 break;
00060
00061 case eSegTypeClose:
00062 if (m_fIsOpen) {
00063 fPropagate = OutClose();
00064
00065 m_fIsOpen = false;
00066 }
00067 return fPropagate;
00068 break;
00069
00070 case eSegTypePlug:
00071
00072 OutPlug();
00073 fPropagate = m_fExit = true;
00074 return fPropagate;
00075 break;
00076
00077 case 0:
00078 if (!m_fIsOpen) {
00079 SetError(ERROR_CODE_NOTOPEN, ERROR_MSG_NOTOPEN);
00080 break;
00081 }
00082 if (pSeg->Len()) {
00083
00084
00085
00086 Out(pSeg);
00087 } else {
00088 pSeg->Release();
00089 }
00090 break;
00091 default:
00092
00093
00094
00095 OutSpecial(pSeg);
00096 break;
00097 }
00098 return false;
00099 }
00100
00105 void
00106 CSink::Work() {
00107 CSeg *pSeg = m_pSeg;
00108 m_pSeg = NULL;
00109
00110 (void)DoSegWork(pSeg);
00111 }
00112
00122 void
00123 CSink::OutPlug() {
00124 Assert::OutputDebugStringF(_T("CSink::OutPlug() m_fExit=%d\n"), m_fExit);
00125 }
00126
00134 CSeg *
00135 CSink::GetSeg(size_t cb) {
00136 return new CSeg(cb);
00137 }
00138
00143 void
00144 CSink::Signal(void *vId, void *p) {
00145 }
00146
00151 longlong
00152 CSink::SizeMax() {
00153 return OutSizeMax();
00154 }
00155
00162 void
00163 CSink::OutPump(CSeg *pSeg) {
00164 WorkStart();
00165 m_pSeg = pSeg;
00166 WorkSignal();
00167 }
00168
00174 longlong
00175 CSink::OutSizeMax() {
00176 return -1;
00177 }
00178
00183 CSeg *
00184 CSink::OutGetSeg(size_t cb) {
00185 return new CSeg(cb);
00186 }
00187
00197 bool
00198 CSink::OutSignal(void *vId, void *p) {
00199 return false;
00200 }
00201
00210 bool
00211 CSink::OutOpen() {
00212 return false;
00213 };
00214
00217 bool
00218 CSink::OutFlush() {
00219 return false;
00220 };
00221
00226 bool
00227 CSink::OutClose() {
00228 return false;
00229 };
00239 void
00240 CSink::OutSpecial(CSeg *pSeg) {
00241 pSeg->Release();
00242 }
00243
00245 CSink::CSink() {
00246 m_pSeg = NULL;
00247 m_fIsOpen = false;
00248 }
00249
00251 CSink::~CSink() {
00252 OutputDebugStringF(_T("CSink::~CSink() Initating... this=%p\n"), this);
00253 ASSCHK(m_fExit, _T("CSink::~CSink() called without Plug()"));
00254 if (CSeg::IsSeg(m_pSeg)) m_pSeg->Release();
00255 OutputDebugStringF(_T("CSink::~CSink() ...Done. this=%p\n"), this);
00256 }
00257
00260 void
00261 CSink::AppendSink(CSink *pSink, bool fAutoDelete) {
00262 SetError(ERROR_CODE_GENERIC, _T("Attempt to append to a sink"));
00263 }
00264
00267 void
00268 CSink::Sync() {
00269 WaitForIdle();
00270
00271 }
00272
00278 void
00279 CSink::DestructSink() {
00280 OutputDebugString(_T("CSink::DestructSink()\n"));
00281 }
00282 };