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); }
/** * 发送文本消息. * @return 是否发送数据 */ bool DialogPeer::SendTextMsg() { static uint32_t count = 0; GtkWidget *textview; GtkTextBuffer *buffer; GtkTextIter start, end, piter, iter; GdkPixbuf *pixbuf; char buf[MAX_UDPLEN]; gchar *chipmsg, *ptr; pthread_t pid; size_t len; MsgPara *para; ChipData *chip; GSList *dtlist; /* 考察缓冲区内是否存在数据 */ textview = GTK_WIDGET(g_datalist_get_data(&widset, "input-textview-widget")); gtk_widget_grab_focus(textview); //为下一次任务做准备 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); gtk_text_buffer_get_bounds(buffer, &start, &end); if (gtk_text_iter_equal(&start, &end)) return false; /* 一些初始化工作 */ buf[0] = '\0'; //缓冲区数据为空 ptr = buf; len = 0; dtlist = NULL; //数据链表为空 /* 获取数据 */ piter = iter = start; //让指针指向缓冲区开始位置 do { /** * @note 由于gtk_text_iter_forward_find_char()会跳过当前字符, * 所以必须先考察第一个字符是否为图片. */ if ( (pixbuf = gtk_text_iter_get_pixbuf(&iter))) { /* 读取图片之前的字符数据,并写入缓冲区 */ chipmsg = gtk_text_buffer_get_text(buffer, &piter, &iter, FALSE); snprintf(ptr, MAX_UDPLEN - len, "%s%c", chipmsg, OCCUPY_OBJECT); len += strlen(ptr); ptr = buf + len; g_free(chipmsg); piter = iter; //移动 piter 到新位置 /* 保存图片 */ chipmsg = g_strdup_printf("%s" IPTUX_PATH "/%" PRIx32, g_get_user_config_dir(), count++); gdk_pixbuf_save(pixbuf, chipmsg, "bmp", NULL, NULL); /* 新建一个碎片数据(图片),并加入数据链表 */ chip = new ChipData; chip->type = MESSAGE_CONTENT_TYPE_PICTURE; chip->data = chipmsg; dtlist = g_slist_append(dtlist, chip); } } while (gtk_text_iter_forward_find_char(&iter, GtkTextCharPredicate(giter_compare_foreach), GUINT_TO_POINTER(ATOM_OBJECT), &end)); /* 读取余下的字符数据,并写入缓冲区 */ chipmsg = gtk_text_buffer_get_text(buffer, &piter, &end, FALSE); snprintf(ptr, MAX_UDPLEN - len, "%s", chipmsg); g_free(chipmsg); /* 新建一个碎片数据(字符串),并加入数据链表 */ chip = new ChipData; chip->type = MESSAGE_CONTENT_TYPE_STRING; chip->data = g_strdup(buf); dtlist = g_slist_prepend(dtlist, chip); //保证字符串先被发送 /* 清空缓冲区并发送数据 */ gtk_text_buffer_delete(buffer, &start, &end); FeedbackMsg(dtlist); para = PackageMsg(dtlist); pthread_create(&pid, NULL, ThreadFunc(ThreadSendTextMsg), para); pthread_detach(pid); /* g_slist_foreach(dtlist, GFunc(glist_delete_foreach), CHIP_DATA); */ /* g_slist_free(dtlist); */ return true; }
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); };