elmimeviewer_mainform.pas

来自「著名的SecureBlackBox控件完整源码」· PAS 代码 · 共 1,038 行 · 第 1/3 页

PAS
1,038
字号
            NullNode := TTreeNodeInfo.Create(Node.Owner, tiError);
            TTreeNodesA(Node.Owner).AddNode(NullNode, NewNode, 'ERROR: '+e.Message, nil, naAddChild);
          end;
        end;
      end;
    end;
  end;
  {---------------------------------------------------------------------------}
  procedure AddBodyPartHandlerOnly(mp: TElMessagePart);
  begin
    if Assigned(mp) and Assigned(mp.MessageBodyPartHandler) then
    begin
      NewNode := TTreeNodeInfo.Create(Node.Owner, tiPartBodyHandler, mp, False);
      S := 'Body Handler: "'+mp.MessageBodyPartHandler.GetDescription+'"';
      TTreeNodesA(Node.Owner).AddNode(NewNode, NodeInfo, S, nil, naAddChild);
      if mp.MessageBodyPartHandler.IsError then
      begin
        NullNode := TTreeNodeInfo.Create(Node.Owner, tiError);
        TTreeNodesA(Node.Owner).AddNode(NullNode, NewNode,
          'ERROR: '+mp.MessageBodyPartHandler.ErrorText, nil, naAddChild);
      end
      else
      begin
        if Assigned(mp.MessageBodyPartHandler.DecodedPart) then
        begin
          NullNode := TTreeNodeInfo.Create(Node.Owner);
          TTreeNodesA(Node.Owner).AddNode(NullNode, NewNode, '...', nil, naAddChild);
        end;
        if mp.MessageBodyPartHandler.ResultCode = EL_WARNING then
        begin
          if mp.MessageBodyPartHandler.ErrorText<>'' then
            S := mp.MessageBodyPartHandler.ErrorText
          else
            S := 'Warning given when handling body of the message part';
          NullNode := TTreeNodeInfo.Create(Node.Owner, tiWarning);
          TTreeNodesA(Node.Owner).AddNode(NullNode, NewNode, 'WARNING: '+S, nil, naAddChild);
        end;
      end;
    end;
  end;
  {---------------------------------------------------------------------------}
  procedure AddHeadersInfoForMessagePart(mp: TElMessagePart);
  begin
    if Assigned(mp) and fOpHeaderInTree and (
      (mp.Header.FieldsCount > 0) or (mp.Header.MailAddressListCount>0) ) then
    begin
      NewNode := TTreeNodeInfo.Create(Node.Owner, tiHeaders, mp, False);
      TTreeNodesA(Node.Owner).AddNode(NewNode, NodeInfo, 'Headers', nil, naAddChild);
      if fOpFieldsInTree then
      begin
        NullNode := TTreeNodeInfo.Create(Node.Owner);
        TTreeNodesA(Node.Owner).AddNode(NullNode, NewNode, '...', nil, naAddChild);
      end;
    end;
  end;
  {---------------------------------------------------------------------------}
  procedure AddBodyInfoForMessagePart(mp: TElMessagePart);
  begin
    if Assigned(mp) and (fOpBodyInTree or mp.IsMultipart) then
    begin
      NewNode := TTreeNodeInfo.Create(Node.Owner, tiBody, mp, False);
      S := 'Body';
      TTreeNodesA(Node.Owner).AddNode(NewNode, NodeInfo, S, nil, naAddChild);
      if mp.IsMultipart and (mp.PartsCount>0) then
      begin
        NullNode := TTreeNodeInfo.Create(Node.Owner);
        TTreeNodesA(Node.Owner).AddNode(NullNode, NewNode, '...', nil, naAddChild);
        //NodeInfoChild := NewNode;
      end
      else
      begin
        S := mp.ContentType;
        if S<>'' then
          NewNode.Text := NewNode.Text + ' : [ '+S + '/' + mp.ContentSubtype+' ]';
        if mp.IsMessage then
        begin
          NullNode := TTreeNodeInfo.Create(Node.Owner);
          TTreeNodesA(Node.Owner).AddNode(NullNode, NewNode, '...', nil, naAddChild);
        end;
      end;
    end;
  end;
  {---------------------------------------------------------------------------}
  procedure AddMessageInfoForMessagePart(mp: TElMessagePart);
  begin
    if Assigned(mp) then
    begin
      // HEADERS
      AddHeadersInfoForMessagePart(mp);
      // BODY
      if not ( Assigned(mp) and Assigned(mp.MessageBodyPartHandler) ) then
        AddBodyInfoForMessagePart(mp);
      // PART HANDLER
      AddPartHandlerOnly(mp);
      // PART BODY HANDLER
      AddBodyPartHandlerOnly(mp);
    end;
  end;
  {---------------------------------------------------------------------------}
  procedure AddPartInfoForMessagePart(mp: TElMessagePart; PartIndex: Integer = -1);
  var
    ti: TTagInfo;
    sFile: String;
  begin
    if Assigned(mp) then
    begin
      // PART
      S := 'Part';
      if mp.IsMultipart then
        ti := tiPartList
      else
        ti := tiPart;
      if PartIndex>=0 then
        S := S + ' [ ' + IntToStr(PartIndex)+' ]';
      if mp.IsMultipart then
        S := S + ' / ['+mp.ContentType+'/'+mp.ContentSubtype+']'
      else
      if not mp.IsMultipart then
      begin
        sFile := Trim(mp.FileName);
        if Length(sFile) > 0 then
          S := S + ': "' + sFile + '"';
      end;
      NewNode := TTreeNodeInfo.Create(Node.Owner, ti, mp, False);
      TTreeNodesA(Node.Owner).AddNode(NewNode, NodeInfo, S, nil, naAddChild);
      NullNode := TTreeNodeInfo.Create(Node.Owner);
      TTreeNodesA(Node.Owner).AddNode(NullNode, NewNode, '...', nil, naAddChild);
    end;//of: if Assigned(mp) then
  end;
  {---------------------------------------------------------------------------}
  procedure AddPartListInfoForMessagePart(mp: TElMessagePart; PartIndex: Integer = -1);
  begin
    if Assigned(mp) then
    begin
      // HEADERS
      AddHeadersInfoForMessagePart(mp);
      // BODY
      if not ( Assigned(mp) and Assigned(mp.MessageBodyPartHandler) ) then
        AddBodyInfoForMessagePart(mp);
      // PART HANDLER
      AddPartHandlerOnly(mp);
      // PART BODY HANDLER
      AddBodyPartHandlerOnly(mp);
    end;//of: if Assigned(mp) then
  end;
  {---------------------------------------------------------------------------}
  procedure AddAtachedMessage(mp: TElMessagePart);
  var
    Buffer: TBytes;
    BufferSize: Integer;
    sm: TAnsiStringStream;
  begin
    mp.GetDataSize(BufferSize);
    SetLength(Buffer, BufferSize);
    mp.GetData(Buffer, BufferSize);
    sm := TAnsiStringStream.Create;
    try
      Node.Owner.Delete(NodeInfoChild); // !!!
      NodeInfoChild := nil;
      sm.Memory := Buffer;
      TElMessageThread.Create(Node, '', sm, dmElMime);
      sm := nil;
    finally
      sm.Free;
    end;
  end;
begin
  if Node is TTreeNodeInfo then
  begin
    NodeInfoChild := nil;
    NodeInfo := TTreeNodeInfo(Node);

    case NodeInfo.TagInfo of
//      tiNull:
//        AllowExpansion := False;
//      tiError,
//      tiWarning,
//      tiText,
      tiParsedMessage:
        begin
          AllowExpansion := Node.Count>0;
          if AllowExpansion then
          begin
            NodeInfoChild := Node.Item[0] as TTreeNodeInfo;
            if (NodeInfoChild.TagInfo = tiNull) and Assigned(NodeInfo.TagObj)
              and (NodeInfo.TagObj is TElMessageDemo)
            then
            begin
              md := TElMessageDemo(NodeInfo.TagObj);
              mp := md.MainPart;
              AddMessageInfoForMessagePart(mp);
              Node.Owner.Delete(NodeInfoChild);
              if Node.Count>0 then
                NodeInfoChild := Node.Item[0] as TTreeNodeInfo
              else
                NodeInfoChild := nil;
            end;//of: if NodeInfoChild.TagInfo = tiNull then
          end;//of: if AllowExpansion
        end;
//      tiAssembledMessage,
      tiHeaders:
        begin
          AllowExpansion := Node.Count>0;
          if AllowExpansion and fOpFieldsInTree then
          begin
            NodeInfoChild := Node.Item[0] as TTreeNodeInfo;
            if NodeInfoChild.TagInfo = tiNull then
            begin
              mp := NodeInfo.TagObj as TElMessagePart;
              if Assigned(mp) and ( (mp.Header.FieldsCount > 0)
                or (mp.Header.MailAddressListCount>0) )
              then
              begin
                iCount := 0;
                // MAIL ADDRESSES
                for i := 0 to mp.Header.MailAddressListCount-1 do
                begin
                  al := mp.Header.GetMailAddressList(i);
                  if (al = nil) or (al.TotalCount = 0) then
                    continue;

                  inc(iCount);
                  NewNode := TTreeNodeInfo.Create(Node.Owner, tiFromList, al, False);
                  S := Trim(al.FieldName);
                  if S = '' then
                    S := 'unnamed_'+IntToStr(iCount);
                  TTreeNodesA(Node.Owner).AddNode(NewNode, NodeInfo, S, nil, naAddChild);
                  for k:=0 to al.Count-1 do
                  begin
                    ma := al.GetAddress(k);
                    if ma=nil then
                      continue;
                    if ma.IsAlias then
                      S := '"' + ma.Alias + '"'
                    else
                      S := '';
                    if ma.IsAddress then
                      S := S + '<'+ma.Address+'>';
                    if S='' then
                      S := '<>';
                    NullNode := TTreeNodeInfo.Create(Node.Owner, tiFrom);
                    NullNode.Level := k;
                    TTreeNodesA(Node.Owner).AddNode(NullNode, NewNode, S, nil, naAddChild);
                  end;

                  //{
                  // todo:
                  // GROUPS
                  for g := 0 to al.GroupsCount-1 do
                  begin
                    ag := al.GetGroup(g);
                    if ag=nil then
                      continue;
                    tmpNode := TTreeNodeInfo.Create(Node.Owner, tiGroup);
                    TTreeNodesA(Node.Owner).AddNode(tmpNode, NewNode, ag.Name, nil, naAddChild);
                    //tmpNode
                    for ig := 0 to ag.AddressesCount-1 do
                    begin
                      ma := ag.Address[ig];
                      if ma=nil then
                        continue;

                      if ma.IsAlias then
                        S := '"' + ma.Alias + '"'
                      else
                        S := '';
                      if ma.IsAddress then
                        S := S + '<'+ma.Address+'>';
                      if S='' then
                        S := '<>';
                      NullNode := TTreeNodeInfo.Create(tmpNode.Owner, tiFrom);
                      NullNode.Level := ig;
                      TTreeNodesA(Node.Owner).AddNode(NullNode, tmpNode, S, nil, naAddChild);
                    end;
                  end;
                  {}

                end;// of: for i
                // HEADERDS
                for i:=0 to mp.Header.FieldsCount do
                begin
                  f := mp.Header.GetField(i);
                  if f=nil then
                    continue;
                  inc(iCount);
                  NewNode := TTreeNodeInfo.Create(Node.Owner, tiField, f, False);
                  S := Trim(f.Name);
                  if S = '' then
                    S := 'unnamed_'+IntToStr(iCount);
                  TTreeNodesA(Node.Owner).AddNode(NewNode, NodeInfo, S, nil, naAddChild);
                  NullNode := TTreeNodeInfo.Create(Node.Owner, tiText);
                  NullNode.ImageIndex := NewNode.ImageIndex + 1;
                  NullNode.SelectedIndex := NullNode.ImageIndex;
                  TTreeNodesA(Node.Owner).AddNode(NullNode, NewNode, f.Value, nil, naAddChild);

                  if f.Comments<>'' then
                  begin
                    NullNode := TTreeNodeInfo.Create(Node.Owner, tiComment, f, False);
                    TTreeNodesA(Node.Owner).AddNode(NullNode, NewNode, 'Comments', nil, naAddChild);
                    tmpNode := TTreeNodeInfo.Create(Node.Owner, tiText);
                    tmpNode.ImageIndex := NewNode.ImageIndex + 4;
                    tmpNode.SelectedIndex := tmpNode.ImageIndex;
                    TTreeNodesA(Node.Owner).AddNode(tmpNode, NullNode, f.Comments, nil, naAddChild);
                  end;

                  if fOpParamsInTree and (f.ParamsCount>0) then
                  begin
                    NullNode := TTreeNodeInfo.Create(Node.Owner, tiParamList, f, False);
                    NullNode.ImageIndex := NewNode.ImageIndex + 2;
                    NullNode.SelectedIndex := NullNode.ImageIndex;
                    TTreeNodesA(Node.Owner).AddNode(NullNode, NewNode, 'Params', nil, naAddChild);
                    NewNode := NullNode;
                    for k:=0 to f.ParamsCount-1 do
                    begin
                      NullNode := TTreeNodeInfo.Create(Node.Owner, tiParam);
                      NullNode.Level := k;
                      NullNode.ImageIndex := NewNode.ImageIndex + 1;
                      NullNode.SelectedIndex := NullNode.ImageIndex;
                      TTreeNodesA(Node.Owner).AddNode(NullNode, NewNode, f.GetParamName(k), nil, naAddChild);
                      tmpNode := TTreeNodeInfo.Create(Node.Owner, tiText);
                      tmpNode.ImageIndex := NewNode.ImageIndex + 2;
                      tmpNode.SelectedIndex := tmpNode.ImageIndex;
                      TTreeNodesA(Node.Owner).AddNode(tmpNode, NullNode, f.GetParamValue(k), nil, naAddChild);
                    end;
                  end;
                end;//of: for i:=0

                Node.Owner.Delete(NodeInfoChild);
                if iCount>0 then
                  NodeInfoChild := Node.Item[0] as TTreeNodeInfo
                else
                  NodeInfoChild := nil;
              end;//of: if Assigned(mp) and (...
            end;//of: if NodeInfoChild.TagInfo = tiNull
          end;//of: if AllowExpansion
        end;
      //tiField, tiParamList, tiParam,
      tiBody:
        begin
          AllowExpansion := Node.Count>0;
          if AllowExpansion then
          begin
            NodeInfoChild := Node.Item[0] as TTreeNodeInfo;
            if NodeInfoChild.TagInfo = tiNull then
            begin
              mp := NodeInfo.TagObj as TElMessagePart;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?