sources/TASIPKeyPane.cp

//  TASIPKeyPane.cp - AppleShare IP Dialog Pane Object
//
// Apple Macintosh Developer Technical Support
// Written by:  Vinnie Moscaritolo
//
//  Copyright (work in progress)  Apple Computer, Inc All rights reserved.
//
// You may incorporate this sample code into your applications without
// restriction, though the sample code has been provided "AS IS" and the
// responsibility for its operation is 100% yours.  However, what you are
// not permitted to do is to redistribute the source as "DSC Sample Code"
// after having made changes. If you're going to re-distribute the source,
// we require that you make it clear in the source that the code was
// descended from Apple Sample Code, but that you've made changes.
// 
 
#include <Appearance.h>
#include <Drag.h>
 
#include "TASIPKeyPane.h"
#include "TPGPException.h"
 
static enum{
    kServerAuthPaneDITL = 140,
};
 
enum {
    kKeyDragBox  = 1 ,
    kKeyInfoBox  ,
    kKeyErrorBox,       // 15
    kKeyDetailsBox,     // --       
    kKeyNameTitle,      // 36
    kKeyName,           // 27
    kKeyTypeTitle,      // --
    kKeyTypeData,       // 21
    kKeySizeTitle,      // 16
    kKeySizeData,       // 22
    kTrustBox,          // 17
    kCreateTitle,       // 18
    kCreateDate ,       // 24
    kExpiresTitle,      // 19    expires
    kExpireDate ,       
    kValidTitle,        
    kValidValue ,       
    kUnTrustTitle, 
    kFPBox,      
    kFingerprint,    
    kTrustedTitle,       
    kInvalidTitle,       
    kTrustValue,        
    kExpiredIcon            
};
 
 
#define kKeyStringsID 129 
static enum {
    kKeyNameStrID   =1,
    kKeyIDStrID ,
    kKeyTypeStrID,
    kKeySizeStrID,
    kKeyCreatedStrID,
    kKeyExpiresStrID,
    kKeyExpiredStrID,
    kKeyRevokedStrID,
    kKeyInvalidStrID,
    kKeyValidStrID,
    kKeyTrustedStrID,
    kKeyUnTrustedStrID,
    kKeyServerKeyIsEnabled,
    kKeyServerKeyIsDisabled,
    kKeyServerKeyIsRevoked,
    kKeyServerKeyIsExpired,
    kKeyServerKeyNotFound,
    
    };
    
        
// ---------------------------------------------------------------------------
#pragma mark Local Prototypes
// ---------------------------------------------------------------------------
    static pascal OSErr KeyDragSendDataProc (FlavorType flavorType, void *context, ItemReference itemRef, DragReference dragRef);
 
#pragma mark -
 
// ---------------------------------------------------------------------------
TASIPKeyPane::TASIPKeyPane( DialogPtr dialog, SInt16 items, TASIPPGPkey* serverKey)
                    : TPane (dialog, items) 
// ---------------------------------------------------------------------------
//
{   
    ControlFontStyleRec fontInfo;
    ControlHandle       theControl; 
    Str255              text;
 
    fKey = serverKey;
    
    AppendDialogItemList(dialog, kServerAuthPaneDITL, overlayDITL );
 
    fontInfo.just = teJustRight;
    fontInfo.flags = kControlUseFontMask | kControlUseJustMask;
    fontInfo.font  = kControlFontSmallBoldSystemFont;
 
    // Key Name
    GetIndString(text, kKeyStringsID,kKeyNameStrID);
    GetDialogItemAsControl( dialog, items + kKeyNameTitle, &theControl );
    SetControlData( theControl, 0, kControlStaticTextTextTag, text[0], (Ptr)(text+1));
    SetControlData( theControl, 0, kControlStaticTextStyleTag, sizeof fontInfo, (Ptr)&fontInfo);
 
    // Key Type
    GetIndString(text, kKeyStringsID,kKeyTypeStrID);
    GetDialogItemAsControl( dialog,  items +  kKeyTypeTitle, &theControl );
    SetControlData( theControl, 0, kControlStaticTextTextTag, text[0], (Ptr)(text+1));
    SetControlData( theControl, 0, kControlStaticTextStyleTag, sizeof fontInfo, (Ptr)&fontInfo);
 
    // Key Size
    GetIndString(text, kKeyStringsID,kKeySizeStrID);
    GetDialogItemAsControl( dialog,  items + kKeySizeTitle, &theControl );
    SetControlData( theControl, 0, kControlStaticTextTextTag, text[0], (Ptr)(text+1));
    SetControlData( theControl, 0, kControlStaticTextStyleTag, sizeof fontInfo, (Ptr)&fontInfo);
 
    // Key Creation
    GetIndString(text, kKeyStringsID,kKeyCreatedStrID);
    GetDialogItemAsControl( dialog,  items + kCreateTitle, &theControl );
    SetControlData( theControl, 0, kControlStaticTextTextTag, text[0], (Ptr)(text+1));
    SetControlData( theControl, 0, kControlStaticTextStyleTag, sizeof fontInfo, (Ptr)&fontInfo);
 
    // Key Expiration
    GetIndString(text, kKeyStringsID, kKeyExpiresStrID);
    GetDialogItemAsControl( dialog,  items + kExpiresTitle, &fKeyExpiresTitle ); 
    SetControlData( fKeyExpiresTitle, 0, kControlStaticTextTextTag, text[0], (Ptr)(text+1));
    SetControlData( fKeyExpiresTitle, 0, kControlStaticTextStyleTag, sizeof fontInfo, (Ptr)&fontInfo);
 
    fontInfo.font = kControlFontSmallSystemFont;
 
    // Trust Model
    GetIndString(text, kKeyStringsID,kKeyInvalidStrID);
    GetDialogItemAsControl( dialog,  items + kInvalidTitle, &theControl );
    SetControlData( theControl, 0, kControlStaticTextTextTag, text[0], (Ptr)(text+1));
    SetControlData( theControl, 0, kControlStaticTextStyleTag, sizeof fontInfo, (Ptr)&fontInfo);
 
    GetIndString(text, kKeyStringsID,kKeyUnTrustedStrID);
    GetDialogItemAsControl( dialog,  items + kUnTrustTitle, &theControl );
    SetControlData( theControl, 0, kControlStaticTextTextTag, text[0], (Ptr)(text+1));
    SetControlData( theControl, 0, kControlStaticTextStyleTag, sizeof fontInfo, (Ptr)&fontInfo);
 
    fontInfo.just = teJustLeft;
 
    GetDialogItemAsControl( dialog,  items + kKeyErrorBox, &theControl );
    //  SetControlData( theControl, 0, kControlStaticTextStyleTag, sizeof fontInfo, (Ptr)&fontInfo);
    HideControl(theControl);
 
    GetIndString(text, kKeyStringsID,kKeyValidStrID);
    GetDialogItemAsControl( dialog,  items + kValidTitle, &theControl );
    SetControlData( theControl, 0, kControlStaticTextTextTag, text[0], (Ptr)(text+1));
    SetControlData( theControl, 0, kControlStaticTextStyleTag, sizeof fontInfo, (Ptr)&fontInfo);
 
    GetIndString(text, kKeyStringsID,kKeyTrustedStrID);
    GetDialogItemAsControl( dialog,  items + kTrustedTitle, &theControl );
    SetControlData( theControl, 0, kControlStaticTextTextTag, text[0], (Ptr)(text+1));
    SetControlData( theControl, 0, kControlStaticTextStyleTag, sizeof fontInfo, (Ptr)&fontInfo);
 
    GetDialogItemAsControl( dialog,  items + kCreateDate, &fKeyCreateDate );
    SetControlData( fKeyCreateDate, 0, kControlStaticTextStyleTag, sizeof fontInfo, (Ptr)&fontInfo);
 
    GetDialogItemAsControl( dialog,  items + kExpireDate, &fKeyExpiredDate );
    SetControlData( fKeyExpiredDate, 0, kControlStaticTextStyleTag, sizeof fontInfo, (Ptr)&fontInfo);
 
    GetDialogItemAsControl( dialog,  items + kKeySizeData, &fKeySize );
    SetControlData( fKeySize, 0, kControlStaticTextStyleTag, sizeof fontInfo, (Ptr)&fontInfo);
 
    GetDialogItemAsControl( dialog,  items + kKeyTypeData, &fKeyType );
    SetControlData( fKeyType, 0, kControlStaticTextStyleTag, sizeof fontInfo, (Ptr)&fontInfo);
 
    GetDialogItemAsControl( dialog,  items + kKeyName, &fKeyName );
    SetControlData( fKeyName, 0, kControlStaticTextStyleTag, sizeof fontInfo, (Ptr)&fontInfo);
 
    fontInfo.just = teJustCenter;
    GetDialogItemAsControl( dialog,  items + kFingerprint, &fFingerPrint );
    SetControlData( fFingerPrint, 0, kControlStaticTextStyleTag, sizeof fontInfo, (Ptr)&fontInfo);
 
 
    fontInfo.font = kControlFontSmallSystemFont;
    fontInfo.flags = kControlUseFontMask;
 
    GetDialogItemAsControl( dialog,  items + kValidValue, &fKeyValidValue );
    SetControlMinimum(fKeyValidValue, 0);
    SetControlMaximum(fKeyValidValue, 2);
 
    GetDialogItemAsControl( dialog,  items + kTrustValue, &fKeyTrustValue );
    SetControlMinimum(fKeyTrustValue, 0);
    SetControlMaximum(fKeyTrustValue, 2);
 
    fontInfo.font  = kControlFontSmallBoldSystemFont;
    fontInfo.flags = kControlUseFontMask;
    GetDialogItemAsControl( dialog, items + kKeyInfoBox,    &fKeyInfoBox );
    SetControlData( fKeyInfoBox, 0, kControlStaticTextStyleTag, sizeof fontInfo, (Ptr)&fontInfo);
    
    GetDialogItemAsControl( dialog, items + kTrustBox,      &fKeyTrustBox );
    SetControlData( fKeyTrustBox, 0, kControlStaticTextStyleTag, sizeof fontInfo, (Ptr)&fontInfo);
    
    GetDialogItemAsControl( dialog, items + kFPBox,         &fKeyFPBox );
    SetControlData( fKeyFPBox, 0, kControlStaticTextStyleTag, sizeof fontInfo, (Ptr)&fontInfo);
 
    GetDialogItemAsControl( dialog, items + kExpiredIcon,   &fKeyExpiredIcon );
    GetDialogItemAsControl( dialog, items + kKeyDetailsBox, &fKeyDetailsBox );
    GetDialogItemAsControl( dialog, items + kKeyDragBox, &fKeyDragBox );
}
 
 
 
 
// ---------------------------------------------------------------------------
TASIPKeyPane::~TASIPKeyPane()
// ---------------------------------------------------------------------------
//
{    
    ShortenDITL( fDialog, CountDITL(fDialog) - fOrigItems);
}
 
// ---------------------------------------------------------------------------
void TASIPKeyPane::Idle(void)
// ---------------------------------------------------------------------------
//
{    
 
}
 
 
 
 
 
// ---------------------------------------------------------------------------
void TASIPKeyPane::Refresh(void)
// ---------------------------------------------------------------------------
//
{    
    ControlFontStyleRec fontInfo;
    Size                theSize;
    Str255              buffer;
 
    
    if( fKey->IsOperational() )
    {   
                
// Hide Error Message
//          GetDialogItemAsControl( fDialog, kKeyErrorBox, &theControl );
//          HideControl(theControl);
     
 
// Key User Name
        fKey->GetPrimaryUserNamePString( (StringPtr)buffer);
        SetControlData( fKeyName, 0, kControlStaticTextTextTag, buffer[0], (Ptr)(buffer+1));
 
//  key Fingerprint     
        fKey->GetFingerprintPString( (StringPtr)buffer);
        SetControlData( fFingerPrint, 0, kControlStaticTextTextTag, buffer[0], (Ptr)(buffer+1));
 
// Key type
        fKey->GetPublicKeyAlgorithmPstring ( (StringPtr)buffer);
        SetControlData( fKeyType, 0, kControlStaticTextTextTag, buffer[0], (Ptr)(buffer+1));
        
// Key Size
        NumToString(fKey->GetKeySize(), buffer);
        SetControlData( fKeySize, 0, kControlStaticTextTextTag, buffer[0], (Ptr)(buffer+1));
 
// created
        DateString( fKey->GetCreateDate() , shortDate, buffer, nil);
        SetControlData( fKeyCreateDate, 0, kControlStaticTextTextTag, buffer[0], (Ptr)(buffer+1));
 
 
// expiration
        if( fKey->IsRevoked() )
        {
        // revoked
            SetControlVisibility(fKeyExpiredIcon,true, true);
            GetIndString(buffer, kKeyStringsID, kKeyRevokedStrID);
            SetControlData( fKeyExpiresTitle, 0, kControlStaticTextTextTag, buffer[0], (Ptr)(buffer+1));
            HideControl(fKeyExpiredDate);
        }
        else
        {
        // expired
            SetControlVisibility(fKeyExpiredIcon, fKey->IsExpired() , true);
    
            GetIndString(buffer, kKeyStringsID,  fKey->IsExpired() ?kKeyExpiredStrID:kKeyExpiresStrID);
            SetControlData( fKeyExpiresTitle, 0, kControlStaticTextTextTag, buffer[0], (Ptr)(buffer+1));
                
            if( fKey->GetExpireDate()  != kPGPExpirationTime_Never)
                DateString(fKey->GetExpireDate() , shortDate, buffer, nil);
            else
                PLstrcpy(buffer, "\pnever");
            SetControlData( fKeyExpiredDate, 0, kControlStaticTextTextTag, buffer[0], (Ptr)(buffer+1));
            ShowControl(fKeyExpiredDate);
        }
            
    // key validity
        switch(fKey->GetValidity())
        {
            default:
            case kPGPValidity_Unknown:
            case kPGPValidity_Invalid:
                SetControlValue(fKeyValidValue, 0 );
                break;
            case kPGPValidity_Marginal:
                SetControlValue(fKeyValidValue, 1 );
                break;
            case kPGPValidity_Complete:
                SetControlValue(fKeyValidValue, 2 );
                break;
        }
 
                
    // key trust    
        SetControlValue(fKeyTrustValue,   fKey->IsAxiomatic() ? 3 : fKey->GetTrustLevel());
 
    // set the server key title Info
        GetIndString(buffer, kKeyStringsID,
                        fKey->IsRevoked() ? kKeyServerKeyIsRevoked: 
                        fKey->IsExpired() ? kKeyServerKeyIsExpired:
                        fKey->IsDisabled()? kKeyServerKeyIsDisabled:kKeyServerKeyIsEnabled);
        SetControlTitle(fKeyInfoBox, buffer);
 
        ShowControl(fKeyDetailsBox);
        ShowControl(fKeyFPBox);
        ShowControl(fKeyTrustBox);
 
    // if key is disabled grey out the boxes
    
        if( fKey->IsDisabled()) 
        {
            DeactivateControl(fKeyInfoBox);
            DeactivateControl(fKeyFPBox);
        }
        else
        {
            ActivateControl(fKeyInfoBox);
            ActivateControl(fKeyFPBox);
        }
 
    // if key is expired or revoked then the trust is meaningless.
        if( fKey->IsExpired() | fKey->IsRevoked() | fKey->IsDisabled()) 
             DeactivateControl(fKeyTrustBox);
        else ActivateControl(fKeyTrustBox);
 
    }
    else
    {
        GetIndString(buffer, kKeyStringsID, kKeyServerKeyNotFound);
        SetControlTitle(fKeyInfoBox, buffer);
 
        DeactivateControl(fKeyInfoBox);
        ShowControl(fKeyFPBox);
        DeactivateControl(fKeyFPBox);
        HideControl(fKeyTrustBox);
 
        
//      HideControl(fFingerPrint);
//      HideControl(fKeyFPBox);
            
//      DeactivateControl(fKeyDetailsBox);
 
/*      Str255      errorMsg, errorMsg2;
        Str63       keyName ;
 
        fKey->GetKeyNamePString(keyName);
 
        GetDialogItemAsControl( fDialog, kKeyName, &theControl );
        HideControl(theControl);
 
        GetDialogItemAsControl( fDialog, kKeyDetailsBox, &theControl );
        HideControl(theControl);
 
        GetIndString(errorMsg, kDialogStringsID, kServerKeyNotFoundErrorMsg1);
        PLstrcat(errorMsg,  keyName);
        GetIndString(errorMsg2, kDialogStringsID, kServerKeyNotFoundErrorMsg2);
        PLstrcat(errorMsg, errorMsg2);
        
        GetDialogItemAsControl( fDialog, kKeyErrorBox, &theControl );
        SetControlData( theControl, 0, kControlStaticTextTextTag, errorMsg[0], (Ptr)(errorMsg+1));
        ShowControl(theControl);
*/
    }
 
}
 
// ---------------------------------------------------------------------------
Boolean TASIPKeyPane::HandleMouseDown(EventRecord *event)
// ---------------------------------------------------------------------------
//
{    
    OSErr       err     = noErr;
    Point       here    = event->where;
    Boolean     handled;
    
    GlobalToLocal(&here);
    
    if( (handled = PtInRect (here , &(**fKeyDragBox).contrlRect))   // is it in our space
        && ( NewDrag != nil)                                        // check if drag supported?
        &&( fKey && fKey->IsOperational())                          // its a good key
        && (WaitMouseMoved (event->where)))                         // user has moved out of drag box
    {
        DragSendDataUPP     dragSendDataProcUPP = NewDragSendDataProc (KeyDragSendDataProc);    
        DragReference       dragRef;
        if (!(err = NewDrag (&dragRef)))
            {
                Point       globalPoint = {0,0};
                RgnHandle   dragRgn = NewRgn();
                RgnHandle   tempRgn = NewRgn();
                
                LocalToGlobal (&globalPoint);
                
                SetDragSendProc (dragRef,dragSendDataProcUPP,fKey);
                AddDragItemFlavor(dragRef, 0, 'TEXT', nil ,0 , nil);
                AddDragItemFlavor(dragRef, 0, kFlavorTypeClippingName, nil ,0 , nil);
                
                RectRgn(tempRgn, &(**fKeyDragBox).contrlRect);
                CopyRgn(tempRgn,dragRgn);
                InsetRgn(tempRgn,1,1);
                DiffRgn(dragRgn,tempRgn, dragRgn);
                OffsetRgn(dragRgn, globalPoint.h, globalPoint.v);
                TrackDrag (dragRef,event,dragRgn);
 
                DisposeRgn (tempRgn);
                DisposeRgn (dragRgn);
                DisposeDrag (dragRef);
            }
 
        DisposeRoutineDescriptor(dragSendDataProcUPP);
    }
    return handled;
}
 
 
// ---------------------------------------------------------------------------
void TASIPKeyPane::ItemHit(SInt16 item)
// ---------------------------------------------------------------------------
//
{    
    SInt16      localItem;
    OSErr       err = noErr;
    
    localItem = item - fOrigItems;
 
    switch ( localItem )
    {
        case kKeyDragBox:
 
            
        break;
        
    }
 
}
 
 
 
// ---------------------------------------------------------------------------
static pascal OSErr KeyDragSendDataProc (FlavorType flavorType, void *context, ItemReference itemRef, DragReference dragRef)
// ---------------------------------------------------------------------------
//
{
 
    TPGPkey*    theKey = (TPGPkey*)context;
    OSErr       err = noErr;
    
    
    switch(flavorType)
    {
        case 'TEXT':
            {
                Str255      keyName;
                void*       buf = nil;
                PGPSize     bufSize;
 
                theKey->Export(&buf,&bufSize);
                theKey->GetPrimaryUserNamePString(keyName);
 
                SetDragItemFlavorData(dragRef, itemRef, 'TEXT', buf ,bufSize , nil);
                SetDragItemFlavorData(dragRef, itemRef, kFlavorTypeClippingName, (Ptr)(keyName+1) , keyName[0], nil);
                PGPFreeData(buf);
            }
            break;
            
        default:
            break;
    }
    
 
    return err;
}   
 
#pragma mark -