void CMemoryView::ResetData(ePipeline& DataList){ CTitle* Title = (CTitle*)m_ChildList[1]; Title->DeleteAll(); Title->m_ObjectCount=0; for (int i=0; i<DataList.Size(); i+=2) { int64 InstanceID = *(int64*)DataList.GetData(i); ePipeline* InstanceItem = (ePipeline*)DataList.GetData(i+1); tstring InstanceName = InstanceItem->GetLabel(); CreateDataInstance(InstanceName); CTextItem* DataList = (CTextItem*)Title->m_ChildList[Title->m_ObjectCount-1]; for (int j=0; j<InstanceItem->Size(); j++) { ePipeline* Data = (ePipeline*)InstanceItem->GetData(j); CMemoryView::CTextItem* DataItem = Data2Item(j,Data); if (DataItem==NULL) { return; } //DataItem->m_State = SPACE_NOTOOLABR; DataList->PushChild(DataItem); } } Layout(); }
CObjectData::CObjectData(ePipeline& ObjectData){ if (ObjectData.Size()!=4) { return; } m_ID = ObjectData.GetID(); m_Name = *(tstring*)ObjectData.GetData(0); m_Type = *(SPACETYPE*)ObjectData.GetData(1); m_Fingerprint = *(tstring*)ObjectData.GetData(2); ePipeline* Path = (ePipeline*)ObjectData.GetData(3); m_Address << *Path; }
void CBrainMemory::RegisterGlobalPeople(ePipeline& PeopleData){ tstring& Name = *(tstring*)PeopleData.GetData(0); _tcsupr(&Name[0]); CLock lk(&m_MemoryMutex); m_GlobalPeopleList[Name] = PeopleData; };
bool IsEqualAddress(ePipeline& Address1,ePipeline& Address2) { int32 n = Address1.Size(); if (n != Address2.Size()) { return FALSE; } for (int i=0; i<n; i++) { int64& ID1 = *(int64*)Address1.GetData(i); int64& ID2 = *(int64*)Address2.GetData(i); if (ID1 != ID2) { return FALSE; } } return TRUE; }
void CSpacePortal::OnRequestUseObject(int64 SourceID,ePipeline& RequestInfo){ int64 EventID = RequestInfo.PopInt(); ePipeline* ObjectInfo = (ePipeline*)RequestInfo.GetData(0); ePipeline* ExePipe = (ePipeline*)RequestInfo.GetData(1); CObjectData Object(*ObjectInfo); int64 ExecuterID = Object.m_ID; CLinker ExecuterLinker; GetLinker(ExecuterID,ExecuterLinker); if (!ExecuterLinker.IsValid()) { ExePipe->GetLabel() = Format1024(_T("Error: Executer not started.")); ExePipe->SetID(RETURN_ERROR); CLinker Requester; GetLinker(SourceID,Requester); if (Requester.IsValid()) { CMsg FeedbackMsg(MSG_TASK_FEEDBACK,NULL,EventID); ePipeline& Letter = FeedbackMsg.GetLetter(); Letter.PushPipe(*ExePipe); Requester().PushMsgToSend(FeedbackMsg); } return; } PushExecuterEvent(ExecuterID,SourceID,EventID); WriteLogDB(_T("Use Object Event:%I64ld"),EventID); CMsg NewMsg(MSG_OBJECT_RUN,NULL,EventID); ePipeline& NewLetter = NewMsg.GetLetter(); NewLetter.PushPipe(*ExePipe); ExecuterLinker().PushMsgToSend(NewMsg); };
void CSpacePortal::OnRequestCloseObject(int64 SourceID,ePipeline& RequestInfo){ int64 EventID = RequestInfo.PopInt(); ePipeline* ObjectInfo = (ePipeline*)RequestInfo.GetData(0); ePipeline* ExePipe = (ePipeline*)RequestInfo.GetData(1); CObjectData Object(*ObjectInfo); //If it does not start the external organs, this is considered a normal close int64 ExecuterID = Object.m_ID; CLinker ExecuterLinker; GetLinker(ExecuterID,ExecuterLinker); if (!ExecuterLinker.IsValid()) { CLinker Requester; GetLinker(SourceID,Requester); if (Requester.IsValid()) { CMsg FeedbackMsg(MSG_TASK_FEEDBACK,NULL,EventID); ePipeline& Letter = FeedbackMsg.GetLetter(); Letter.PushPipe(*ExePipe); Requester().PushMsgToSend(FeedbackMsg); } return; } PushExecuterEvent(ExecuterID,SourceID,EventID); WriteLogDB(_T("Close Object Event:%I64ld"),EventID); CMsg NewMsg(MSG_OBJECT_CLOSE,NULL,EventID); ePipeline& NewLetter = NewMsg.GetLetter(); NewLetter.PushPipe(*ExePipe); ExecuterLinker().PushMsgToSend(NewMsg); }
void CBrainMemory::RegisterGlobalObject(ePipeline& ObjectData){ tstring& Name = *(tstring*)ObjectData.GetData(0); // tstring& Fingerprint = *(tstring*)ObjectData.GetData(2); _tcslwr(&Name[0]); // _tcsupr(&Fingerprint[0]); CLock lk(&m_MemoryMutex); map<tstring,ePipeline>::iterator It = m_GlobalObjectList.find(Name); if(It!=m_GlobalObjectList.end()){ return; }; m_GlobalObjectList[Name] = ObjectData; };
void CDebugView::Reset(ePipeline& ItemList){ DeleteAll(); m_Toolbar.m_Owner = NULL; m_SpaceFocused = NULL; Layout(); m_TaskTimeStamp = ItemList.GetID(); if(ItemList.Size()==0){ return; }; ePipeline* TaskPipe = (ePipeline*)ItemList.GetData(0); MassItem* Task = new MassItem; PushChild(Task); Task->Init(*TaskPipe); Task->m_Alias = 1; //任务ID是一个64位整数,显示不方便,这里改为1 Layout(); return ; };
void CSpacePortal::OnRequestStartObject(int64 SourceID,ePipeline& RequestInfo){ int64 EventID = RequestInfo.PopInt(); ePipeline* ObjectInfo = (ePipeline*)RequestInfo.GetData(0); ePipeline* ExePipe = (ePipeline*)RequestInfo.GetData(1); CObjectData Object(*ObjectInfo); ePipeline AddrData = Object.m_Address; assert(Object.m_ID != 0); //Checks whether the specified object addresses is valid SpaceAddress Address = FindChildSpace(AddrData,Object.m_Fingerprint); if (!Address.IsValid()) { CLinker Requester; GetLinker(SourceID,Requester); if (Requester.IsValid()) { CMsg FeedbackMsg(MSG_TASK_FEEDBACK,NULL,EventID); ePipeline& Letter = FeedbackMsg.GetLetter(); ExePipe->SetID(RETURN_ERROR); ExePipe->GetLabel() = Format1024(_T("Error: object address invalid")); Letter.PushPipe(*ExePipe); Requester().PushMsgToSend(FeedbackMsg); } return; } //Need to open the corresponding DLL object in advance, in order to determine the type of executer //CSpace Space(Address.ParentID,Address.ChildID); AddrData = Object.m_Address; tstring FilePath = SpacePath2FileAddress(AddrData); tstring ObjectName = GetFileName(Object.m_Name); //不含扩展名 FilePath += _T("\\")+ObjectName; FilePath += _T("\\")+Object.m_Name; Dll_Object TempDll(Object.m_ID,FilePath); if (!TempDll.IsValid()) { int32 error = ::GetLastError(); ExePipe->SetID(RETURN_ERROR); ExePipe->GetLabel() = Format1024(_T("Load object fail: <%s>"),FilePath.c_str()); CLinker Requester; GetLinker(SourceID,Requester); if (Requester.IsValid()) { CMsg FeedbackMsg(MSG_TASK_FEEDBACK,NULL,EventID); ePipeline& Letter = FeedbackMsg.GetLetter(); Letter.PushPipe(*ExePipe); Requester().PushMsgToSend(FeedbackMsg); } return ; } DLL_TYPE DllType = TempDll.GetDllType(); tstring ExecuterFile; switch (DllType) { case DLL_VC6: { ExecuterFile = _T("EXE_VC6.EXE"); } break; case DLL_VC6D: { ExecuterFile = _T("EXE_VC6D.EXE"); } break; case DLL_VC10: { ExecuterFile = _T("EXE_VC10.EXE"); } break; case DLL_VC10D: { ExecuterFile = _T("EXE_VC10D.EXE"); } break; default: { ExePipe->GetLabel() = Format1024(_T("Error: dll type not support:%d"),(int)DllType); ExePipe->SetID(RETURN_ERROR); CLinker Requester; GetLinker(SourceID,Requester); if (Requester.IsValid()) { CMsg FeedbackMsg(MSG_TASK_FEEDBACK,NULL,EventID); ePipeline& Letter = FeedbackMsg.GetLetter(); Letter.PushPipe(*ExePipe); Requester().PushMsgToSend(FeedbackMsg); } return; } } //start a executer int64 ExeSourceID = Object.m_ID; //ExecuterID is equal to the external object instance ID bool ret = StartExecuter(ExeSourceID,ExecuterFile); if (!ret) { ExePipe->GetLabel() = Format1024(_T("Error: Executer start fail.")); ExePipe->SetID(RETURN_ERROR); CLinker Requester; GetLinker(SourceID,Requester); if (Requester.IsValid()) { CMsg FeedbackMsg(MSG_TASK_FEEDBACK,NULL,EventID); ePipeline& Letter = FeedbackMsg.GetLetter(); Letter.PushPipe(*ExePipe); Requester().PushMsgToSend(FeedbackMsg); } return; } RegisterExecuterUser(SourceID,ExeSourceID); CLinker ExecuterLinker; GetLinker(ExeSourceID,ExecuterLinker); //Register a start external object event PushExecuterEvent(ExeSourceID,SourceID,EventID); WriteLogDB(_T("Start Object Event:%I64ld"),EventID); //send execute msg CMsg NewMsg(MSG_OBJECT_START,NULL,EventID); ePipeline& NewLetter = NewMsg.GetLetter(); NewLetter.PushString(FilePath); NewLetter.PushPipe(*ExePipe); ExecuterLinker().PushMsgToSend(NewMsg); };
void CPipeView::PrintPipe(ePipeline& Pipe,int32 TabNum/*=0*/) { TCHAR buffer[200]; int i; int size = Pipe.Length(); int Tab=TabNum; for(i=0; i<Tab; i++){ buffer[i]=_T('\t'); } //限制嵌套数目 if(Tab>90){ throw std::exception("WARNING: Nest Pipe too much, end View"); } tstring PipeLabel = Pipe.m_Label; _stprintf(buffer+Tab,_T("Pipe<%s>: %d Data\n"),PipeLabel.c_str(), Pipe.Size()); m_Result.PushString(buffer); Tab = ++TabNum; for(i=0; i<Tab; i++){ buffer[i]=_T('\t'); } for(i=0; i<size; i++){ uint32 Type = Pipe.GetDataType(i); switch(Type){ case TYPE_NULL: { _stprintf(buffer+Tab,_T("%03d NULL\n"),i); m_Result.PushString(buffer); } break; case TYPE_INT: { int64* value=(int64 *)Pipe.GetData(i); _stprintf(buffer+Tab,_T("%03d INT64: %I64ld\n"),i, *value); m_Result.PushString(buffer); } break; case TYPE_FLOAT: { float64* value=(float64 *)Pipe.GetData(i); _stprintf(buffer+Tab,_T("%03d FLOAT64: %f\n"),i, *value); m_Result.PushString(buffer); } break; case TYPE_STRING: { tstring* value=(tstring *)Pipe.GetData(i); _stprintf(buffer+Tab,_T("%03d STRING:"),i); //MBPrintf("test1","%s",value->c_str()); tstring s(buffer); s +=(*value); s +=_T('\n'); m_Result.PushString(s); //MBPrintf("test","size=%d",Result.Size()); } break; case TYPE_PIPELINE: { ePipeline* value=(ePipeline *)Pipe.GetData(i); //如果不用PipeNum++而用t++,导致t增大不能恢复,中间形成空格,之后打印的数据不可见 PrintPipe(*value,TabNum); } break; } } TabNum--; }