home *** CD-ROM | disk | FTP | other *** search
- // xpk.c
- // 06 Dec 1996 11:25:20
-
- #ifndef BACKUP_INCLUDE
- #include "IncludeAll.c"
- #endif
- #include "Backup.h"
- #include <gadgets/NoteBook.h>
- #include "xpk.h"
- #include "Backup_Options.h"
- #include "Backup_proto.h"
- #include "BackupStrings.h"
-
-
- #define PACKBUFFERSIZE 32768
- #define INFOLINECOUNT 2
-
-
- #define d(x) ;
-
- static UWORD ComputeX( UWORD value );
- static UWORD ComputeY( UWORD value );
- static BOOL FillPackersList(struct XpkPackerList *Packers);
- static void GOFitInfoText(const char *text, struct Gadget **GOGadgets, struct TextFont *InfoLineFont);
- static void GOGetPackModeInfo(struct Gadget **GOGadgets, const char *Packer, ULONG Mode);
- static void GetOldXPKOpt(const struct BackupOptions *Opt);
- static void SplitPackerName(const char *CompleteName, char *Packer, ULONG *Mode);
- static const char *GetXpkError(ULONG XpkError);
- static ULONG __saveds __asm XPKInFunc(register __a0 struct Hook *theHook,
- register __a1 struct XpkIOMsg *Msg,
- register __a2 APTR Dummy);
- static void GetPwdRender( void );
- static void CloseGetPwdWindow(void);
- static int PwdIDCMPHandler(void);
- static void __interrupt HandleGetPwdGadgetCallback(struct Hook *hook, struct Gadget *Gad, ULONG *Code);
- static int __interrupt HandleGetPwdGadget(struct Gadget *Gad, USHORT code, struct BackupOptions *Opt);
-
-
- // Variable aus Backup.c
- extern struct Window *aktWindow;
- extern struct TextFont *myFont; // System Default Font
- extern struct TextFont *ScreenFont;
- extern struct TextFont PasswordFont;
- extern BPTR aktReadFileHandle; // fh für Lese-File
- extern int readoffset; // Offset innerhalb des aktuellen Lese-Buffers
- extern struct Buffer *AktReadBuffer; // aktueller Lese-Buffer
- extern struct Disk ReadDisk;
- extern struct BackupOptions myOptions;
- extern unsigned long BytesProcessed; // Anzahl Bytes
- extern struct PartitionInfo Root_pInfo; // aktuelle Partition
-
- // aus Backup_Window.c
- extern struct TextAttr PWDFONT;
- extern APTR vi; // VisualInfo
- extern struct Screen *WBScreen;
-
- // aus FileSelect.c
- extern struct Window *activeWindow; // das gerade aktive Backup-Window
- extern BOOL HelpActive; // Online-Hilfe ist aktiv
- extern BOOL GadgetHelp; // V39-GadgetHelp ist verfügbar
- extern ULONG BackupHelpGroup; // Help Group
-
-
- // globale Disk-Parameter
- extern struct BackupDevInfo globDrvDat;
-
-
- static ULONG FontX, FontY;
- static UWORD OffX, OffY;
- static struct Window *GetPwdWnd = NULL;
- static struct Gadget *GetPwdGList = NULL;
- static struct Gadget *GetPwdGadgets[GetPwd_CNT];
- static UWORD GetPwdWidth = 232;
- static UWORD GetPwdHeight = 80;
-
- static struct BInputHandler *PackerSelectInput = NULL;
- static struct BInputHandler *PwdInput = NULL;
-
- static MINLIST(GetPwdResourceList);
-
- static struct GadgetShort *GetPwdGadgetShort; // Tabelle für Tasten-Kürzel
-
- struct MinList PackersList;
-
- static char *PackInBuffer;
- static size_t PackInBufferSize; // Größe von PackInBuffer
-
-
- static struct IntuiText GetPwdIText[] = { 1, 0, JAM1,108, 11, NULL, NULL, NULL };
-
-
- static UWORD GetPwdGTypes[] = {
- STRING_KIND,
- BUTTON_KIND,
- BUTTON_KIND
- };
-
- static struct NewGadget GetPwdNGad[] = {
- 3, 22, 226, 21, NULL, &PWDFONT, GD_PwdGadget, PLACETEXT_ABOVE, NULL, NULL,
- 3, 55, 85, 20, (UBYTE *) MSG_OK_GAD, NULL, GD_PwdOkGadget, PLACETEXT_IN, NULL, NULL,
- 144, 55, 85, 20, (UBYTE *) MSG_CANCEL_GAD, NULL, GD_PwdCancelGadget, PLACETEXT_IN, NULL, NULL
- };
-
- static ULONG GetPwdGTags[] = {
- (STRINGA_ExitHelp), TRUE,
- (GTST_MaxChars), XPK_PASSWORDLEN,
- (GT_Underscore), '_',
- (TAG_DONE),
- (GT_Underscore), '_',
- (TAG_DONE),
- (GT_Underscore), '_',
- (TAG_DONE)
- };
-
-
-
- struct Library *XpkBase = NULL;
-
- static struct XpkPackerList PackerList;
-
- struct Gadget **XPKGOGadgets;
-
- static ULONG CurrentPacker = 0; // Index des aktuellen Packers
- static ULONG CurrentPackMode; // Pack-Mode 0...100
- static BOOL PackModeFixed = FALSE;
- BOOL XPKEncrypt;
- static char Password[XPK_PASSWORDLEN];
- static char FinalPacker[XPK_PACKNAMELEN]; // Format: "ABCD.100"
-
- static unsigned char *PackOutBuffer;
- static unsigned long PackOutBufferSize;
- static unsigned long MaxInLen;
-
- static struct Hook GetPwdGadgetShortHook =
- {
- { NULL },
- HookEntry,
- (ULONG (*)()) HandleGetPwdGadgetCallback,
- NULL, // wird (struct BackupOptions *)
- };
-
- static struct BackupOptions *GetPwdOptions;
- static BOOL GetPwdResult;
-
-
- void InitXpk(void)
- {
- NewList((struct List *) &PackersList);
-
- // kein Fehler wenn keine xpkmaster.library !!
- XpkBase = OpenLibrary((STRPTR) XPKNAME, 0);
-
- if (XpkBase)
- {
- ULONG XpkError;
-
- XpkError = XpkQueryTags(XPK_PackersQuery, &PackerList,
- TAG_END);
-
- if (XpkError)
- {
- CleanupXpk();
-
- // wenn keine XPK-Libraries gefunden werden, kommt Fehler XPKERR_NOINFO
- // dann wird kommentarlos die XPK-Unterstützung abgeschaltet.
- if (XPKERR_NOINFO != XpkError)
- {
- // Fehler melden
- alarm("%s: XpkQueryTags: %s", __FUNC__, GetXpkError(XpkError));
- }
- }
- }
- }
-
-
- void CleanupXpk(void)
- {
- if (PackOutBuffer)
- {
- free(PackOutBuffer);
- PackOutBuffer = NULL;
- PackOutBufferSize = 0;
- }
- if (PackInBuffer)
- {
- free(PackInBuffer);
- PackInBuffer = NULL;
- PackInBufferSize = 0;
- }
-
- if (XpkBase)
- CloseLibrary(XpkBase);
- XpkBase = NULL;
- }
-
-
- BOOL GOInitXPKPacker(const struct BackupOptions *Opt)
- {
- ASSERT_VALID(Opt);
-
- if (NULL == XpkBase)
- return FALSE;
-
- if (!FillPackersList(&PackerList))
- return FALSE;
-
- GetOldXPKOpt(Opt);
-
- return TRUE;
- }
-
-
- void GOSetupDefaultPacker(struct Gadget **GOGadgets, struct TextFont *InfoLineFont, const struct BackupOptions *Opt)
- {
- ASSERT_VALID(Opt);
- ASSERT_VALID(GOGadgets);
- ASSERT_VALID(GOGadgets[GDX_NBXPKCompressorList]);
- ASSERT_VALID(GOGadgets[GDX_GONoteBook]);
-
- GetOldXPKOpt(Opt);
-
- // Informationen für den Default-Packer anzeigen
- GOGetPackerInfo(CurrentPacker, GOGadgets, InfoLineFont);
-
- // Default-Packer im ListView anzeigen
- NB_SetGadgetAttrs(GOGadgets[GDX_NBXPKCompressorList], GOGadgets[GDX_GONoteBook],
- GTLV_Selected, CurrentPacker,
- GTLV_MakeVisible, CurrentPacker,
- TAG_END);
- }
-
-
- static UWORD ComputeX( UWORD value )
- {
- return ((UWORD) ((value * FontX) / 65535));
- }
-
-
- static UWORD ComputeY( UWORD value )
- {
- return ((UWORD) ((value * FontY) / 65535));
- }
-
-
- static BOOL FillPackersList(struct XpkPackerList *Packers)
- {
- struct PackerNode *PackNode;
- ULONG Count;
-
- ASSERT_VALID(Packers);
-
- // Liste zu Anfang leeren
- while (PackNode = (struct PackerNode *) RemHead((struct List *) &PackersList))
- {
- free(PackNode);
- }
-
- for (Count=0; Count<Packers->NumPackers; Count++)
- {
- long XpkError;
-
- PackNode = malloc(sizeof(struct PackerNode));
- if (NULL == PackNode)
- {
- alarm(GetString(MSG_OUTOFMEMORY), __FUNC__, "PackNode", sizeof(struct PackerNode));
- return FALSE;
- }
-
- PackNode->pn_Node.ln_Type = NT_USER;
- PackNode->pn_Node.ln_Pri = 0;
- PackNode->PackerIndex = Count;
- strcpy(PackNode->PackerName, PackerList.Packer[Count]);
-
- XpkError = XpkQueryTags(XPK_PackerQuery, &PackNode->Info,
- XPK_PackMethod, PackNode->PackerName,
- XPK_PackMode, 0,
- TAG_END);
- if (XpkError)
- {
- alarm("%s: XpkQueryTags: %s", __FUNC__, GetXpkError(XpkError));
- return FALSE;
- }
-
- PackNode->pn_Node.ln_Name = PackNode->Info.Name;
-
- if (PackNode->Info.Flags & XPKIF_LOSSY)
- {
- // verlustbehaftete Kompression ist nicht brauchbar!
- free(PackNode);
- }
- else
- AddTail((struct List *) &PackersList, &PackNode->pn_Node);
- }
-
- return TRUE;
- }
-
-
- void GOGetSelectedXPKPacker(struct BackupOptions *Opt)
- {
- if (XpkBase)
- {
- sprintf(Opt->XPKPackerName, "%s.%d", PackerList.Packer[CurrentPacker],
- CurrentPackMode);
- Opt->XPKEncrypt = XPKEncrypt;
- }
- else
- strcpy(Opt->XPKPackerName, "");
- }
-
-
- void GOSetXPKPackMode(short code, struct Gadget **GOGadgets)
- {
- CurrentPackMode = code;
- if (GOGadgets)
- GOGetPackModeInfo(GOGadgets, PackerList.Packer[CurrentPacker], code);
- }
-
-
- void GOGetPackerInfo(short code, struct Gadget **GOGadgets, struct TextFont *InfoLineFont)
- {
- struct PackerNode *pNode;
-
- ASSERT_VALID(GOGadgets);
- ASSERT_VALID(GOGadgets[GDX_GONoteBook]);
-
- for (pNode = (struct PackerNode *) PackersList.mlh_Head; code;
- pNode = (struct PackerNode *) pNode->pn_Node.ln_Succ, code--);
-
- PackModeFixed = !(pNode->Info.Flags & XPKIF_MODES);
- XPKEncrypt = (pNode->Info.Flags & XPKIF_NEEDPASSWD) != 0;
-
- CurrentPacker = pNode->PackerIndex;
- if (NO_PACKMODE == CurrentPackMode || PackModeFixed)
- CurrentPackMode = pNode->Info.DefMode;
-
- GOFitInfoText(pNode->Info.Description, GOGadgets, InfoLineFont);
-
- NB_SetGadgetAttrs(GOGadgets[GDX_NBXPKLongName], GOGadgets[GDX_GONoteBook],
- GTTX_Text, pNode->Info.LongName,
- TAG_END);
-
- NB_SetGadgetAttrs(GOGadgets[GDX_NBXPKEncrypt], GOGadgets[GDX_GONoteBook],
- GA_Disabled, !(pNode->Info.Flags & XPKIF_ENCRYPTION) ||
- pNode->Info.Flags & XPKIF_NEEDPASSWD,
- GTCB_Checked, XPKEncrypt,
- TAG_END);
-
- NB_SetGadgetAttrs(GOGadgets[GDX_NBXPKPassword], GOGadgets[GDX_GONoteBook],
- GA_Disabled, !(pNode->Info.Flags & XPKIF_ENCRYPTION),
- TAG_END);
-
- NB_SetGadgetAttrs(GOGadgets[GDX_NBXPKMode], GOGadgets[GDX_GONoteBook],
- GTSL_Level, CurrentPackMode,
- GA_Disabled, PackModeFixed,
- TAG_END);
-
- GOGetPackModeInfo(GOGadgets, pNode->PackerName, CurrentPackMode);
- }
-
-
- static void GOFitInfoText(const char *text, struct Gadget **GOGadgets, struct TextFont *InfoLineFont)
- {
- static char pInfoString[INFOLINECOUNT][60];
- struct RastPort TextRp;
- struct TextExtent FitExt;
- ULONG MaxLen, len;
- short n;
-
- ASSERT_VALID(text);
- ASSERT_VALID(GOGadgets);
- ASSERT_VALID(GOGadgets[GDX_GONoteBook]);
-
- InitRastPort(&TextRp);
- SetFont(&TextRp, InfoLineFont);
-
- memset(pInfoString, 0, sizeof(pInfoString));
- text = stpblk(text);
-
- MaxLen = TextFit(&TextRp, (STRPTR) text, strlen(text), &FitExt, NULL,
- 1, GOGadgets[GDX_NBXPKInfoText1]->Width,
- GOGadgets[GDX_NBXPKInfoText1]->Height);
-
- len = strlen(text);
-
- for (n=0; len && n < INFOLINECOUNT; n++)
- {
- ULONG CopyLen, Split = MaxLen;
-
- if (len < Split)
- Split = 0; // <text> ist kürzer als eine Zeile
-
- while (Split > 0)
- {
- if (isspace(text[Split]))
- {
- // Trennen am Leerzeichen
- CopyLen = min(Split, sizeof(pInfoString[n]) - 1);
- stccpy(pInfoString[n], text, CopyLen+1);
- text = stpblk(text + Split);
- break;
- }
- else
- Split--;
- }
- if (0 == Split)
- {
- // keine Trennmöglichkeit gefunden
- CopyLen = min(min(len, MaxLen), sizeof(pInfoString[n]) - 1);
- stccpy(pInfoString[n], text, CopyLen+1);
- text = stpblk(text + CopyLen);
- }
-
- len = strlen(text);
- }
-
- NB_SetGadgetAttrs(GOGadgets[GDX_NBXPKInfoText1], GOGadgets[GDX_GONoteBook],
- GTTX_Text, pInfoString[0],
- TAG_END);
- NB_SetGadgetAttrs(GOGadgets[GDX_NBXPKInfoText2], GOGadgets[GDX_GONoteBook],
- GTTX_Text, pInfoString[1],
- TAG_END);
- }
-
-
- LONG __saveds __interrupt PackModeDispFunc(struct Gadget *Gad, WORD Level)
- {
- GOGetPackModeInfo(XPKGOGadgets, PackerList.Packer[CurrentPacker], Level);
-
- return (LONG) Level;
- }
-
-
- static void GOGetPackModeInfo(struct Gadget **GOGadgets, const char *Packer, ULONG Mode)
- {
- static char CFText[10];
- struct XpkMode ModeInfo;
- ULONG XpkError;
-
- ASSERT_VALID(GOGadgets);
- ASSERT_VALID0(GOGadgets[GDX_GONoteBook]);
-
- if (XpkBase)
- {
- XpkError = XpkQueryTags(XPK_ModeQuery, &ModeInfo,
- XPK_PackMethod, Packer,
- XPK_PackMode, Mode,
- TAG_END);
- if (XpkError)
- {
- alarm("%s: XpkQueryTags: %s", __FUNC__, GetXpkError(XpkError));
- return;
- }
-
- sprintf(CFText, "%3d.%01d", ModeInfo.Ratio/10, ModeInfo.Ratio % 10);
-
- if (GOGadgets[GDX_GONoteBook])
- {
- NB_SetGadgetAttrs(GOGadgets[GDX_NBXPKModeName], GOGadgets[GDX_GONoteBook],
- GTTX_Text, ModeInfo.Description,
- TAG_END);
- NB_SetGadgetAttrs(GOGadgets[GDX_NBXPKPackRate], GOGadgets[GDX_GONoteBook],
- GTNM_Number, ModeInfo.PackSpeed,
- TAG_END);
- NB_SetGadgetAttrs(GOGadgets[GDX_NBXPKUnpackRate], GOGadgets[GDX_GONoteBook],
- GTNM_Number, ModeInfo.UnpackSpeed,
- TAG_END);
- NB_SetGadgetAttrs(GOGadgets[GDX_NBXPK_CF], GOGadgets[GDX_GONoteBook],
- GTTX_Text, CFText,
- TAG_END);
- }
- }
- }
-
-
- static const char *GetXpkError(ULONG XpkError)
- {
- // XpkError ist < 0 !!!
- return GetString(MSG_XPKERR_OK - XpkError);
- }
-
-
- static void GetOldXPKOpt(const struct BackupOptions *Opt)
- {
- ULONG n;
- char PackerName[6];
- BOOL Found;
-
- ASSERT_VALID(Opt);
-
- stccpy(FinalPacker, Opt->XPKPackerName, sizeof(FinalPacker));
- stccpy(Password, Opt->XPKPassword, sizeof(Password));
- XPKEncrypt = Opt->XPKEncrypt;
-
- SplitPackerName(Opt->XPKPackerName, PackerName, &CurrentPackMode);
-
- for (n=0, Found=FALSE; n<PackerList.NumPackers; n++)
- {
- if (stricmp(PackerName, PackerList.Packer[n]) == 0)
- {
- CurrentPacker = n;
- Found = TRUE;
- break;
- }
- }
-
- if (!Found)
- CurrentPackMode = NO_PACKER;
- }
-
-
- static void SplitPackerName(const char *CompleteName, char *Packer, ULONG *Mode)
- {
- ULONG n;
-
- ASSERT_VALID(CompleteName);
- ASSERT_VALID(Packer);
- ASSERT_VALID(Mode);
-
- for (n=0; n<6 && CompleteName[n] && CompleteName[n] != '.';
- n++)
- Packer[n] = CompleteName[n];
- Packer[n] = '\0';
-
- *Mode = 0;
-
-
- while (*CompleteName && *CompleteName != '.')
- CompleteName++;
-
- if ('.' == *CompleteName)
- *Mode = atoi(++CompleteName);
- }
-
-
- // liefert die typische Kompressionsrate für den gewählten Packer in % (0...100)
- ULONG GetCompressionRatio(const char *Packer)
- {
- char PackerName[6];
- ULONG PackMode;
- struct XpkMode ModeInfo;
- ULONG XpkError;
-
- ASSERT_VALID(Packer);
- ASSERT_VALID(XpkBase);
-
- SplitPackerName(Packer, PackerName, &PackMode);
-
- XpkError = XpkQueryTags(XPK_ModeQuery, &ModeInfo,
- XPK_PackMethod, PackerName,
- XPK_PackMode, PackMode,
- TAG_END);
- if (XpkError)
- {
- alarm("%s: XpkQueryTags: %s", __FUNC__, GetXpkError(XpkError));
- return 100l;
- }
-
- return (ULONG) (100l - (ModeInfo.Ratio / 10l));
- }
-
-
- BOOL XPKInitCompress(void)
- {
- if (PackOutBuffer == NULL)
- {
- PackOutBufferSize = max(globDrvDat.CylSize, PACKBUFFERSIZE);
- MaxInLen = (32 * (PackOutBufferSize - 2 * XPK_MARGIN)) / 33;
- PackOutBuffer = (unsigned char *) calloc(PackOutBufferSize, 1);
- }
-
- if (NULL == PackOutBuffer)
- return FALSE;
-
- return TRUE;
- }
-
-
- void XPKCompressFile(struct NameField *info, size_t fsize)
- {
- size_t ChunkLen, PackedLen;
- struct Hook XPKInHook;
- ULONG XPKError;
- struct TagItem XpkInTags[2];
-
- ASSERT_VALID(info);
-
- if (NULL == XpkBase)
- {
- alarm(GetString(MSG_XPK_NOLIBRARY));
- myabort(15);
- }
-
- // Input für XPK festlegen
- if (info->isPartition)
- {
- XPKInHook.h_Data = NULL;
- XPKInHook.h_Entry = (unsigned long (*)()) XPKInFunc;
-
- XpkInTags[0].ti_Tag = XPK_InHook;
- XpkInTags[0].ti_Data = (ULONG) &XPKInHook;
- }
- else
- {
- XpkInTags[0].ti_Tag = XPK_InFH;
- XpkInTags[0].ti_Data = aktReadFileHandle;
- }
-
- XpkInTags[1].ti_Tag = TAG_END;
-
- while (fsize)
- {
- ChunkLen = min(fsize, MaxInLen);
-
- XPKError = XpkPackTags(
- XPK_InLen, ChunkLen,
- XPK_ChunkSize, ChunkLen,
- XPK_OutBuf, PackOutBuffer,
- XPK_OutBufLen, PackOutBufferSize,
- XPK_GetOutLen, &PackedLen,
- XPK_PackMethod, myOptions.XPKPackerName,
- XPK_StepDown, TRUE,
- XPK_PassThru, TRUE,
- XPK_Password, myOptions.XPKEncrypt ? myOptions.XPKPassword : NULL,
- TAG_MORE, &XpkInTags,
- TAG_END);
-
- if (XPKError)
- {
- alarm("%s: XpkPackTags: %s", __FUNC__, GetXpkError(XPKError));
- break;
- }
-
- BufferWrite(&info, PackOutBuffer, PackedLen);
- fsize -= ChunkLen;
-
- BytesProcessed += ChunkLen;
-
- UpdateFileDisplay(); // update Byte & File Count
- }
- }
-
-
- static ULONG __saveds __asm XPKInFunc(register __a0 struct Hook *theHook,
- register __a1 struct XpkIOMsg *Msg,
- register __a2 APTR Dummy)
- {
- switch (Msg->Type)
- {
- case XIO_FREE:
- d(printf("XIO_FREE Ptr=%08lx Size=%ld\n", Msg->Ptr, Msg->Size);)
- break;
- case XIO_ABORT:
- d(printf("XIO_ABORT Ptr=%08lx Size=%ld\n", Msg->Ptr, Msg->Size);)
- break;
- case XIO_READ:
- if (NULL == Msg->Ptr)
- {
- if (!PackInBuffer || Msg->Size > PackInBufferSize)
- {
- PackInBufferSize = Msg->Size;
- PackInBuffer = realloc(PackInBuffer, PackInBufferSize);
- if (NULL == PackInBuffer)
- {
- alarm(GetString(MSG_OUTOFMEMORY), __FUNC__, "PackInBuffer", PackInBufferSize);
- return -1L;
- }
- }
- Msg->Ptr = PackInBuffer;
- }
-
- d(printf("XIO_READ Ptr=%08lx Size=%ld\n", Msg->Ptr, Msg->Size);)
- if (Msg->Size != ReadPartition(&Root_pInfo, Msg->Size, Msg->Ptr))
- return ~0l;
- break;
- default:
- d(printf("Type=%ld\n", Msg->Type);)
- break;
- }
-
- return 0l;
- }
-
-
- static void GetPwdRender( void )
- {
- struct IntuiText it;
- UWORD cnt;
-
- GetPwdIText[0].IText = (STRPTR) GetString(MSG_GETPASSWORD_GAD);
-
- for ( cnt = 0; cnt < GetPwd_TNUM; cnt++ )
- {
- it = GetPwdIText[cnt];
- it.ITextFont = WBScreen->Font;
- it.LeftEdge = (GetPwdWnd->Width - IntuiTextLength( &it )) / 2;
- it.TopEdge = OffY + ComputeY( it.TopEdge ) - ( WBScreen->Font->ta_YSize / 2);
-
- PrintIText( GetPwdWnd->RPort, &it, 0, 0 );
- }
- }
-
-
- // Paßwort für Verschlüsselung anfordern
- BOOL CheckPassword(struct BackupOptions *Opt)
- {
- struct Gadget *g;
- UWORD ww, wh;
-
- if (COMPRESS_XPK != Opt->bo_Compress || !Opt->XPKEncrypt || strlen(Opt->XPKPassword) > 0)
- return TRUE;
-
- SignalUnIconifyMainWindow();
-
- GetPwdOptions = Opt;
- GetPwdResult = FALSE;
-
- CreateGadgetShort(&GetPwdGadgetShort);
-
- CalcGadgetScale(WBScreen, ScreenFont, &FontX, &FontY, &OffX, &OffY, 8, 11);
-
- ww = ComputeX( GetPwdWidth );
- wh = ComputeY( GetPwdHeight );
-
- g = CreateGadgetList(&GetPwdGList, GetPwd_CNT,
- WBScreen->Font,
- GetPwdGTypes,
- GetPwdNGad,
- GetPwdGadgets,
- GetPwdGTags,
- GetPwdGadgetShort,
- &GetPwdResourceList,
- FontX, FontY,
- OffX, OffY
- );
- if (NULL == g)
- {
- alarm(GetString(MSG_CREATEGAD_FAILED), __FUNC__);
- return FALSE;
- }
-
- WindowBusy(aktWindow, TRUE);
-
- ww += OffX + aktWindow->WScreen->WBorRight;
- wh += OffY + aktWindow->WScreen->WBorBottom;
-
- assert(ww > 20 && wh > 20);
-
- GetPwdWnd = OpenWindowTags( NULL,
- WA_Left, aktWindow->WScreen->MouseX - ww/2,
- WA_Top, aktWindow->WScreen->MouseY - wh/2,
- WA_Width, ww,
- WA_Height, wh,
- WA_IDCMP, STRINGIDCMP|BUTTONIDCMP
- |IDCMP_GADGETDOWN|IDCMP_CLOSEWINDOW
- |IDCMP_REFRESHWINDOW|IDCMP_ACTIVEWINDOW
- |IDCMP_MENUHELP|IDCMP_GADGETHELP
- |IDCMP_VANILLAKEY|IDCMP_RAWKEY,
- WA_Flags, WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
- WA_Gadgets, GetPwdGList,
- WA_Title, GetString(MSG_GETPWDWINDOW_TITLE),
- WA_PubScreen, aktWindow->WScreen,
- WA_AutoAdjust, TRUE,
- WA_HelpGroup, BackupHelpGroup,
- WA_MenuHelp, TRUE,
- WA_NewLookMenus, TRUE,
- TAG_DONE );
-
- if (NULL == GetPwdWnd)
- {
- WindowBusy(aktWindow, FALSE);
- CloseGetPwdWindow();
-
- alarm(GetString(MSG_CANNOT_OPEN_WINDOW), __FUNC__, "GetPwdWnd");
- return FALSE;
- }
-
- GT_RefreshWindow( GetPwdWnd, NULL );
- GetPwdRender();
-
- ActivateGadget(GetPwdGadgets[GDX_PwdGadget], GetPwdWnd, NULL);
-
- PwdInput = AddBInputHandler(1 << GetPwdWnd->UserPort->mp_SigBit, PwdIDCMPHandler);
-
- GetPwdGadgetShortHook.h_Data = Opt;
-
- do {
- eingabe(0l);
- } while (GetPwdWnd);
-
- WindowBusy(aktWindow, FALSE);
-
- if (Opt->bo_Iconify)
- IconifyMainWindow(); // aktWindow nach Paßwort-Abfrage wieder ikonifizieren
-
- return GetPwdResult;
- }
-
-
- static void CloseGetPwdWindow(void)
- {
- RemBInputHandler(&PwdInput);
-
- SafeCloseWindow(&GetPwdWnd);
- if (GetPwdGList)
- {
- FreeGadgets( GetPwdGList );
- GetPwdGList = NULL;
- }
- FreeBResources(&GetPwdResourceList);
- DestroyGadgetShort(&GetPwdGadgetShort);
- }
-
-
- static int PwdIDCMPHandler(void)
- {
- struct IntuiMessage *msg;
- long Result = 0;
-
- while (GetPwdWnd && (msg = GT_GetIMsg(GetPwdWnd->UserPort)) )
- {
- ULONG class;
- USHORT code;
- APTR Address;
-
- class = msg->Class;
- code = msg->Code;
- Address = msg->IAddress;
-
- GT_ReplyIMsg(msg);
-
- switch (class)
- {
- case IDCMP_ACTIVEWINDOW:
- activeWindow = GetPwdWnd;
- SetHelpPointer(activeWindow, HelpActive);
- break;
-
- case IDCMP_GADGETHELP:
- if (Address == NULL)
- {
- // Nicht über unserem Window
- }
- else if (Address == GetPwdWnd)
- {
- // über dem Window
- CallHelp(HELPID_PWDWINDOW, TRUE);
- }
- else
- CallHelp(((struct Gadget *) Address)->GadgetID, TRUE);
- break;
-
- case IDCMP_GADGETUP:
- Result = HandleGetPwdGadget((struct Gadget *) Address, code, GetPwdOptions);
- break;
-
- case IDCMP_VANILLAKEY:
- Result = HandleGadgetShort(GetPwdGadgetShort, GetPwdWnd, code, &GetPwdGadgetShortHook);
- break;
-
- case IDCMP_RAWKEY:
- if (GADCODE_HELP == code)
- ToggleHelp();
- break;
-
- case IDCMP_REFRESHWINDOW:
- // This handling is REQUIRED with GadTools.
- GT_BeginRefresh(GetPwdWnd);
- GT_EndRefresh(GetPwdWnd, TRUE);
- break;
- }
- }
- return Result;
- }
-
-
- static void __interrupt HandleGetPwdGadgetCallback(struct Hook *hook, struct Gadget *Gad, ULONG *Code)
- {
- struct BackupOptions *Opt;
-
- Opt = (struct BackupOptions *) hook->h_Data;
- HandleGetPwdGadget(Gad, (USHORT) *Code, Opt);
- }
-
-
- static int __interrupt HandleGetPwdGadget(struct Gadget *Gad, USHORT code, struct BackupOptions *Opt)
- {
- int Result = Gad->GadgetID;
-
- switch (Gad->GadgetID)
- {
- case GD_PwdGadget:
- switch (code)
- {
- case GADCODE_HELP:
- ToggleHelp();
- Result = 0;
- break;
- case 0:
- GetPwdResult = TRUE;
- stccpy(Opt->XPKPassword, GADSTRING(GetPwdGadgets[GDX_PwdGadget]),
- XPK_PASSWORDLEN);
- CloseGetPwdWindow();
- break;
- }
- break;
-
- case GD_PwdOkGadget:
- GetPwdResult = TRUE;
- stccpy(Opt->XPKPassword, GADSTRING(GetPwdGadgets[GDX_PwdGadget]),
- XPK_PASSWORDLEN);
- CloseGetPwdWindow();
- break;
-
- case GD_PwdCancelGadget:
- CloseGetPwdWindow();
- break;
- }
-
- return Result;
- }
-