예제 #1
0
파일: IOCP.cpp 프로젝트: netscane/WebSpider
bool CIOCP::_DoWrite(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONTEXT* pIoContext)
{
	if (pIoContext->m_nSendBytes < pIoContext->m_nTotalBytes)
	{
		//数据未能发送完,继续发送数据
		WSABUF* p_wbuf = &pIoContext->m_wsaBuf;
		p_wbuf->buf += pIoContext->m_nSendBytes;
		p_wbuf->len -= pIoContext->m_nSendBytes;
		PostWrite(pSocketContext,pIoContext);
	}
	else
	{
		NODEBUF* pNode = pIoContext->m_listBuf.pNode;
		pNode = pNode->pNext;
		if(pNode&&pNode->len>0)
		{
			WSABUF* p_wbuf = &pIoContext->m_wsaBuf;
			p_wbuf->buf = pNode->buf;
			p_wbuf->len = pNode->len;
			PostWrite(pSocketContext,pIoContext);
		}
		else
		{
			pIoContext->ResetBuffer();
			PostRecv(pSocketContext,pIoContext);
		}
	}
	return TRUE;
}
bool MIDIFileWriteMultiTrack::Write ( int num_tracks, int division )
{
    if ( !PreWrite() )
        return false;

    // first, write the header.
    writer.WriteFileHeader ( ( num_tracks > 1 )? 1:0, num_tracks, division );
    // now write each track

    for ( int i = 0; i < num_tracks; ++i )
    {
        const MIDITrack *t = multitrack->GetTrack ( i );

        if ( !t || !t->EventsOrderOK() ) // time of events out of order: t->SortEventsOrder() must be done externally
            return false;

        writer.WriteTrackHeader ( 0 ); // will be rewritten later

        const MIDITimedBigMessage *ev;
        MIDIClockTime ev_time = 0;

        for ( int event_num = 0; event_num < t->GetNumEvents(); ++event_num )
        {
            ev = t->GetEventAddress ( event_num );
            if ( !ev )
                return false;

            // don't write to midifile NoOp msgs
            if ( ev->IsNoOp() )
                continue;

            ev_time = ev->GetTime();

            // ignore all msgs after EndOfTrack
            if ( ev->IsDataEnd() )
              break;

            // write all other msgs
            writer.WriteEvent ( *ev );

            if ( writer.ErrorOccurred() )
                return false;
        }

        writer.WriteEndOfTrack ( ev_time );
        writer.RewriteTrackLength();
    }

    if ( !PostWrite() )
        return false;

    return true;
}
 bool MIDIFileWriteMultiTrack::Write( int num_tracks, int division )
 {
   bool f=true;
   if( !PreWrite() )
   {
     return false;
   }
   
   // first, write the header.
   
   writer.WriteFileHeader( (num_tracks>0), num_tracks, division );
   
   // now write each track
   
   for( int i=0; i<num_tracks; ++i )
   {
     if( writer.ErrorOccurred() )
     {
       f=false;
       break;
     }
     
     const MIDITrack *t = multitrack->GetTrack(i);
     
     MIDIClockTime last_event_time=0;
     
     writer.WriteTrackHeader(0); // will be rewritten later
     
     if( t )
     {
       for( int event_num=0; event_num<t->GetNumEvents(); ++event_num )
       {
         const MIDITimedBigMessage *ev = t->GetEventAddress( event_num );
         if( ev && !ev->IsNoOp() )
         {
           last_event_time = ev->GetTime();
           
           if( !ev->IsDataEnd() )
           {
             writer.WriteEvent( *ev );
             
             if( writer.ErrorOccurred() )
             {
               f=false;
               break;
             }
           }
         }
       }
     }
     writer.WriteEndOfTrack(0);
     writer.RewriteTrackLength();
   }
   
   if( !PostWrite() )
   {
     return false;
   }
   
   return f;
 }