nsresult ArchiveRequest::ReaderReady(nsTArray<nsCOMPtr<nsIDOMFile> >& aFileList, nsresult aStatus) { if (NS_FAILED(aStatus)) { FireError(aStatus); return NS_OK; } JS::Value result; nsresult rv; nsIScriptContext* sc = GetContextForEventHandlers(&rv); NS_ENSURE_STATE(sc); AutoPushJSContext cx(sc->GetNativeContext()); NS_ASSERTION(cx, "Failed to get a context!"); JS::Rooted<JSObject*> global(cx, sc->GetNativeGlobal()); NS_ASSERTION(global, "Failed to get global object!"); JSAutoRequest ar(cx); JSAutoCompartment ac(cx, global); switch (mOperation) { case GetFilenames: rv = GetFilenamesResult(cx, &result, aFileList); break; case GetFile: rv = GetFileResult(cx, &result, aFileList); break; case GetFiles: rv = GetFilesResult(cx, &result, aFileList); break; } if (NS_FAILED(rv)) { NS_WARNING("Get*Result failed!"); } if (NS_SUCCEEDED(rv)) { FireSuccess(result); } else { FireError(rv); } return NS_OK; }
nsresult ArchiveRequest::ReaderReady(nsTArray<nsCOMPtr<nsIDOMFile> >& aFileList, nsresult aStatus) { if (NS_FAILED(aStatus)) { FireError(aStatus); return NS_OK; } jsval result; nsresult rv; nsIScriptContext* sc = GetContextForEventHandlers(&rv); NS_ENSURE_STATE(sc); JSContext* cx = sc->GetNativeContext(); NS_ASSERTION(cx, "Failed to get a context!"); JSObject* global = sc->GetNativeGlobal(); NS_ASSERTION(global, "Failed to get global object!"); JSAutoRequest ar(cx); JSAutoEnterCompartment ac; if (ac.enter(cx, global)) { switch (mOperation) { case GetFilenames: rv = GetFilenamesResult(cx, &result, aFileList); break; case GetFile: rv = GetFileResult(cx, &result, aFileList); break; } if (NS_FAILED(rv)) { NS_WARNING("Get*Result failed!"); } } else { NS_WARNING("Failed to enter correct compartment!"); rv = NS_ERROR_FAILURE; } if (NS_SUCCEEDED(rv)) { FireSuccess(result); } else { FireError(rv); } return NS_OK; }
BOOL CUdpClient::HandleConnect(WSANETWORKEVENTS& events) { BOOL bContinue = TRUE; int iCode = events.iErrorCode[FD_CONNECT_BIT]; if(iCode == 0) { if(::WSAEventSelect(m_soClient, m_evSocket, FD_READ | FD_WRITE | FD_CLOSE) != SOCKET_ERROR) { if(FireConnect(this) != HR_ERROR) { VERIFY(NeedDetectorThread() || DetectConnection() == NO_ERROR); m_enState = SS_STARTED; } else iCode = ERROR_CANCELLED; } else iCode = ::WSAGetLastError(); } if(iCode != 0) { SetLastError(SE_NETWORK, __FUNCTION__, iCode); FireError(this, SO_CONNECT, iCode); bContinue = FALSE; } return bContinue; }
void CUdpServer::CloseClientSocketObj(TUdpSocketObj* pSocketObj, EnSocketCloseFlag enFlag, EnSocketOperation enOperation, int iErrorCode) { ASSERT(TUdpSocketObj::IsExist(pSocketObj)); if(enFlag == SCF_CLOSE) FireClose(pSocketObj->connID); else if(enFlag == SCF_ERROR) FireError(pSocketObj->connID, enOperation, iErrorCode); }
// Here the request is processed: void ArchiveRequest::Run() { // Register this request to the reader. // When the reader is ready to return data, a 'Ready()' will be called nsresult rv = mArchiveReader->RegisterRequest(this); if (NS_FAILED(rv)) FireError(rv); }
BOOL CUdpClient::SendData() { while(TRUE) { TItemPtr itPtr(m_itPool, GetSendBuffer()); if(itPtr.IsValid()) { ASSERT(!itPtr->IsEmpty()); int rc = 0; { CCriSecLock locallock(m_csSend); rc = send(m_soClient, (char*)itPtr->Ptr(), itPtr->Size(), 0); if(rc > 0) m_iPending -= rc; } if(rc > 0) { ASSERT(rc == itPtr->Size()); if(FireSend(this, itPtr->Ptr(), rc) == HR_ERROR) { TRACE("<C-CNNID: %Iu> OnSend() event should not return 'HR_ERROR' !!\n", m_dwConnID); ASSERT(FALSE); } } else if(rc == SOCKET_ERROR) { int iCode = ::WSAGetLastError(); if(iCode == WSAEWOULDBLOCK) { CCriSecLock locallock(m_csSend); m_lsSend.PushFront(itPtr.Detach()); break; } else { SetLastError(SE_NETWORK, __FUNCTION__, iCode); FireError(this, SO_SEND, iCode); return FALSE; } } else ASSERT(FALSE); } else break; } return TRUE; }
BOOL CUdpClient::ReadData() { while(TRUE) { int rc = recv(m_soClient, (char*)(BYTE*)m_rcBuffer, m_dwMaxDatagramSize, 0); if(rc > 0) { if(FireReceive(this, m_rcBuffer, rc) == HR_ERROR) { TRACE("<C-CNNID: %Iu> OnReceive() event return 'HR_ERROR', connection will be closed !\n", m_dwConnID); SetLastError(SE_DATA_PROC, __FUNCTION__, ERROR_CANCELLED); FireError(this, SO_RECEIVE, ERROR_CANCELLED); return FALSE; } } else if(rc == SOCKET_ERROR) { int code = ::WSAGetLastError(); if(code == WSAEWOULDBLOCK) break; else { SetLastError(SE_NETWORK, __FUNCTION__, code); FireError(this, SO_RECEIVE, code); return FALSE; } } else if(rc == 0) { m_dwDetectFails = 0; TRACE("<C-CNNID: %Iu> recv 0 bytes (detect package)\n", m_dwConnID); } else ASSERT(FALSE); } return TRUE; }
BOOL CUdpClient::HandleError() { int iCode = ::WSAGetLastError(); SetLastError(SE_NETWORK, __FUNCTION__, iCode); VERIFY(::WSAResetEvent(m_evSocket)); FireError(this, SO_UNKNOWN, iCode); return FALSE; }
BOOL CTcpClient::ReadData() { while(TRUE) { int rc = recv(m_soClient, (char*)(BYTE*)m_rcBuffer, m_dwSocketBufferSize, 0); if(rc > 0) { if(FireReceive(m_dwConnID, m_rcBuffer, rc) == HR_ERROR) { TRACE("<C-CNNID: %Iu> OnReceive() event return 'HR_ERROR', connection will be closed !\n", m_dwConnID); SetLastError(SE_DATA_PROC, __FUNCTION__, ERROR_FUNCTION_FAILED); FireError(m_dwConnID, SO_RECEIVE, ERROR_FUNCTION_FAILED); return FALSE; } } else if(rc == SOCKET_ERROR) { int code = ::WSAGetLastError(); if(code == WSAEWOULDBLOCK) break; else { SetLastError(SE_NETWORK, __FUNCTION__, code); FireError(m_dwConnID, SO_RECEIVE, code); return FALSE; } } else if(rc == 0) { FireClose(m_dwConnID); return FALSE; } else ASSERT(FALSE); } return TRUE; }
nsresult FileRequest::NotifyHelperCompleted(FileHelper* aFileHelper) { NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); nsresult rv = aFileHelper->mResultCode; // If the request failed then fire error event and return. if (NS_FAILED(rv)) { FireError(rv); return NS_OK; } // Otherwise we need to get the result from the helper. jsval result; nsIScriptContext* sc = GetContextForEventHandlers(&rv); NS_ENSURE_STATE(sc); JSContext* cx = sc->GetNativeContext(); NS_ASSERTION(cx, "Failed to get a context!"); JSObject* global = sc->GetNativeGlobal(); NS_ASSERTION(global, "Failed to get global object!"); JSAutoRequest ar(cx); JSAutoCompartment ac(cx, global); rv = aFileHelper->GetSuccessResult(cx, &result); if (NS_FAILED(rv)) { NS_WARNING("GetSuccessResult failed!"); } if (NS_SUCCEEDED(rv)) { FireSuccess(result); } else { FireError(rv); } return NS_OK; }
void CTcpAgent::CloseClientSocketObj(TSocketObj* pSocketObj, EnSocketCloseFlag enFlag, EnSocketOperation enOperation, int iErrorCode, int iShutdownFlag) { ASSERT(TSocketObj::IsExist(pSocketObj)); if(enFlag == SCF_CLOSE) FireClose(pSocketObj->connID); else if(enFlag == SCF_ERROR) FireError(pSocketObj->connID, enOperation, iErrorCode); ::ManualCloseSocket(pSocketObj->socket, iShutdownFlag); }
int CIocpServer::DoSend(TSocketObj* pSocketObj, TBufferObj* pBufferObj) { int result = ::PostSend(pSocketObj, pBufferObj); if(result != NO_ERROR) { FireError(pSocketObj->connID, SO_SEND, result); AddFreeSocketObj(pSocketObj->connID); AddFreeBufferObj(pBufferObj); } return result; }
BOOL CUdpCast::ReadData() { while(TRUE) { int addrLen = sizeof(SOCKADDR_IN); int rc = recvfrom(m_soClient, (char*)(BYTE*)m_rcBuffer, m_dwMaxDatagramSize, 0, (sockaddr*)&m_remoteAddr, &addrLen); if(rc >= 0) { if(FireReceive(this, m_rcBuffer, rc) == HR_ERROR) { TRACE("<C-CNNID: %Iu> OnReceive() event return 'HR_ERROR', connection will be closed !\n", m_dwConnID); SetLastError(SE_DATA_PROC, __FUNCTION__, ERROR_CANCELLED); FireError(this, SO_RECEIVE, ERROR_CANCELLED); return FALSE; } } else if(rc == SOCKET_ERROR) { int code = ::WSAGetLastError(); if(code == WSAEWOULDBLOCK) break; else { SetLastError(SE_NETWORK, __FUNCTION__, code); FireError(this, SO_RECEIVE, code); return FALSE; } } else ASSERT(FALSE); } return TRUE; }
void CUdpServer::HandleError(CONNID dwConnID, TUdpBufferObj* pBufferObj, DWORD dwErrorCode) { if(dwConnID != 0) { FireError(dwConnID, pBufferObj->operation, dwErrorCode); AddFreeSocketObj(dwConnID); } if(pBufferObj->operation == SO_RECEIVE) DoReceive(pBufferObj); else AddFreeBufferObj(pBufferObj); }
void CIocpServer::HandleReceive(TSocketObj* pSocketObj, TBufferObj* pBufferObj) { //处理接收数据 处理完成后重新投递 if(FireReceive(pSocketObj->connID, (BYTE*)pBufferObj->buff.buf, pBufferObj->buff.len) != ISocketListener::HR_ERROR) DoReceive(pSocketObj, pBufferObj); else { TRACE1("<CNNID: %d> FireReceive() return HR_ERROR, connection will be closed", pSocketObj->connID); FireError(pSocketObj->connID, SO_RECEIVE, WSAEPROTOTYPE); AddFreeSocketObj(pSocketObj->connID); AddFreeBufferObj(pBufferObj); } }
int CIocpServer::DoReceive(TSocketObj* pSocketObj, TBufferObj* pBufferObj) { pBufferObj->buff.len = m_dwIocpBufferSize; //pBufferObj->ResetBuf(); int result = ::PostReceive(pSocketObj, pBufferObj); if(result != NO_ERROR) { FireError(pSocketObj->connID, SO_RECEIVE, result); AddFreeSocketObj(pSocketObj->connID); AddFreeBufferObj(pBufferObj); } return result; }
void CTcpServer::CloseClientSocketObj(TSocketObj* pSocketObj, EnSocketCloseFlag enFlag, EnSocketOperation enOperation, int iErrorCode, int iShutdownFlag) { ASSERT(TSocketObj::IsExist(pSocketObj)); if(enFlag == SCF_CLOSE) FireClose(pSocketObj); else if(enFlag == SCF_ERROR) FireError(pSocketObj, enOperation, iErrorCode); SOCKET socket = pSocketObj->socket; pSocketObj->socket = INVALID_SOCKET; ::ManualCloseSocket(socket, iShutdownFlag); }
BOOL CUdpClient::HandleWrite(WSANETWORKEVENTS& events) { BOOL bContinue = TRUE; int iCode = events.iErrorCode[FD_WRITE_BIT]; if(iCode == 0) bContinue = SendData(); else { SetLastError(SE_NETWORK, __FUNCTION__, iCode); FireError(this, SO_SEND, iCode); bContinue = FALSE; } return bContinue; }
BOOL CUdpClient::HandleRead(WSANETWORKEVENTS& events) { BOOL bContinue = TRUE; int iCode = events.iErrorCode[FD_READ_BIT]; if(iCode == 0) bContinue = ReadData(); else { SetLastError(SE_NETWORK, __FUNCTION__, iCode); FireError(this, SO_RECEIVE, iCode); bContinue = FALSE; } return bContinue; }
void CIocpServer::HandleIo(TSocketObj* pSocketObj, TBufferObj* pBufferObj, DWORD dwBytes, DWORD dwErrorCode) { ASSERT(pBufferObj != NULL); ASSERT(pSocketObj != NULL); //判断是否已经标记失败 if(dwErrorCode != NO_ERROR) { if(pBufferObj->operation != SO_ACCEPT) { FireError(pSocketObj->connID, pBufferObj->operation, dwErrorCode); AddFreeSocketObj(pSocketObj->connID); } else { DeleteAcceptSocket(pBufferObj->client, TRUE); } AddFreeBufferObj(pBufferObj); return; } if(dwBytes == 0 && pBufferObj->operation != SO_ACCEPT) { FireClose(pSocketObj->connID); AddFreeSocketObj(pSocketObj->connID); AddFreeBufferObj(pBufferObj); return; } pBufferObj->buff.len = dwBytes; switch(pBufferObj->operation) { case SO_ACCEPT: HandleAccept((SOCKET)pSocketObj, pBufferObj); break; case SO_SEND: HandleSend(pSocketObj, pBufferObj); break; case SO_RECEIVE: HandleReceive(pSocketObj, pBufferObj); break; default: ASSERT(FALSE); } }
void CUdpServer::HandleReceive(CONNID dwConnID, TUdpBufferObj* pBufferObj) { if(dwConnID == 0) dwConnID = HandleAccept(pBufferObj); if(dwConnID != 0) { if(FireReceive(dwConnID, (BYTE*)pBufferObj->buff.buf, pBufferObj->buff.len) == ISocketListener::HR_ERROR) { TRACE1("<S-CNNID: %Iu> OnReceive() event return 'HR_ERROR', connection will be closed !\n", dwConnID); FireError(dwConnID, SO_RECEIVE, ERROR_FUNCTION_FAILED); AddFreeSocketObj(dwConnID); } } DoReceive(pBufferObj); }
BOOL CTcpClient::DoSendData(TItem* pItem) { while(!pItem->IsEmpty()) { int rc = 0; { CCriSecLock locallock(m_csSend); rc = send(m_soClient, (char*)pItem->Ptr(), min(pItem->Size(), (int)m_dwSocketBufferSize), 0); if(rc > 0) m_iPending -= rc; } if(rc > 0) { if(FireSend(this, pItem->Ptr(), rc) == HR_ERROR) { TRACE("<C-CNNID: %Iu> OnSend() event should not return 'HR_ERROR' !!\n", m_dwConnID); ASSERT(FALSE); } pItem->Reduce(rc); } else if(rc == SOCKET_ERROR) { int code = ::WSAGetLastError(); if(code == WSAEWOULDBLOCK) break; else { SetLastError(SE_NETWORK, __FUNCTION__, code); FireError(this, SO_SEND, code); return FALSE; } } else ASSERT(FALSE); } return TRUE; }
BOOL CUdpClient::HandleClosse(WSANETWORKEVENTS& events) { int iCode = events.iErrorCode[FD_CLOSE_BIT]; if(iCode == 0) FireClose(this); else { EnSocketOperation enOperation = events.lNetworkEvents & FD_READ ? SO_RECEIVE : ( events.lNetworkEvents & FD_WRITE ? SO_SEND : (events.lNetworkEvents & FD_CONNECT ? SO_CONNECT : SO_UNKNOWN) ); SetLastError(SE_NETWORK, __FUNCTION__, iCode); FireError(this, enOperation, iCode); } return FALSE; }
BOOL CClientSocket::DoSendData(CBufferPtr& sndData) { while(sndData.Size() > 0) { int rc = send(m_soClient, (char*)(BYTE*)sndData, min((int)sndData.Size(), (int)m_dwSocketBufferSize), 0); if(rc > 0) { if(FireSend(m_dwConnID, sndData, rc) == ISocketListener::HR_ERROR) { TRACE1("<CNNID: %Iu> OnSend() event should not return 'HR_ERROR' !!\n", m_dwConnID); ASSERT(FALSE); } int left = (int)sndData.Size() - rc; memcpy((BYTE*)sndData, (BYTE*)sndData + rc, left); sndData.Realloc(left); } else if(rc == SOCKET_ERROR) { int code = ::WSAGetLastError(); if(code == WSAEWOULDBLOCK) break; else { SetLastError(ISC_NETWORK_ERROR, _T(__FUNCTION__), code); FireError(m_dwConnID, SO_SEND, code); return FALSE; } } else ASSERT(FALSE); } return TRUE; }
unsigned int RippingTask::Run() { int start = (m_cd->begin()+m_track)->first_sector; int end = (m_cd->begin()+m_track)->last_sector; // TRACE << "Ripping track " << m_track+1 << " sectors " // << start << ".." << end << "\n"; unsigned int pcmsize = (unsigned)(end-start+1) * 2352; unsigned int rc; // If there's CPU to spare, back to RAM, else back to disk std::unique_ptr<util::Stream> backingstream; if (0 && m_encode_queue->AnyWaiting()) { backingstream.reset(new util::MemoryStream(pcmsize)); TRACE << "Chosen to rip via RAM\n"; } else { rc = util::OpenFileStream(m_filename.c_str(), util::TEMP, &backingstream); if (rc != 0) { TRACE << "Can't create temporary\n"; return rc; } // StreamPtr awb; // AsyncWriteBuffer::Create(fsp, m_disk_queue, &awb); TRACE << "Chosen to rip via disk\n"; } util::MultiStreamPtr msp = util::MultiStream::Create(backingstream, pcmsize); // Note that msp now owns the backingstream std::unique_ptr<util::Stream> pcmforflac; msp->CreateOutput(&pcmforflac); std::unique_ptr<util::Stream> pcmformp3; msp->CreateOutput(&pcmformp3); m_etp1->SetInputStream(pcmforflac, pcmsize); m_encode_queue->PushTask(util::Bind(m_etp1).To<&EncodingTask::Run>()); m_etp2->SetInputStream(pcmformp3, pcmsize); m_encode_queue->PushTask(util::Bind(m_etp2).To<&EncodingTask::Run>()); std::unique_ptr<util::Stream> cdstream = m_cd->GetTrackStream(m_track); if (!cdstream.get()) { TRACE << "Can't make CD stream\n"; FireError(ENOENT); return ENOENT; } char buf[2352*20]; time_t t = time(NULL); size_t done = 0; while (done < pcmsize) { size_t lump = pcmsize - done; if (lump > sizeof(buf)) lump = sizeof(buf); size_t nread; rc = cdstream->Read(buf, lump, &nread); if (rc != 0 || nread == 0) { FireError(rc); TRACE << "Read error " << rc << "\n"; return rc; } rc = msp->WriteAll(buf, nread); if (rc != 0) { TRACE << "Write error " << rc << "\n"; FireError(rc); return rc; } // TRACE << "Got " << nread << " bytes\n"; done += nread; FireProgress((unsigned int)done, pcmsize); } t = time(NULL) - t; if (t) { double x = ((end-start+1)/75.0)/(double)t; TRACE << "Rip track " << (m_track+1) << " done " << x << "x\n"; } return 0; }
BOOL CTcpClient::ProcessNetworkEvent() { BOOL bContinue = TRUE; WSANETWORKEVENTS events; int rc = ::WSAEnumNetworkEvents(m_soClient, m_evSocket, &events); if(rc == SOCKET_ERROR) { int code = ::WSAGetLastError(); SetLastError(SE_NETWORK, __FUNCTION__, code); VERIFY(::WSAResetEvent(m_evSocket)); FireError(m_dwConnID, SO_UNKNOWN, code); bContinue = FALSE; } if(bContinue && events.lNetworkEvents & FD_READ) { int iCode = events.iErrorCode[FD_READ_BIT]; if(iCode == 0) bContinue = ReadData(); else { SetLastError(SE_NETWORK, __FUNCTION__, iCode); FireError(m_dwConnID, SO_RECEIVE, iCode); bContinue = FALSE; } } if(bContinue && events.lNetworkEvents & FD_WRITE) { int iCode = events.iErrorCode[FD_WRITE_BIT]; if(iCode == 0) bContinue = SendData(); else { SetLastError(SE_NETWORK, __FUNCTION__, iCode); FireError(m_dwConnID, SO_SEND, iCode); bContinue = FALSE; } } if(m_bAsyncConnect && bContinue && events.lNetworkEvents & FD_CONNECT) { int iCode = events.iErrorCode[FD_CONNECT_BIT]; if(iCode == 0) { if(::WSAEventSelect(m_soClient, m_evSocket, FD_READ | FD_WRITE | FD_CLOSE) != SOCKET_ERROR) { if(FireConnect(m_dwConnID) != HR_ERROR) m_enState = SS_STARTED; else iCode = ERROR_FUNCTION_FAILED; } else iCode = ::WSAGetLastError(); } if(iCode != 0) { SetLastError(SE_NETWORK, __FUNCTION__, iCode); FireError(m_dwConnID, SO_CONNECT, iCode); bContinue = FALSE; } } if(bContinue && events.lNetworkEvents & FD_CLOSE) { int iCode = events.iErrorCode[FD_CLOSE_BIT]; if(iCode == 0) FireClose(m_dwConnID); else { SetLastError(SE_NETWORK, __FUNCTION__, iCode); FireError(m_dwConnID, SO_UNKNOWN, iCode); } bContinue = FALSE; } return bContinue; }