//---ファイルからメッセージを表示 void CrMesManager::FileMessage(eistr *name,int number,int scene /*= 1*/,int window /*= 0*/) { crfieldDrawField(1); CreateNewMessage(window); OpenMessage(name,number,window); SeekScene(scene,window); ReadMessageAll(window); // Draw(); // WaitKey(); CloseMessage(window); }
static uint32_t _module_fetchmail_run(TALLOC_CTX *mem_ctx, struct mapi_session *session) { enum MAPISTATUS retval; mapi_object_t obj_store; mapi_object_t obj_inbox; mapi_object_t obj_table; mapi_object_t obj_message; mapi_object_t obj_table_attach; mapi_object_t obj_attach; mapi_object_t obj_stream; uint64_t id_inbox = 0; struct SPropTagArray *SPropTagArray; struct SRowSet SRowSet; struct SRowSet SRowSet_attach; uint32_t i, j; uint32_t count; const uint8_t *has_attach; const uint32_t *attach_num; uint16_t read_size; unsigned char buf[MAX_READ_SIZE]; /* Log onto the store */ memset(&obj_store, 0, sizeof(mapi_object_t)); memset(&obj_inbox, 0, sizeof(mapi_object_t)); memset(&obj_table, 0, sizeof(mapi_object_t)); memset(&obj_message, 0, sizeof(mapi_object_t)); memset(&obj_table_attach, 0, sizeof(mapi_object_t)); memset(&obj_attach, 0, sizeof(mapi_object_t)); memset(&obj_stream, 0, sizeof(mapi_object_t)); mapi_object_init(&obj_store); retval = OpenMsgStore(session, &obj_store); if (retval) { mapi_errstr("OpenMsgStore", GetLastError()); return OCSIM_ERROR; } /* Open default receive folder (Inbox) */ retval = GetReceiveFolder(&obj_store, &id_inbox, NULL); if (retval) { mapi_errstr("GetReceiveFolder", GetLastError()); return OCSIM_ERROR; } retval = OpenFolder(&obj_store, id_inbox, &obj_inbox); if (retval) { mapi_errstr("OpenFolder", GetLastError()); return OCSIM_ERROR; } /* Open the contents table and customize the view */ mapi_object_init(&obj_table); retval = GetContentsTable(&obj_inbox, &obj_table, 0, &count); if (retval) { mapi_errstr("GetContentsTable", GetLastError()); return OCSIM_ERROR; } SPropTagArray = set_SPropTagArray(mem_ctx, 0x5, PR_FID, PR_MID, PR_INST_ID, PR_INSTANCE_NUM, PR_SUBJECT); retval = SetColumns(&obj_table, SPropTagArray); MAPIFreeBuffer(SPropTagArray); if (retval) { mapi_errstr("SetColumns", GetLastError()); return OCSIM_ERROR; } /* Retrieve the messages and attachments */ while ((retval = QueryRows(&obj_table, count, TBL_ADVANCE, &SRowSet)) != MAPI_E_NOT_FOUND && SRowSet.cRows) { count -= SRowSet.cRows; for (i = 0; i < SRowSet.cRows; i++) { mapi_object_init(&obj_message); retval = OpenMessage(&obj_store, SRowSet.aRow[i].lpProps[0].value.d, SRowSet.aRow[i].lpProps[0].value.d, &obj_message, 0); if (GetLastError() == MAPI_E_SUCCESS) { struct SPropValue *lpProps; struct SRow aRow; SPropTagArray = set_SPropTagArray(mem_ctx, 0x1, PR_HASATTACH); lpProps = talloc_zero(mem_ctx, struct SPropValue); retval = GetProps(&obj_message, 0, SPropTagArray, &lpProps, &count); MAPIFreeBuffer(SPropTagArray); if (retval) { mapi_errstr("GetProps", GetLastError()); return OCSIM_ERROR; } aRow.ulAdrEntryPad = 0; aRow.cValues = count; aRow.lpProps = lpProps; retval = fetchmail_get_contents(mem_ctx, &obj_message); has_attach = (const uint8_t *) get_SPropValue_SRow_data(&aRow, PR_HASATTACH); if (has_attach && *has_attach) { mapi_object_init(&obj_table_attach); retval = GetAttachmentTable(&obj_message, &obj_table_attach); if (retval == MAPI_E_SUCCESS) { SPropTagArray = set_SPropTagArray(mem_ctx, 0x1, PR_ATTACH_NUM); retval = SetColumns(&obj_table_attach, SPropTagArray); if (retval != MAPI_E_SUCCESS) return retval; MAPIFreeBuffer(SPropTagArray); retval = QueryRows(&obj_table_attach, 0xA, TBL_ADVANCE, &SRowSet_attach); if (retval != MAPI_E_SUCCESS) return retval; for (j = 0; j < SRowSet_attach.cRows; j++) { attach_num = (const uint32_t *) find_SPropValue_data(&(SRowSet_attach.aRow[j]), PR_ATTACH_NUM); mapi_object_init(&obj_attach); retval = OpenAttach(&obj_message, *attach_num, &obj_attach); if (retval == MAPI_E_SUCCESS) { struct SPropValue *lpProps2; uint32_t count2; SPropTagArray = set_SPropTagArray(mem_ctx, 0x3, PR_ATTACH_FILENAME, PR_ATTACH_LONG_FILENAME, PR_ATTACH_SIZE); lpProps2 = talloc_zero(mem_ctx, struct SPropValue); retval = GetProps(&obj_attach, 0, SPropTagArray, &lpProps2, &count2); MAPIFreeBuffer(SPropTagArray); if (retval != MAPI_E_SUCCESS) { MAPIFreeBuffer(lpProps2); return retval; } MAPIFreeBuffer(lpProps2); mapi_object_init(&obj_stream); retval = OpenStream(&obj_attach, PR_ATTACH_DATA_BIN, 0, &obj_stream); if (retval != MAPI_E_SUCCESS) return retval; read_size = 0; do { retval = ReadStream(&obj_stream, buf, MAX_READ_SIZE, &read_size); if (retval != MAPI_E_SUCCESS) break; } while (read_size); mapi_object_release(&obj_stream); mapi_object_release(&obj_attach); } } } } MAPIFreeBuffer(lpProps); } mapi_object_release(&obj_message); }
icalcomponent * _Exchange2Ical(mapi_object_t *obj_folder, struct exchange2ical_check *exchange2ical_check) { TALLOC_CTX *mem_ctx; enum MAPISTATUS retval; int ret; struct SRowSet SRowSet; struct SRow aRow; struct SRow aRowT; struct SPropValue *lpProps; struct SPropTagArray *SPropTagArray = NULL; struct exchange2ical exchange2ical; mapi_object_t obj_table; uint32_t count; int i; mem_ctx = talloc_named(mapi_object_get_session(obj_folder), 0, "exchange2ical"); exchange2ical_init(mem_ctx, &exchange2ical); /* Open the contents table */ mapi_object_init(&obj_table); retval = GetContentsTable(obj_folder, &obj_table, 0, &count); if (retval != MAPI_E_SUCCESS){ talloc_free(mem_ctx); return NULL; } OC_DEBUG(0, "MAILBOX (%d appointments)", count); if (count == 0) { talloc_free(mem_ctx); return NULL; } SPropTagArray = set_SPropTagArray(mem_ctx, 0x2, PR_FID, PR_MID); retval = SetColumns(&obj_table, SPropTagArray); MAPIFreeBuffer(SPropTagArray); if (retval != MAPI_E_SUCCESS) { mapi_errstr("SetColumns", retval); talloc_free(mem_ctx); return NULL; } while ((retval = QueryRows(&obj_table, count, TBL_ADVANCE, TBL_FORWARD_READ, &SRowSet)) != MAPI_E_NOT_FOUND && SRowSet.cRows) { count -= SRowSet.cRows; for (i = (SRowSet.cRows-1); i >= 0; i--) { mapi_object_init(&exchange2ical.obj_message); retval = OpenMessage(obj_folder, SRowSet.aRow[i].lpProps[0].value.d, SRowSet.aRow[i].lpProps[1].value.d, &exchange2ical.obj_message, 0); if (retval != MAPI_E_NOT_FOUND) { SPropTagArray = set_SPropTagArray(mem_ctx, 0x30, PidLidGlobalObjectId, PidNameKeywords, PidLidRecurring, PidLidAppointmentRecur, PidLidAppointmentStateFlags, PidLidTimeZoneDescription, PidLidTimeZoneStruct, PidLidContacts, PidLidAppointmentStartWhole, PidLidAppointmentEndWhole, PidLidAppointmentSubType, PidLidOwnerCriticalChange, PidLidLocation, PidLidNonSendableBcc, PidLidAppointmentSequence, PidLidBusyStatus, PidLidIntendedBusyStatus, PidLidAttendeeCriticalChange, PidLidAppointmentReplyTime, PidLidAppointmentNotAllowPropose, PidLidAllowExternalCheck, PidLidAppointmentLastSequence, PidLidAppointmentSequenceTime, PidLidAutoFillLocation, PidLidAutoStartCheck, PidLidCollaborateDoc, PidLidConferencingCheck, PidLidConferencingType, PidLidDirectory, PidLidMeetingWorkspaceUrl, PidLidNetShowUrl, PidLidOnlinePassword, PidLidOrganizerAlias, PidLidReminderSet, PidLidReminderDelta, PidLidResponseStatus, PR_MESSAGE_CLASS_UNICODE, PR_SENSITIVITY, PR_BODY_UNICODE, PR_CREATION_TIME, PR_LAST_MODIFICATION_TIME, PR_IMPORTANCE, PR_RESPONSE_REQUESTED, PR_SUBJECT_UNICODE, PR_OWNER_APPT_ID, PR_SENDER_NAME, PR_SENDER_EMAIL_ADDRESS, PR_MESSAGE_LOCALE_ID ); retval = GetProps(&exchange2ical.obj_message, MAPI_UNICODE, SPropTagArray, &lpProps, &count); MAPIFreeBuffer(SPropTagArray); if (retval == MAPI_E_SUCCESS) { aRow.ulAdrEntryPad = 0; aRow.cValues = count; aRow.lpProps = lpProps; /*Get Vcal info if first event*/ if(i==(SRowSet.cRows-1)){ ret = exchange2ical_get_properties(mem_ctx, &aRow, &exchange2ical, VcalFlag); /*TODO: exit nicely*/ ical_component_VCALENDAR(&exchange2ical); } /*Get required properties to check if right event*/ ret = exchange2ical_get_properties(mem_ctx, &aRow, &exchange2ical, exchange2ical_check->eFlags); /*Check to see if event is acceptable*/ if (!checkEvent(&exchange2ical, exchange2ical_check, get_tm_from_FILETIME(exchange2ical.apptStartWhole))){ continue; } /*Set RecipientTable*/ retval = GetRecipientTable(&exchange2ical.obj_message, &exchange2ical.Recipients.SRowSet, &exchange2ical.Recipients.SPropTagArray); /*Set PR_BODY_HTML for x_alt_desc property*/ SPropTagArray = set_SPropTagArray(mem_ctx, 0x1, PR_BODY_HTML_UNICODE); retval = GetProps(&exchange2ical.obj_message, MAPI_UNICODE, SPropTagArray, &lpProps, &count); MAPIFreeBuffer(SPropTagArray); if (retval == MAPI_E_SUCCESS) { aRowT.ulAdrEntryPad = 0; aRowT.cValues = count; aRowT.lpProps = lpProps; exchange2ical.bodyHTML = (const char *)octool_get_propval(&aRowT, PR_BODY_HTML_UNICODE); } /*Get rest of properties*/ ret = exchange2ical_get_properties(mem_ctx, &aRow, &exchange2ical, (exchange2ical_check->eFlags | EntireFlag)); /*add new vevent*/ ical_component_VEVENT(&exchange2ical); /*Exceptions to event*/ if(exchange2ical_check->eFlags != EventFlag){ ret = exchange2ical_exception_from_EmbeddedObj(&exchange2ical, exchange2ical_check); if (ret){ ret=exchange2ical_exception_from_ExceptionInfo(&exchange2ical, exchange2ical_check); } } /*REMOVE once globalobjid is fixed*/ exchange2ical.idx++; MAPIFreeBuffer(lpProps); exchange2ical_reset(&exchange2ical); } } mapi_object_release(&exchange2ical.obj_message); } } icalcomponent *icalendar = exchange2ical.vcalendar; exchange2ical_clear(&exchange2ical); /* Uninitialize MAPI subsystem */ mapi_object_release(&obj_table); talloc_free(mem_ctx); return icalendar; }
BOOL CNetRssProtocol::SendNet_StatusExch(const char* szRec,const char* szProtocol) { if(CString(szProtocol)=="sms"){ return 1; } if(objSettings.lRSSLocUser){ if(isScreenSaverActiveOrCLocked()){ return -1; } } CString szRecipient=GetCompNameNoProtocol(szRec); int iPerson=objSettings.AddrBook.FindPersonByIP(szRecipient,TRUE); if(iPerson!=-1){ if(objSettings.AddrBook.aPersons[iPerson]->IsGroup()){ // Групповой-заблокирован return -1; }; } CWebWorld url; CString sRSS=url.GetWebPage(szRecipient); if(sRSS==""){ // Не доступен return -1; } #ifdef _DEBUG CString sFile=CString("lastblog")+szRecipient+".xml";//http://davydov.blogspot.com/atom.xml MakeSafeFileName(sFile); SaveFile(CString("c://")+sFile,sRSS); #endif int iStatus=1; XDoc* feedDoc=parseXML(sRSS); XNode* feed=0; if(feedDoc){ feed=feedDoc->GetRoot(); if(!feed){ delete feedDoc; return -1; } CString sLnewsBuildDate=aLoadedRss[szRecipient]; int iMaxNews=objSettings.dwProtocolRSSMAxNews; if(sLnewsBuildDate==""){ iMaxNews=5; } CString sLnewsBuildDateToSet=""; BOOL bAtom=0; CString sGlobalTitle; if(feed->GetChild("channel",1)==GetEmptyNode() && feed->GetChild("title",1)!=GetEmptyNode()){ // Atom!!! bAtom=1; sGlobalTitle=feed->GetChild("title",1)->value; }else{ sGlobalTitle=feed->GetChild("channel",1)->GetChild("title",1)->value; } CString sFrom=""; if(iPerson!=-1){ sFrom=objSettings.AddrBook.aPersons[iPerson]->GetTitle(); }else{ sFrom=sGlobalTitle+"/rss"; } CXMLNodes feedItems; if(bAtom){ feed->FindByTagName("entry",FALSE,feedItems); }else{ feed->GetChild("channel",1)->FindByTagName("item",FALSE,feedItems); } int iCount=0; int iLenCount=feedItems.GetSize(); if(iLenCount==0){ // Может rdf??? feed->FindByTagName("item",FALSE,feedItems); iLenCount=feedItems.GetSize(); } CString sSummary; while(iCount<iLenCount && iCount<iMaxNews){ XNode* item=feedItems[iCount]; CString sPubDate; if(bAtom){ sPubDate=item->GetChild("issued",1)->value; }else{ sPubDate=item->GetChild("pubDate",1)->value; if(sPubDate==""){ //rdf??? sPubDate=item->GetChild("dc:date",1)->value; } } //sPubDate=UnescapeString(sPubDate); StripTags(sPubDate); DeEntitize(sPubDate); CString sTitle; sTitle=item->GetChild("title",1)->value; //sTitle=UnescapeString(sTitle); StripTags(sTitle); DeEntitize(sTitle); if(sTitle==""){ sTitle=sGlobalTitle; } CString sAuthor; if(bAtom){ LPXNode pAut; pAut=item->GetChild("author",1); if(pAut->iBeginPos!=-1 && pAut->iEndPos!=-1){ sAuthor=sRSS.Mid(pAut->iBeginPos,pAut->iEndPos-pAut->iBeginPos); } }else{ sAuthor=item->GetChild("author",1)->value; if(sAuthor==""){ //rdf??? sAuthor=item->GetChild("dc:creator",1)->value; } } //sAuthor=UnescapeString(sAuthor); StripTags(sAuthor); DeEntitize(sAuthor); if(sAuthor!=""){ sTitle+=" ("; sTitle+=sAuthor; sTitle+=")"; } LPXNode pDesk; if(bAtom){ pDesk=item->GetChild("content",1); }else{ pDesk=item->GetChild("description",1); } CString sDesk; if(pDesk->iBeginPos!=-1 && pDesk->iEndPos!=-1){ sDesk=sRSS.Mid(pDesk->iBeginPos,pDesk->iEndPos-pDesk->iBeginPos); } /* if(sDesk.Find("%20")!=-1){ sDesk=UnescapeString(sDesk); } */ CString sDeskL=sDesk; sDeskL.MakeLower(); if(sDeskL.Find(";div")!=-1 || sDeskL.Find(";span")!=-1){ // Для извращенных... DeEntitize(sDesk); StripTags(sDesk); }else{ // Это по правильному StripTags(sDesk); DeEntitize(sDesk); } sDesk.TrimLeft(); sDesk.TrimRight(); CString sLink; if(bAtom){ CXMLNodes feedLinks; item->FindByTagName("link",FALSE,feedLinks); for(int j=0;j<feedLinks.GetSize();j++){ XNode* itemLnk=feedLinks[j]; sLink=itemLnk->GetAttr("href")->value; CString sType=itemLnk->GetAttr("type")->value; sType.MakeLower(); if(sType.Find("text")!=-1){ break;// Наша линка! } } }else{ sLink=item->GetChild("link",1)->value; } sLink=UnescapeString(sLink); StripTags(sLink); DeEntitize(sLink); sLink.TrimLeft(); sLink.TrimRight(); { CSmartLock SL(&csRssFeeds,TRUE); CString sRnewsBuildDate=sLink+"\t"+sPubDate+" "+sTitle+" "+sDesk; if(sLnewsBuildDate==sRnewsBuildDate){ if(iCount==0){ iStatus=1; } break; } if(sLnewsBuildDateToSet==""){// Запомнили самую первую новость sLnewsBuildDateToSet=sRnewsBuildDate; } /* #ifdef _DEBUG else{ sDesk+="\nOld id-text:"+sLnewsBuildDate; sDesk+="\nNew id-text:"+sRnewsBuildDate; } #endif */ } if(sPubDate!=""){ COleDateTime dt; dt.ParseDateTime(sPubDate); if(dt.GetStatus()==COleDateTimeSpan::valid){ sTitle=dt.Format("%x %X. ")+sTitle; } } CString sNews=sTitle; sNews+="\n"; if(sDesk!=""){ sNews+="\n"; sNews+=sDesk; } if(sLink!=""){ sNews+="\n\n"; sNews+=_l("Read more")+": "; sNews+=sLink; } CDataXMLSaver::Xml2Str(sNews); if(objSettings.lRSSSummar){ sSummary+="\n"; sSummary+="\n"; sSummary+=sTitle; sSummary+="\n"; sSummary+=_l("Read more")+": "; sSummary+=sLink; }else{ CString sAttach=""; if(objSettings.dwProtocolRSSOType){ sAttach+=Format("["DEF_OPENTYPE"%i]",objSettings.dwProtocolRSSOType); } OpenMessage(sFrom,"",sNews,"",sAttach,sGlobalTitle); } iCount++; } if(sSummary!=""){ CString sAttach=""; if(objSettings.dwProtocolRSSOType){ sAttach+=Format("["DEF_OPENTYPE"%i]",objSettings.dwProtocolRSSOType); } sSummary.TrimLeft(); OpenMessage(sFrom,"",sSummary,"",sAttach,sGlobalTitle); } if(feedDoc){ delete feedDoc; } if(sLnewsBuildDateToSet!=""){ aLoadedRss.SetAt(szRecipient,sLnewsBuildDateToSet); } } if(iPerson!=-1){ objSettings.AddrBook.aPersons[iPerson]->iOnlineStatus=iStatus; RefreshUserStatusIcon(iPerson); } return 0; }
int main(int argc, char *argv[]) { enum MAPISTATUS retval; struct mapi_context *mapi_ctx; TALLOC_CTX *mem_ctx; struct mapi_session *session = NULL; mapi_object_t obj_store; mapi_object_t obj_folder; mapi_object_t obj_table; mapi_object_t obj_message; struct mapi_SPropValue_array props_all; struct SRowSet rowset; struct SPropTagArray *SPropTagArray; mapi_id_t id_inbox; mapi_id_t *fid, *mid; char *profname; char *profdb; uint32_t Numerator; uint32_t Denominator; uint32_t i; mem_ctx = talloc_named(NULL, 0, "fetchmail"); /* Initialize MAPI */ profdb = talloc_asprintf(mem_ctx, DEFAULT_PROFDB, getenv("HOME")); retval = MAPIInitialize(&mapi_ctx, profdb); MAPI_RETVAL_IF(retval, retval, mem_ctx); /* Find Default Profile */ retval = GetDefaultProfile(mapi_ctx, &profname); MAPI_RETVAL_IF(retval, retval, mem_ctx); /* Log on EMSMDB and NSPI */ retval = MapiLogonEx(mapi_ctx, &session, profname, NULL); MAPI_RETVAL_IF(retval, retval, mem_ctx); /* Open Message Store */ mapi_object_init(&obj_store); retval = OpenMsgStore(session, &obj_store); MAPI_RETVAL_IF(retval, retval, mem_ctx); /* Find Inbox default folder */ retval = GetDefaultFolder(&obj_store, &id_inbox, olFolderInbox); MAPI_RETVAL_IF(retval, retval, mem_ctx); /* Open Inbox folder */ mapi_object_init(&obj_folder); retval = OpenFolder(&obj_store, id_inbox, &obj_folder); MAPI_RETVAL_IF(retval, retval, mem_ctx); /* Retrieve Inbox content table */ mapi_object_init(&obj_table); retval = GetContentsTable(&obj_folder, &obj_table, 0x0, NULL); MAPI_RETVAL_IF(retval, retval, mem_ctx); /* Create the MAPI table view */ SPropTagArray = set_SPropTagArray(mem_ctx, 0x2, PR_FID, PR_MID); retval = SetColumns(&obj_table, SPropTagArray); MAPIFreeBuffer(SPropTagArray); MAPI_RETVAL_IF(retval, retval, mem_ctx); talloc_free(mem_ctx); /* Get current cursor position */ retval = QueryPosition(&obj_table, &Numerator, &Denominator); MAPI_RETVAL_IF(retval, retval, mem_ctx); /* Iterate through rows */ while ((retval = QueryRows(&obj_table, Denominator, TBL_ADVANCE, &rowset)) != -1 && rowset.cRows) { for (i = 0; i < rowset.cRows; i++) { fid = (mapi_id_t *)find_SPropValue_data(&(rowset.aRow[i]), PR_FID); mid = (mapi_id_t *)find_SPropValue_data(&(rowset.aRow[i]), PR_MID); mapi_object_init(&obj_message); retval = OpenMessage(&obj_store, *fid, *mid, &obj_message, 0x0); if (retval != MAPI_E_NOT_FOUND) { retval = GetPropsAll(&obj_message, MAPI_UNICODE, &props_all); mapidump_message(&props_all, NULL, &obj_message); mapi_object_release(&obj_message); } } } /* Release MAPI objects */ mapi_object_release(&obj_table); mapi_object_release(&obj_folder); Logoff(&obj_store); /* Uninitialize MAPI */ MAPIUninitialize(mapi_ctx); return (0); }
DWORD WINAPI NBMsgReciever(LPVOID lpdwstatus) { NBMsgRecData* pMsgData=(NBMsgRecData*)lpdwstatus; if(!pMsgData){ return 0; } int iRes=TRUE, nRes=0; UINT m_lsn=pMsgData->lsn; CNCB m_thisNCB(pMsgData->pParent->m_iLana); CString sReceivedMessage=""; char szMessageData[RECBUFFER_SIZE]=""; int iBlocksCount=0,iMesDataOffset=0; CString sTo, sFrom, sMessage; BYTE iMsgType=0; try{ while(TRUE){ char SMBBlock[255]=""; memset(SMBBlock,0,sizeof(SMBBlock)); nRes = m_thisNCB.Receive(m_lsn,(char *)SMBBlock,sizeof(SMBBlock)); if ( nRes != NRC_GOODRET){ objLog.AddMsgLogLine(DEFAULT_GENERALLOG,"Error while receiving netbios data block, err. #%i",nRes); // Возвращаемся чтобы показать хотябы часть //throw FALSE; break; } iBlocksCount++; UINT iReadedBytes=(UINT)m_thisNCB.GetLength(); // Смотрим что к нам пришло - сообщение или запрос о статусе или что-то неизвестное if(CheckSpecialMessages(pMsgData->pParent, SMBBlock, m_lsn, m_thisNCB, iMsgType)){ throw TRUE; } // Шлем подтверждение (3/5 ноля после SMB HEADER) char szReply[SMB_HEADER_SIZE+5]=""; char* szReplyData=SetSMBHeaderCommand(szReply,iMsgType,sizeof(szReply)); if(iMsgType==0xd5){ // Код сообщения - случайные два байта szReplyData[0]=rnd(1,5); szReplyData[1]=rnd(1,5); } m_thisNCB.Send(m_lsn,szReply,(iMsgType==0xd5)?SMB_HEADER_SIZE+5:SMB_HEADER_SIZE+3); // Действия в зависимости от типа сообщения if(iMsgType==0xd0){// Короткое сообщение, вытаскиваем данные и выходим... sFrom=(const char*)SMBBlock+SMB_HEADER_SIZE+4; int iFromOffset=strlen(sFrom); sTo=(const char*)SMBBlock+SMB_HEADER_SIZE+4+iFromOffset+2; int iToOffset=strlen(sTo); sMessage=(const char*)SMBBlock+SMB_HEADER_SIZE+4+iFromOffset+2+iToOffset+4; break; } if(iMsgType==0xd5){// Кусочковое сообщение, начало, Смотрим от кого и кому sFrom=(const char*)SMBBlock+SMB_HEADER_SIZE+4; int iFromOffset=strlen(sFrom); sTo=(const char*)SMBBlock+SMB_HEADER_SIZE+iFromOffset+4+2; } if(iMsgType==0xd7){// Кусочковое сообщение, блок с данными, Конкатенируем... int iConcatSize=iReadedBytes-SMB_HEADER_SIZE-8; if(iMesDataOffset+iConcatSize+3>RECBUFFER_SIZE){ // Буффер готов к переполнению, сбрасываем в выходную строку... szMessageData[iMesDataOffset]=0; sMessage+=szMessageData; iMesDataOffset=0; } memcpy(szMessageData+iMesDataOffset,SMBBlock+SMB_HEADER_SIZE+8,iConcatSize); iMesDataOffset+=iConcatSize; } if(iMsgType==0xd6){// Кусочковое сообщение, конец, Все получено, выходим break; } } // К этому моменту сообщение полностью получено if(iMsgType!=0xd0){ // Для кусочкового сообщения доберем данные из буфера szMessageData[iMesDataOffset]=0; sMessage+=szMessageData; iMesDataOffset=0; } // Открываем сообщение sFrom.OemToAnsi(); sFrom+="/nb"; sMessage.Replace("\r\n","\n"); sMessage.Replace("\x14","\n");// Специально для TrayPopup sMessage.OemToAnsi(); // Смотрим информацию о сессии CString sRealFrom; GetRealSender(pMsgData->pParent, m_lsn, m_thisNCB, sRealFrom); OpenMessage(sFrom,sTo,sMessage,sRealFrom); }catch(int e){ iRes=e; } m_thisNCB.Hangup(m_lsn); delete pMsgData; return iRes; }