void InfoModelManager::HandleRows (QAbstractItemModel *model, int from, int to)
	{
		for (int i = from; i <= to; ++i)
		{
			const auto& idx = model->index (i, JobHolderColumn::JobProgress);
			if (IsInternal (idx))
				continue;

			const auto row = idx.data (CustomDataRoles::RoleJobHolderRow).value<JobHolderRow> ();
			if (row != JobHolderRow::DownloadProgress &&
					row != JobHolderRow::ProcessProgress)
				continue;

			if (idx.data (ProcessState::Done) == idx.data (ProcessState::Total))
				continue;

			auto ourItem = new QStandardItem;

			const auto& name = model->index (i, JobHolderColumn::JobName).data ().toString ();
			ourItem->setData (name, InfoModel::Name);

			PIdx2Item_ [idx] = ourItem;
			HandleData (model, i, i);

			Model_->appendRow (ourItem);
		}
	}
Exemple #2
0
void EHSServer::HandleData_Threaded ( )
{

#define HANDLEDATA_THREADEDSELECTTIMEOUTMILLISECONDS 1000


	pthread_t nMyThreadId = pthread_self ( );

	MUTEX_LOCK ( m_oMutex );
    int ThreadIndex = m_ThreadsSyncPoint.GetNewThreadIndex ();
    m_iActiveThreadCount++;
	MUTEX_UNLOCK ( m_oMutex );

	do {

        //fprintf ( stderr, "##### [%d] Thread HandleData\n", nMyThreadId );
		HandleData ( HANDLEDATA_THREADEDSELECTTIMEOUTMILLISECONDS,
					 nMyThreadId );

	    MUTEX_LOCK ( m_oMutex );
        m_ThreadsSyncPoint.SyncThreadIndex ( ThreadIndex );
	    MUTEX_UNLOCK ( m_oMutex );

	} while ( m_nServerRunningStatus != SERVERRUNNING_NOTRUNNING &&
              ( m_nServerRunningStatus == SERVERRUNNING_THREADPOOL ||
			    pthread_equal(nMyThreadId,m_nAcceptThreadId) ) );

	//fprintf ( stderr, "##### [%d] Thread exiting\n", nMyThreadId );
	MUTEX_LOCK ( m_oMutex );
    m_iActiveThreadCount--;
	MUTEX_UNLOCK ( m_oMutex );


}
	void InfoModelManager::handleDataChanged (const QModelIndex& topLeft, const QModelIndex& bottomRight)
	{
		if (bottomRight.column () < JobHolderColumn::JobProgress)
			return;

		auto model = qobject_cast<QAbstractItemModel*> (sender ());
		HandleData (model, topLeft.row (), bottomRight.row ());
	}
	void StreamListFetcherBase::handleReplyFinished ()
	{
		auto reply = qobject_cast<QNetworkReply*> (sender ());
		if (!reply)
			return;

		reply->deleteLater ();
		HandleData (reply->readAll ());
	}
Exemple #5
0
void NetBase::UnPackData(int length, int start)
{
    if(length <= 0)
    {
        //error.
        return;
    }
    
    int needLength;
    
    //new data.
    if(readDataTemp.data == NULL)
    {
        readDataTemp.dataLength = Converter::getInt(data, start);
        start -= 4; //因为Converter::getInt 会修改start的数值,故需要还原回去.
        if(readDataTemp.dataLength <= 0)
        {
            //error.
            readDataTemp.data = NULL;
            return;
        }
        readDataTemp.data = new Byte[readDataTemp.dataLength];
        
        //copy data.
        readDataTemp.index = MIN(readDataTemp.dataLength, length);
        for(int i = 0; i < readDataTemp.index; i++)
        {
            readDataTemp.data[i] = data[i+start];
        }
        
        needLength = readDataTemp.dataLength;
    }
    else
    {
        needLength = readDataTemp.dataLength - readDataTemp.index;
        int min = MIN(needLength, length);
        
        for(int i = 0;  i < min; i++)
        {
            readDataTemp.data[i+readDataTemp.index] = data[i+start];
        }
        readDataTemp.index += min;
    }
    
    if(length >= needLength)
    {
        //pushReadData();
        HandleData(readDataTemp.data);
        readDataTemp.data = NULL;
    }
    
    if(length > needLength)
    {
        UnPackData(length - needLength, needLength + start);
    }
}
/* This function checks if the next word is Virtual instruction
 (like .string or .data) */
int CheckIfVirtualInstruction(char *line , int isLabel)
{
	int i;
	char *word;
	/* Set i position for case you have label and for case you don't have a label */
	i = isLabel ? isLabel+2 : 0;

	/* Ignore spaces */
	while(isspace(line[i]))
		i++;

	/* Check if */
	if(line[i++]=='.')
	{
		word=GetWord(&line[i],' ');
		if(strcmp(word,"data")==0)
		{
			if(isLabel>0)
			{
				SetLabel(line,(int)isLabel,DATA,0,0,(int)DC);
			}
			/* Step over .data word in line */
			i+=5;
			/* Ignore spaces */
			while(isspace(line[i]))
				i++;

			HandleData(&line[i]);
			return 1;

		}
		else if(strcmp(word,"string")==0)
		{
			if(isLabel>0)
			{
				SetLabel(line,(int)isLabel,DATA,0,0,(int)DC);
			}
			/* Step over .string word in line */
			i += 7;
			/* Step over space */
			while(isspace(line[i]))
				i++;

			HandleString(&line[i]);
			return 1;
		}
	}
	else
	{
		return 0;
	}
	return 0;
}
void NodePressurePlate::activate(ActivationType a, void * data){
	if(a == COLLISION){
		Entity *e = static_cast<Entity*>(data);
		if(!heavy || (heavy && e->isHeavy())){
			if(!isDown){
				setHandleData(0, HandleData(true));
			}
			isDown = true;
			lastDownTick = getTickCount();
		}
	}
}
Exemple #8
0
void ShuffleRound::ProcessData(const QByteArray &data, const Id &id)
{
    QByteArray payload;
    if(!Verify(data, payload, id)) {
        return;
    }

    QDataStream stream(payload);
    int mtype;

    QByteArray session_id;
    stream >> mtype >> session_id;

    MessageType msg_type = (MessageType) mtype;

    Id sid(session_id);
    if(sid != GetId()) {
        qWarning() << "Invalid session, expected " << GetId().ToString()
                   << ", found " << sid.ToString();
        return;
    }

    _in_log.Append(data, id);

    switch(msg_type) {
    case PublicKeys:
        HandlePublicKeys(stream, id);
        break;
    case Data:
        HandleData(stream, id);
        break;
    case ShuffleData:
        HandleShuffle(stream, id);
        break;
    case EncryptedData:
        HandleDataBroadcast(stream, id);
        break;
    case GoMessage:
        HandleVerification(true, id);
        break;
    case NoGoMessage:
        HandleVerification(false, id);
        break;
    case PrivateKey:
        HandlePrivateKey(stream, id);
        break;
    default:
        qWarning() << "Unknown message type: " << MessageTypeToString(msg_type)
                   << " from " << id.ToString();
        return;
    }
}
int Detector::Consider(const char *data, int length) {
	if (HandleData(data, length) == NS_ERROR_OUT_OF_MEMORY) {
		// Error, signal with a negative number
		return -1;
	}

	if (mDone) {
		// Detected early
		return 0;
	}

	// Need more data!
	return 1;
}
Exemple #10
0
void NodeTimer::doGameUpdate(float updateFactor){
	if(run){
		currentDelay -= updateFactor;
		if(currentDelay <= 0){
			run = false;
			currentDelay = delay;
			setHandleData(0, HandleData(targetState));
		}
	}
//	if(isDown && lastDownTick != getTickCount()){
//		isDown = false;
//		setHandleData(0, HandleData(false));
//	}
}
Exemple #11
0
void NodeAnd::onInputChanged(int handleId){
	Node::onInputChanged(handleId);
	if(hasHandleData(0) && hasHandleData(1) && getInputHandleData(0).b && getInputHandleData(1).b){
		setHandleData(0, HandleData(true));
		positive = true;
	}
	else{
		setHandleData(0, HandleData(false));
		positive = false;
	}


	//	if(getActivation() == getIngoingCount()){
	//		for(Node *n : outgoing){
	//			n->onInputChanged(getUniqueId(), true);
	//		}
	//	}
	//	else{
	//		for(Node *n : outgoing){
	//			n->onInputChanged(getUniqueId(), false);
	//		}
	//	}

}
Exemple #12
0
	void HTTPProxyHandler::HandleSockRecv(const boost::system::error_code & ecode, std::size_t len)
	{
		LogPrint(eLogDebug,"--- HTTP Proxy sock recv: ", len);
		if(ecode) 
		{
			LogPrint(eLogWarning," --- HTTP Proxy sock recv got error: ", ecode);
                        Terminate();
			return;
		}

		if (HandleData(m_http_buff, len)) 
		{
			if (m_state == DONE) 
			{
				LogPrint(eLogInfo,"--- HTTP Proxy requested: ", m_url);
				GetOwner()->CreateStream (std::bind (&HTTPProxyHandler::HandleStreamRequestComplete,
						shared_from_this(), std::placeholders::_1), m_address, m_port);
			} 
			else 
				AsyncSockRead();
		}

	}
Exemple #13
0
		void CALLBACK Proc(HMIDIIN hMidiIn, UINT wMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
		{
			switch (wMsg)
			{
			case MM_MIM_OPEN:
				DebugPrint("MIDI Input Open\n");
				break;
			case MM_MIM_CLOSE:
				DebugPrint("MIDI Input Close\n");
				break;
			case MM_MIM_DATA:
				HandleData(dwInstance, dwParam1, dwParam2);
				break;
			case MM_MIM_LONGDATA:
				HandleLongData(dwInstance, dwParam1, dwParam2);
				break;
			case MM_MIM_ERROR:
				DebugPrint("MIDI Input Error: %08x %08x\n", dwParam1, dwParam2);
				break;
			case MM_MIM_LONGERROR:
				DebugPrint("MIDI Input Long Error: %08x %08x\n", dwParam1, dwParam2);
				break;
			}
		}
void NodePressurePlate::doGameUpdate(float updateFactor){
	if(isDown && lastDownTick != getTickCount()){
		isDown = false;
		setHandleData(0, HandleData(false));
	}
}
Exemple #15
0
void main()
{
	HandleData(0,NULL,NULL);
}
Exemple #16
0
void MuHttpServer::processServer()
{
   HandleData(0);
}
Exemple #17
0
UCDetect::UCDetect(const std::string &file)
: nsUniversalDetector(NS_FILTER_ALL)
{
	{
		agi::scoped_ptr<std::ifstream> fp(io::Open(file, true));

		// If it's over 100 MB it's either binary or big enough that we won't
		// be able to do anything useful with it anyway
		fp->seekg(0, std::ios::end);
		if (fp->tellg() > 100 * 1024 * 1024) {
			list.emplace_back(1.f, "binary");
			return;
		}
		fp->seekg(0, std::ios::beg);

		std::streamsize binaryish = 0;
		std::streamsize bytes = 0;

		while (!mDone && *fp) {
			char buf[4096];
			fp->read(buf, sizeof(buf));
			std::streamsize read = fp->gcount();
			HandleData(buf, (PRUint32)read);

			// A dumb heuristic to detect binary files
			if (!mDone) {
				bytes += read;
				for (std::streamsize i = 0; i < read; ++i) {
					if ((unsigned char)buf[i] < 32 && (buf[i] != '\r' && buf[i] != '\n' && buf[i] != '\t'))
						++binaryish;
				}

				if (binaryish > bytes / 8) {
					list.emplace_back(1.f, "binary");
					return;
				}
			}
		}
	}

	DataEnd();

	if (mDetectedCharset)
		list.emplace_back(1.f, mDetectedCharset);
	else {
		switch (mInputState) {
			case eHighbyte: {
				for (PRInt32 i=0; i<NUM_OF_CHARSET_PROBERS; i++) {
					if (!mCharSetProbers[i]) continue;

					float conf = mCharSetProbers[i]->GetConfidence();
					if (conf > 0.01f)
						list.emplace_back(conf, mCharSetProbers[i]->GetCharSetName());
				}

				break;
			}
			case ePureAscii:
				list.emplace_back(1.f, "US-ASCII");
				break;

			default:
				throw UnknownCharset("Unknown character set.");
		}

		if (list.empty() && (mInputState == eHighbyte))
			throw UnknownCharset("Unknown character set.");

		typedef std::pair<float, std::string> const& result;
		sort(begin(list), end(list), [](result lft, result rgt) { return lft.first > rgt.first; });
	}
}
Exemple #18
0
JSBool
js_ConsumeJSONText(JSContext *cx, JSONParser *jp, const jschar *data, uint32 len)
{
    uint32 i;
 
    if (*jp->statep == JSON_PARSE_STATE_INIT) {
        PushState(jp, JSON_PARSE_STATE_OBJECT_VALUE);
    }
 
    for (i = 0; i < len; i++) {        
        jschar c = data[i];
        switch (*jp->statep) {
            case JSON_PARSE_STATE_VALUE :
                if (c == ']') {
                    // empty array
                    if (!PopState(jp))
                        return JS_FALSE;
                    if (*jp->statep != JSON_PARSE_STATE_ARRAY) 
                        return JS_FALSE; // unexpected char
                    if (!CloseArray(cx, jp) || !PopState(jp))
                        return JS_FALSE;
                    break;
                }
 
                if (c == '}') {
                    // we should only find these in OBJECT_KEY state
                    return JS_FALSE; // unexpected failure
                }
 
                if (c == '"') {
                    *jp->statep = JSON_PARSE_STATE_STRING;
                    break;
                } 
 
                if (IsNumChar(c)) {
                    *jp->statep = JSON_PARSE_STATE_NUMBER;
                    js_AppendChar(jp->buffer, c);
                    break;
                }
 
                if (JS7_ISLET(c)) {
                    *jp->statep = JSON_PARSE_STATE_KEYWORD;
                    js_AppendChar(jp->buffer, c);
                    break;
                }
 
            // fall through in case the value is an object or array
            case JSON_PARSE_STATE_OBJECT_VALUE :
                if (c == '{') {
                  *jp->statep = JSON_PARSE_STATE_OBJECT;
                  if (!OpenObject(cx, jp) || !PushState(jp, JSON_PARSE_STATE_OBJECT_PAIR))
                      return JS_FALSE;
                } else if (c == '[') {
                  *jp->statep = JSON_PARSE_STATE_ARRAY;
                  if (!OpenArray(cx, jp) || !PushState(jp, JSON_PARSE_STATE_VALUE))
                      return JS_FALSE;
                } else if (!JS_ISXMLSPACE(c)) {
                  return JS_FALSE; // unexpected
                }
                break;
 
            case JSON_PARSE_STATE_OBJECT :
                if (c == '}') {                    
                    if (!CloseObject(cx, jp) || !PopState(jp))
                        return JS_FALSE;
                } else if (c == ',') {
                    if (!PushState(jp, JSON_PARSE_STATE_OBJECT_PAIR))
                        return JS_FALSE;
                } else if (c == ']' || !JS_ISXMLSPACE(c)) {
                    return JS_FALSE; // unexpected
                }
                break;
 
            case JSON_PARSE_STATE_ARRAY :
                if (c == ']') {
                    if (!CloseArray(cx, jp) || !PopState(jp))
                        return JS_FALSE;
                } else if (c == ',') {
                    if (!PushState(jp, JSON_PARSE_STATE_VALUE))
                        return JS_FALSE;
                } else if (!JS_ISXMLSPACE(c)) {
                    return JS_FALSE; // unexpected
                }
                break;
            case JSON_PARSE_STATE_OBJECT_PAIR :
                if (c == '"') {
                    // we want to be waiting for a : when the string has been read
                    *jp->statep = JSON_PARSE_STATE_OBJECT_IN_PAIR;
                    if (!PushState(jp, JSON_PARSE_STATE_STRING))
                        return JS_FALSE;
                } else if (c == '}') {
                    // pop off the object pair state and the object state
                    if (!CloseObject(cx, jp) || !PopState(jp) || !PopState(jp))
                        return JS_FALSE;
                } else if (c == ']' || !JS_ISXMLSPACE(c)) {
                  return JS_FALSE; // unexpected
                }
                break;
            case JSON_PARSE_STATE_OBJECT_IN_PAIR:
                if (c == ':') {
                    *jp->statep = JSON_PARSE_STATE_VALUE;
                } else if (!JS_ISXMLSPACE(c)) {
                    return JS_FALSE; // unexpected
                }
                break;
            case JSON_PARSE_STATE_STRING:
                if (c == '"') {
                    if (!PopState(jp))
                        return JS_FALSE;
                    JSONDataType jdt;
                    if (*jp->statep == JSON_PARSE_STATE_OBJECT_IN_PAIR) {
                        jdt = JSON_DATA_KEYSTRING;
                    } else {
                        jdt = JSON_DATA_STRING;
                    }
                    if (!HandleData(cx, jp, jdt, jp->buffer->base, STRING_BUFFER_OFFSET(jp->buffer)))
                        return JS_FALSE;
                } else if (c == '\\') {
                    *jp->statep = JSON_PARSE_STATE_STRING_ESCAPE;
                } else {
                    js_AppendChar(jp->buffer, c);
                }
                break;
        
            case JSON_PARSE_STATE_STRING_ESCAPE:
                switch(c) {
                    case '"':
                    case '\\':
                    case '/':
                        break;
                    case 'b' : c = '\b'; break;
                    case 'f' : c = '\f'; break;
                    case 'n' : c = '\n'; break;
                    case 'r' : c = '\r'; break;
                    case 't' : c = '\t'; break;
                    default :
                        if (c == 'u') {
                            jp->numHex = 0;
                            jp->hexChar = 0;
                            *jp->statep = JSON_PARSE_STATE_STRING_HEX;
                            continue;
                        } else {
                            return JS_FALSE; // unexpected
                        }
                }
 
                js_AppendChar(jp->buffer, c);
                *jp->statep = JSON_PARSE_STATE_STRING;
                break;
            case JSON_PARSE_STATE_STRING_HEX:
                if (('0' <= c) && (c <= '9'))
                  jp->hexChar = (jp->hexChar << 4) | (c - '0');
                else if (('a' <= c) && (c <= 'f'))
                  jp->hexChar = (jp->hexChar << 4) | (c - 'a' + 0x0a);
                else if (('A' <= c) && (c <= 'F'))
                  jp->hexChar = (jp->hexChar << 4) | (c - 'A' + 0x0a);
                else
                  return JS_FALSE; // unexpected
 
                if (++(jp->numHex) == 4) {
                    js_AppendChar(jp->buffer, jp->hexChar);
                    jp->hexChar = 0;
                    jp->numHex = 0;
                    *jp->statep = JSON_PARSE_STATE_STRING;
                }
                break;
            case JSON_PARSE_STATE_KEYWORD:
                if (JS7_ISLET(c)) {
                    js_AppendChar(jp->buffer, c);
                } else {
                    // this character isn't part of the keyword, process it again
                    i--;
                    if(!PopState(jp))
                        return JS_FALSE;
                
                    if (!HandleData(cx, jp, JSON_DATA_KEYWORD, jp->buffer->base, STRING_BUFFER_OFFSET(jp->buffer)))
                        return JS_FALSE;
                }
                break;
            case JSON_PARSE_STATE_NUMBER:
                if (IsNumChar(c)) {
                    js_AppendChar(jp->buffer, c);
                } else {
                    // this character isn't part of the number, process it again
                    i--;
                    if(!PopState(jp))
                        return JS_FALSE;
                    if (!HandleData(cx, jp, JSON_DATA_NUMBER, jp->buffer->base, STRING_BUFFER_OFFSET(jp->buffer)))
                        return JS_FALSE;
                }
                break;
            case JSON_PARSE_STATE_FINISHED:
                if (!JS_ISXMLSPACE(c))
                  return JS_FALSE; // extra input
 
                break;
            default:
                JS_NOT_REACHED("Invalid JSON parser state");
      }
    }
 
    return JS_TRUE;
}
bool EncodingDetector::DetectEncoding(const wxByte* buffer, size_t size, bool convert_to_wxstring)
{
    ConfigManager* cfgMgr = Manager::Get()->GetConfigManager(_T("editor"));
    wxString encname = cfgMgr->Read(_T("/default_encoding"));

    if (cfgMgr->ReadInt(_T("/default_encoding/use_option"), 0) == 1)
    {
        // Bypass C::B's auto-detection
        m_Encoding = wxFontMapper::Get()->CharsetToEncoding(encname, false);

        if (m_UseLog)
        {
            wxString msg;
            msg.Printf(_T("Warning: bypassing C::B's auto-detection!\n"
                          "Encoding requested is: %s (ID: %d)"),
                       wxFontMapper::Get()->GetEncodingDescription(m_Encoding).c_str(),
                       m_Encoding);
            Manager::Get()->GetLogManager()->DebugLog(msg);
        }
    }
    else
    {
        if (!buffer)
            return false;

        // Try our own detection for UTF-16 and UTF-32, the Mozilla-version does not work without BOM
        if ( DetectEncodingEx(buffer, size) )
        {
            if (m_UseBOM && m_UseLog)
            {
                wxString msg;
                msg.Printf(_T("Detected encoding via BOM: %s (ID: %d)"),
                           wxFontMapper::Get()->GetEncodingDescription(m_Encoding).c_str(),
                           m_Encoding);
                Manager::Get()->GetLogManager()->DebugLog(msg);
            }
        }
        else
        {
            //{ MOZILLA nsUniversalDetector START
            // If we still have no results try Mozilla (taken from nsUdetXPCOMWrapper.cpp):
            Reset(); nsresult res = HandleData((char*)buffer, size);
            if (res==NS_OK)
                DataEnd();
            else
            {
                m_MozillaResult = wxEmptyString;
                if (m_UseLog)
                    Manager::Get()->GetLogManager()->DebugLog(F(_T("Mozilla universal detection failed with %d."), res));
            }
            //} MOZILLA nsUniversalDetector END

            if ( !m_MozillaResult.IsEmpty() )
                m_Encoding = wxFontMapper::Get()->CharsetToEncoding(m_MozillaResult, false);

            if (m_Encoding == wxFONTENCODING_DEFAULT)
            {
                wxString enc_name = Manager::Get()->GetConfigManager(_T("editor"))->Read(_T("/default_encoding"), wxLocale::GetSystemEncodingName());
                m_Encoding = wxFontMapper::GetEncodingFromName(enc_name);
                if (m_UseLog)
                {
                    wxString msg;
                    msg.Printf(_T("Text seems to be pure ASCII!\n"
                                  "We use user specified encoding: %s (ID: %d)"),
                               wxFontMapper::Get()->GetEncodingDescription(m_Encoding).c_str(),
                               m_Encoding);
                    Manager::Get()->GetLogManager()->DebugLog(msg);
                }
            }

            if (m_Encoding < 0)
            {
                // Use user-specified one; as a fallback
                m_Encoding = wxFontMapper::Get()->CharsetToEncoding(encname, false);
                if (m_UseLog)
                {
                    wxString msg;
                    msg.Printf(_T("Warning: Using user specified encoding as fallback!\n"
                                  "Encoding fallback is: %s (ID: %d)"),
                               wxFontMapper::Get()->GetEncodingDescription(m_Encoding).c_str(),
                               m_Encoding);
                    Manager::Get()->GetLogManager()->DebugLog(msg);
                }
            }

            m_UseBOM = false;
            m_BOMSizeInBytes = 0;
        }
    }

    if (m_UseLog)
    {
        wxString msg;
        msg.Printf(_T("Final encoding detected: %s (ID: %d)"),
                   wxFontMapper::Get()->GetEncodingDescription(m_Encoding).c_str(),
                   m_Encoding);
        Manager::Get()->GetLogManager()->DebugLog(msg);
    }

    if (convert_to_wxstring && !ConvertToWxString(buffer, size) && m_UseLog)
        Manager::Get()->GetLogManager()->DebugLog(_T("Something seriously went wrong while converting file content to wxString!"));

    return true;
}
Exemple #20
0
void PasClient::HandleRecvData( socket_t *sock, const char *data, int len )
{
	OUT_RECV( sock->_szIp, sock->_port, "PasClient", "UDP fd %d, Recv: %s", sock->_fd, data ) ;

	// 否则是别人的UDP连接过来的数据
	if ( strcmp( _srvip.c_str(), sock->_szIp ) != 0  ) {
		// 拆分数据
		const char *ptr = strstr( data, "|" ) ;
		if ( ptr == NULL ) {
			OUT_ERROR( sock->_szIp, sock->_port, "Recv", "PasClient UDP fd %d data error", sock->_fd ) ;
			return ;
		}

		char srvid[128] = {0};
		memcpy( srvid, data+1, ptr- data -1 ) ;
		// 暂时只处理数据通道的心跳
		if ( strncmp( ptr+1 , "NOOP", 4 ) == 0 ) {
			SendData( sock, data, len ) ;
			OUT_INFO( sock->_szIp, sock->_port, srvid, "PasClient UDP fd %d NOOP", sock->_fd ) ;
		} else {

			_statinfo->AddRecv( sock->_szIp ) ;

			vector<string> vec;
			if ( ! splitvector( data, vec, "|", 0 ) ) {
				OUT_ERROR( sock->_szIp, sock->_port, "Recv", "fd %d, split data error: %s", sock->_fd, data ) ;
				return ;
			}
			// 7
			CBase64Ex base64 ;
			base64.Decode( vec[7].c_str(), vec[7].length() ) ;

			string sdata = "*";
			sdata += GetSrvId() ;
			sdata += ptr ;
			// *0431|GPSPosInfo|1.0.4|XQ|4|P|17|mxJ5B4AqAX4|0|0|118.3315|33.7856|99.98|+93.9|308|1340187770|0|-1|nhs#
			if ( HandleData( sdata.c_str(), sdata.length() ) ) {
				_statinfo->AddSend( sock->_szIp ) ;
			} else {
				PCCMSG_LOG( _pEnv->GetLogger(), sock->_szIp, sock->_port, srvid, "ERROR", "发送车牌号%s到服务器失败", base64.GetBuffer() ) ;
			}
			OUT_PRINT( sock->_szIp, sock->_port, srvid, "%s,PasClient UDP fd %d, HandleData: %s" ,
					base64.GetBuffer(), sock->_fd, sdata.c_str() ) ;

			bool error = false ;
			char szmacid[512] = {0} ;
			if ( _pEnv->GetMsgClient()->GetCarMacId( base64.GetBuffer(), szmacid ) ) {
				CQString buf , msg ;
				if ( PConvert::buildintergps( vec, szmacid, buf , msg ) ) {
					// 转换回内部协议发送给MSG
					_pEnv->GetMsgClient()->HandleUpMsgData( SEND_ALL, buf.GetBuffer(), buf.GetLength() ) ;
					// 打印的数据
					OUT_INFO( sock->_szIp, sock->_port, srvid, "fd %d, PasServer %s, Send Data: %s",
							sock->_fd, base64.GetBuffer(),  buf.GetBuffer() ) ;
				} else {
					error = true ;
					OUT_ERROR( sock->_szIp, sock->_port,  srvid, "fd %d, %s, PasClient build inter gps macid %s",
							sock->_fd, base64.GetBuffer(), szmacid ) ;
					PCCMSG_LOG( _pEnv->GetLogger(), sock->_szIp, sock->_port, srvid, "ERROR", "车牌号%s,错误:%s",
							base64.GetBuffer() , msg.GetBuffer() ) ;
				}
			} else {
				error = true ;
				OUT_ERROR( sock->_szIp, sock->_port, srvid, "PasClient UDP fd %d, %s get macid failed",
						sock->_fd, base64.GetBuffer() ) ;
				//PCCMSG_LOG( _pEnv->GetLogger(), ip, port, srvid, "ERROR", "取得车牌号%s值对应关系失败", base64.GetBuffer() ) ;
			}
			_statinfo->AddVechile( sock->_szIp, base64.GetBuffer(), my_atoi(vec[4].c_str()) , error ) ;
		}
	} else {
		// 如果来自服务器的UDP的数据
		PccUser user ;
		if ( ! _user.GetUser( sock, user ) ) {
			PccUser &udpuser = _user.GetUser( false ) ;
			udpuser._fd  = sock ;
			udpuser.SetOnline() ;
		} else {
			_user.Update( PCC_USER_ACTVIE, user._tcp ) ;
			PccUser &tmpuser = _user.GetUser( false ) ;
			tmpuser.SetOnline();
		}

		vector<string> vec;
		if ( ! splitvector( data, vec, "|", 0 ) ) {
			OUT_ERROR( sock->_szIp, sock->_port, "Recv", "fd %d, split data error: %s", sock->_fd, data ) ;
			return ;
		}

		if ( vec.size() < 3 ){
			OUT_ERROR( sock->_szIp, sock->_port, "Recv", "fd %d, data error: %s", sock->_fd, data ) ;
			return ;
		}

		// 暂时只处理数据通道的心跳
		if ( vec[1] == "NOOP" ) {
			OUT_RECV( sock->_szIp, sock->_port, "UDP", "Recv fd %d data NOOP" , sock->_fd ) ;
		} /*else if ( vec[1] == "QryGPSPosInfo" || vec[1] == "QueryAllGPSData" ) {
			PccUser &udp = _user.GetUser(false) ;
			SendData( udp._fd, data, len ) ;
			OUT_PRINT( NULL, 0, "Send", "%s", data ) ;
		}*/
	}
}
Exemple #21
0
int
cOpenHpiDaemon::MainLoop()
{
  DbgCon( "ready for incomming connections.\n" );

  int num_add = 1;

  if ( m_interactive )
     {
       m_pollfd = new pollfd[2];

       num_add++;

       m_pollfd[1].fd     = 0; // stdin
       m_pollfd[1].events = POLLIN;
       m_pollfd[1].revents = 0;
     }
  else
       m_pollfd = new pollfd[1];

  m_pollfd[0].fd     = m_main_socket->m_fd;
  m_pollfd[0].events = POLLIN;
  m_pollfd[0].revents = 0;

  while( true )
     {
       int rv = poll( m_pollfd, m_num_connections + num_add, 250 );

       if ( rv < 0 )
	  {
	    usleep( 100000 );

	    if ( errno != EINTR )
		 fprintf( stderr, "can't poll: %s %d !\n",
			  strerror( errno ), errno );

	    // sleep a while
	    usleep( 100 );
	    continue;
	  }

       if ( rv == 0 )
	  {
	    Idle();
	    continue;
	  }

       for( int i = m_num_connections - 1; i >= 0; i-- )
	    if ( m_pollfd[i].revents )
		 if ( !HandleData( m_connections[i] ) )
		    {
		      CloseConnection( i );

		      // m_pollfd has changed
		      continue;
		    }

       if ( m_pollfd[m_num_connections].revents )
	  {
	    // create new connection
	    cServerConnection *c = ServerConnectionMainAccept( m_main_socket );

	    if ( c )
	       {
		 NewConnection( c );
		 continue;
	       }
	  }

       if ( m_interactive && m_pollfd[m_num_connections+1].revents )
	    if ( HandleInteractive() == false )
		 break;
     }

  return 0;
}