| [541] | 1 | //***********************************************************
 | 
|---|
 | 2 | //                          IETravelLog                     *
 | 
|---|
 | 3 | //                                                          *
 | 
|---|
 | 4 | //                     Freeware Component                   *
 | 
|---|
 | 5 | //                            by                            *
 | 
|---|
 | 6 | //                     Per Lindsø Larsen                    *
 | 
|---|
 | 7 | //                Updated by Eran Bodankin - bsalsa         *
 | 
|---|
 | 8 | //                     bsalsa@gmail.com                    *
 | 
|---|
 | 9 | //                                                          *
 | 
|---|
 | 10 | //        Documentation and updated versions:               *
 | 
|---|
 | 11 | //                                                          *
 | 
|---|
 | 12 | //               http://www.bsalsa.com                      *
 | 
|---|
 | 13 | //***********************************************************
 | 
|---|
 | 14 | {*******************************************************************************}
 | 
|---|
 | 15 | {LICENSE:
 | 
|---|
 | 16 | THIS SOFTWARE IS PROVIDED TO YOU "AS IS" WITHOUT WARRANTY OF ANY KIND,
 | 
|---|
 | 17 | EITHER EXPRESSED OR IMPLIED INCLUDING BUT NOT LIMITED TO THE APPLIED
 | 
|---|
 | 18 | WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
 | 
|---|
 | 19 | YOU ASSUME THE ENTIRE RISK AS TO THE ACCURACY AND THE USE OF THE SOFTWARE
 | 
|---|
 | 20 | AND ALL OTHER RISK ARISING OUT OF THE USE OR PERFORMANCE OF THIS SOFTWARE
 | 
|---|
 | 21 | AND DOCUMENTATION. BSALSA PRODUCTIONS DOES NOT WARRANT THAT THE SOFTWARE IS ERROR-FREE
 | 
|---|
 | 22 | OR WILL OPERATE WITHOUT INTERRUPTION. THE SOFTWARE IS NOT DESIGNED, INTENDED
 | 
|---|
 | 23 | OR LICENSED FOR USE IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE CONTROLS,
 | 
|---|
 | 24 | INCLUDING WITHOUT LIMITATION, THE DESIGN, CONSTRUCTION, MAINTENANCE OR
 | 
|---|
 | 25 | OPERATION OF NUCLEAR FACILITIES, AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS,
 | 
|---|
 | 26 | AIR TRAFFIC CONTROL, AND LIFE SUPPORT OR WEAPONS SYSTEMS. BSALSA PRODUCTIONS SPECIFICALLY
 | 
|---|
 | 27 | DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR SUCH PURPOSE.
 | 
|---|
 | 28 | 
 | 
|---|
 | 29 | You may use, change or modify the component under 4 conditions:
 | 
|---|
 | 30 | 1. In your website, add a link to "http://www.bsalsa.com"
 | 
|---|
 | 31 | 2. In your application, add credits to "Embedded Web Browser"
 | 
|---|
 | 32 | 3. Mail me  (bsalsa@gmail.com) any code change in the unit
 | 
|---|
 | 33 |    for the benefit of the other users.
 | 
|---|
 | 34 | 4. Please consider donation in our web site!
 | 
|---|
 | 35 | {*******************************************************************************}
 | 
|---|
 | 36 | //$Id: IETravelLog.pas,v 1.3 2006/12/18 14:13:07 bsalsa Exp $
 | 
|---|
 | 37 | 
 | 
|---|
 | 38 | unit IETravelLog;
 | 
|---|
 | 39 | 
 | 
|---|
 | 40 | interface
 | 
|---|
 | 41 | 
 | 
|---|
 | 42 | {$I EWB.inc}
 | 
|---|
 | 43 | 
 | 
|---|
 | 44 | uses
 | 
|---|
 | 45 |   Activex, Windows, Classes, EmbeddedWB, IEConst, EwbAcc;
 | 
|---|
 | 46 | 
 | 
|---|
 | 47 | type
 | 
|---|
 | 48 |   TOnEntryEvent = procedure(Title, Url: WideString; var Cancel: Boolean) of object;
 | 
|---|
 | 49 |   TOnGetCountEvent = procedure(Flags: Cardinal; out Entries: Cardinal) of object;
 | 
|---|
 | 50 |   TOnRemoveEntryEvent = procedure(Name: WideString; var Cancel: Boolean) of object;
 | 
|---|
 | 51 |   TOnTravelToEvent = procedure(OffSet: Integer; var Cancel: Boolean) of object;
 | 
|---|
 | 52 | 
 | 
|---|
 | 53 |   TIETravelLog = class(TComponent)
 | 
|---|
 | 54 |   private
 | 
|---|
 | 55 |     { Private declarations }
 | 
|---|
 | 56 |     FAbout: string;
 | 
|---|
 | 57 |     FEmbeddedWB: TEmbeddedWB;
 | 
|---|
 | 58 |     FEnabled: Boolean;
 | 
|---|
 | 59 |     fOnEntry: TOnEntryEvent;
 | 
|---|
 | 60 |     FOnGetCount: TOnGetCountEvent;
 | 
|---|
 | 61 |     FOnRemoveEntry: TOnRemoveEntryEvent;
 | 
|---|
 | 62 |     FOnTravelTo: TOnTravelToEvent;
 | 
|---|
 | 63 |     procedure SetAbout(const Value: string);
 | 
|---|
 | 64 |   protected
 | 
|---|
 | 65 |     { Protected declarations }
 | 
|---|
 | 66 |     Entry: ITravelLogEntry;
 | 
|---|
 | 67 |     Enum: IEnumTravelLogEntry;
 | 
|---|
 | 68 |     Stg: ITravelLogStg;
 | 
|---|
 | 69 |     procedure _Enumerate(Flags: Cardinal);
 | 
|---|
 | 70 |   public
 | 
|---|
 | 71 |     { Public declarations }
 | 
|---|
 | 72 |     constructor Create(AOwner: TComponent); override;
 | 
|---|
 | 73 |     function Connect: Boolean;
 | 
|---|
 | 74 |     function CreateEntry(const OffSet: Integer; const Url, Title: WideString): HRESULT;
 | 
|---|
 | 75 |     function GetCount(Flags: DWORD; out Entries: DWORD): HRESULT;
 | 
|---|
 | 76 |     function GetRelativeEntry(OffSet: Integer; out Title, Url: WideString): HRESULT;
 | 
|---|
 | 77 |     function RemoveEntry(OffSet: Integer): HRESULT;
 | 
|---|
 | 78 |     function RemoveEntryByTitle(const Title: WideString): HRESULT;
 | 
|---|
 | 79 |     function RemoveEntryByUrl(const Url: WideString): HRESULT;
 | 
|---|
 | 80 |     function TravelTo(OffSet: Integer): HRESULT;
 | 
|---|
 | 81 |     procedure ClearSession;
 | 
|---|
 | 82 |     procedure Enumerate;
 | 
|---|
 | 83 |     procedure EnumerateBack;
 | 
|---|
 | 84 |     procedure EnumerateForward;
 | 
|---|
 | 85 |   published
 | 
|---|
 | 86 |     { Published declarations }
 | 
|---|
 | 87 |     property About: string read FAbout write SetAbout;
 | 
|---|
 | 88 |     property EmbeddedWB: TEmbeddedWB read FEmbeddedWB write FEmbeddedWB;
 | 
|---|
 | 89 |     property OnEntry: TOnEntryEvent read fOnEntry write fOnEntry;
 | 
|---|
 | 90 |     property OnGetCount: TOnGetCountEvent read FOnGetCount write FOnGetCount;
 | 
|---|
 | 91 |     property OnRemoveEntry: TOnRemoveEntryEvent read FOnRemoveEntry write FOnRemoveEntry;
 | 
|---|
 | 92 |     property OnTravelTo: TOnTravelToEvent read FOnTravelTo write FOnTravelTo;
 | 
|---|
 | 93 |     property Enabled: boolean read FEnabled write FEnabled default True;
 | 
|---|
 | 94 |   end;
 | 
|---|
 | 95 | 
 | 
|---|
 | 96 | implementation
 | 
|---|
 | 97 | 
 | 
|---|
 | 98 | { TIETravelLog }
 | 
|---|
 | 99 | 
 | 
|---|
 | 100 | constructor TIETravelLog.Create(AOwner: TComponent);
 | 
|---|
 | 101 | 
 | 
|---|
 | 102 | begin
 | 
|---|
 | 103 |   inherited Create(AOwner);
 | 
|---|
 | 104 |   FAbout := 'TIETravelLog. ' + WEB_SITE;
 | 
|---|
 | 105 |   FEnabled := True;
 | 
|---|
 | 106 | end;
 | 
|---|
 | 107 | 
 | 
|---|
 | 108 | procedure TIETravelLog.SetAbout(const Value: string);
 | 
|---|
 | 109 | begin
 | 
|---|
 | 110 |   Exit;
 | 
|---|
 | 111 | end;
 | 
|---|
 | 112 | 
 | 
|---|
 | 113 | function TIETravelLog.TravelTo(OffSet: Integer): HRESULT;
 | 
|---|
 | 114 | var
 | 
|---|
 | 115 |   Cancel: Boolean;
 | 
|---|
 | 116 | begin
 | 
|---|
 | 117 |   Cancel := False;
 | 
|---|
 | 118 |   Result := S_False;
 | 
|---|
 | 119 |   if FEnabled and Assigned(EmbeddedWB) and Assigned(EmbeddedWB.Document) and
 | 
|---|
 | 120 |     (Stg.GetRelativeEntry(OffSet, Entry) = S_OK) then
 | 
|---|
 | 121 |   begin
 | 
|---|
 | 122 |     if Assigned(FOnTravelTo) then
 | 
|---|
 | 123 |       FOnTravelTo(OffSet, Cancel);
 | 
|---|
 | 124 |   end;
 | 
|---|
 | 125 |   if not Cancel then
 | 
|---|
 | 126 |     Result := Stg.TravelTo(Entry);
 | 
|---|
 | 127 | end;
 | 
|---|
 | 128 | 
 | 
|---|
 | 129 | procedure TIETravelLog._Enumerate(Flags: Cardinal);
 | 
|---|
 | 130 | var
 | 
|---|
 | 131 |   Cancel: Boolean;
 | 
|---|
 | 132 |   Fetched: Cardinal;
 | 
|---|
 | 133 |   Url, Title: PWideChar;
 | 
|---|
 | 134 | begin
 | 
|---|
 | 135 |   if FEnabled and Assigned(EmbeddedWB) and Assigned(EmbeddedWB.Document) then
 | 
|---|
 | 136 |   begin
 | 
|---|
 | 137 |     Cancel := False;
 | 
|---|
 | 138 |     Stg.EnumEntries(Flags, Enum);
 | 
|---|
 | 139 |     if Enum <> nil then
 | 
|---|
 | 140 |       while (Enum.next(1, Entry, Fetched) = S_OK) and not Cancel do
 | 
|---|
 | 141 |       begin
 | 
|---|
 | 142 |         if Assigned(fOnEntry) and Succeeded(Entry.GetTitle(Title)) and Succeeded(Entry.GetUrl(Url)) then
 | 
|---|
 | 143 |           fOnEntry(Title, Url, Cancel);
 | 
|---|
 | 144 |       end;
 | 
|---|
 | 145 |   end;
 | 
|---|
 | 146 | end;
 | 
|---|
 | 147 | 
 | 
|---|
 | 148 | procedure TIETravelLog.EnumerateBack;
 | 
|---|
 | 149 | begin
 | 
|---|
 | 150 |   if FEnabled and Assigned(EmbeddedWB) and Assigned(EmbeddedWB.Document) then
 | 
|---|
 | 151 |     _Enumerate(TLEF_RELATIVE_BACK);
 | 
|---|
 | 152 | end;
 | 
|---|
 | 153 | 
 | 
|---|
 | 154 | procedure TIETravelLog.EnumerateForward;
 | 
|---|
 | 155 | begin
 | 
|---|
 | 156 |   if FEnabled and Assigned(EmbeddedWB) and Assigned(EmbeddedWB.Document) then
 | 
|---|
 | 157 |     _Enumerate(TLEF_RELATIVE_FORE);
 | 
|---|
 | 158 | end;
 | 
|---|
 | 159 | 
 | 
|---|
 | 160 | function TIETravelLog.Connect: Boolean;
 | 
|---|
 | 161 | var
 | 
|---|
 | 162 |   ISP: IServiceProvider;
 | 
|---|
 | 163 | begin
 | 
|---|
 | 164 |   Result := False;
 | 
|---|
 | 165 |   if FEnabled and Assigned(EmbeddedWB) and Assigned(EmbeddedWB.Document) then
 | 
|---|
 | 166 |   begin
 | 
|---|
 | 167 |     if Succeeded(EmbeddedWB.Application.QueryInterface(IServiceprovider, ISP)) and
 | 
|---|
 | 168 |       Succeeded(ISP.QueryService(SID_STravelLogCursor, IID_ITravelLogStg, Stg)) then
 | 
|---|
 | 169 |       Result := True;
 | 
|---|
 | 170 |   end;
 | 
|---|
 | 171 | end;
 | 
|---|
 | 172 | 
 | 
|---|
 | 173 | function TIETravelLog.GetRelativeEntry(OffSet: Integer; out Title, Url: WideString): HRESULT;
 | 
|---|
 | 174 | var
 | 
|---|
 | 175 |   WUrl, WTitle: PWideChar;
 | 
|---|
 | 176 | begin
 | 
|---|
 | 177 |   Result := S_False;
 | 
|---|
 | 178 |   if FEnabled and Assigned(EmbeddedWB) and Assigned(EmbeddedWB.Document) then
 | 
|---|
 | 179 |     Result := Stg.GetRelativeEntry(OffSet, Entry);
 | 
|---|
 | 180 |   if Result = S_OK then
 | 
|---|
 | 181 |   begin
 | 
|---|
 | 182 |     if Succeeded(Entry.GetTitle(WTitle)) then
 | 
|---|
 | 183 |       Title := WTitle;
 | 
|---|
 | 184 |     if Succeeded(Entry.GetUrl(WUrl)) then
 | 
|---|
 | 185 |       Url := WUrl;
 | 
|---|
 | 186 |   end;
 | 
|---|
 | 187 | end;
 | 
|---|
 | 188 | 
 | 
|---|
 | 189 | function TIETravelLog.GetCount(Flags: DWORD; out Entries: DWORD): HRESULT;
 | 
|---|
 | 190 | begin
 | 
|---|
 | 191 |   Result := S_False;
 | 
|---|
 | 192 |   if FEnabled and Assigned(EmbeddedWB) and Assigned(EmbeddedWB.Document) then
 | 
|---|
 | 193 |   begin
 | 
|---|
 | 194 |     Result := Stg.GetCount(Flags, Entries);
 | 
|---|
 | 195 |     if Assigned(FOnGetCount) then
 | 
|---|
 | 196 |       FOnGetCount(Flags, Entries);
 | 
|---|
 | 197 |   end;
 | 
|---|
 | 198 | end;
 | 
|---|
 | 199 | 
 | 
|---|
 | 200 | function TIETravelLog.CreateEntry(const OffSet: Integer; const Url, Title: WideString): HRESULT;
 | 
|---|
 | 201 | var
 | 
|---|
 | 202 |   Dummy: ITravelLogEntry;
 | 
|---|
 | 203 | begin
 | 
|---|
 | 204 |   Result := S_False;
 | 
|---|
 | 205 |   if FEnabled and Assigned(EmbeddedWB) and Assigned(EmbeddedWB.Document) and
 | 
|---|
 | 206 |     (Stg.GetRelativeEntry(OffSet, Entry) = S_OK)
 | 
|---|
 | 207 |     then
 | 
|---|
 | 208 |     Result := Stg.CreateEntry(StringToOleStr(Url), StringToOleStr(Title), Entry, TRUE, Dummy)
 | 
|---|
 | 209 | end;
 | 
|---|
 | 210 | 
 | 
|---|
 | 211 | procedure TIETravelLog.Enumerate;
 | 
|---|
 | 212 | begin
 | 
|---|
 | 213 |   if FEnabled and Assigned(EmbeddedWB) and Assigned(EmbeddedWB.Document) then
 | 
|---|
 | 214 |     _Enumerate(TLEF_ABSOLUTE);
 | 
|---|
 | 215 | end;
 | 
|---|
 | 216 | 
 | 
|---|
 | 217 | function TIETravelLog.RemoveEntry(OffSet: Integer): HRESULT;
 | 
|---|
 | 218 | var
 | 
|---|
 | 219 |   Title, Url: WideString;
 | 
|---|
 | 220 |   Cancel: Boolean;
 | 
|---|
 | 221 | begin
 | 
|---|
 | 222 |   Cancel := False;
 | 
|---|
 | 223 |   Result := S_False;
 | 
|---|
 | 224 |   if FEnabled and Assigned(EmbeddedWB) and Assigned(EmbeddedWB.Document) and
 | 
|---|
 | 225 |     (GetRelativeEntry(OffSet, Title, Url) = S_OK) then
 | 
|---|
 | 226 |   begin
 | 
|---|
 | 227 |     if Assigned(FOnRemoveEntry) then
 | 
|---|
 | 228 |       FOnRemoveEntry(Title, Cancel);
 | 
|---|
 | 229 |     if not Cancel then
 | 
|---|
 | 230 |       Result := RemoveEntryByUrl(Url);
 | 
|---|
 | 231 |   end;
 | 
|---|
 | 232 | end;
 | 
|---|
 | 233 | 
 | 
|---|
 | 234 | function TIETravelLog.RemoveEntryByTitle(const Title: WideString): HRESULT;
 | 
|---|
 | 235 | var
 | 
|---|
 | 236 |   Fetched: Cardinal;
 | 
|---|
 | 237 |   pTitle: PWideChar;
 | 
|---|
 | 238 |   Cancel: Boolean;
 | 
|---|
 | 239 | begin
 | 
|---|
 | 240 |   Cancel := False;
 | 
|---|
 | 241 |   Result := S_False;
 | 
|---|
 | 242 |   if FEnabled and Assigned(EmbeddedWB) and Assigned(EmbeddedWB.Document) and
 | 
|---|
 | 243 |     (Stg.EnumEntries(TLEF_ABSOLUTE, Enum) = S_OK) then
 | 
|---|
 | 244 |     while (Enum.next(1, Entry, Fetched) = S_OK) do
 | 
|---|
 | 245 |     begin
 | 
|---|
 | 246 |       if Succeeded(Entry.GetTitle(pTitle)) and (Title = pTitle) then
 | 
|---|
 | 247 |       begin
 | 
|---|
 | 248 |         if Assigned(FOnRemoveEntry) then
 | 
|---|
 | 249 |           FOnRemoveEntry(Title, Cancel);
 | 
|---|
 | 250 |         if not Cancel then
 | 
|---|
 | 251 |           Result := Stg.RemoveEntry(Entry);
 | 
|---|
 | 252 |       end;
 | 
|---|
 | 253 |     end;
 | 
|---|
 | 254 | end;
 | 
|---|
 | 255 | 
 | 
|---|
 | 256 | function TIETravelLog.RemoveEntryByUrl(const Url: WideString): HRESULT;
 | 
|---|
 | 257 | var
 | 
|---|
 | 258 |   Fetched: Cardinal;
 | 
|---|
 | 259 |   pUrl: PWideChar;
 | 
|---|
 | 260 |   Cancel: Boolean;
 | 
|---|
 | 261 | begin
 | 
|---|
 | 262 |   Cancel := False;
 | 
|---|
 | 263 |   Result := S_False;
 | 
|---|
 | 264 |   if FEnabled and Assigned(EmbeddedWB) and Assigned(EmbeddedWB.Document) and
 | 
|---|
 | 265 |     (Stg.EnumEntries(TLEF_ABSOLUTE, Enum) = S_OK)
 | 
|---|
 | 266 |     then
 | 
|---|
 | 267 |     while (Enum.next(1, Entry, Fetched) = S_OK) do
 | 
|---|
 | 268 |     begin
 | 
|---|
 | 269 |       if Succeeded(Entry.GetUrl(pUrl)) and (Url = pUrl) then
 | 
|---|
 | 270 |       begin
 | 
|---|
 | 271 |         if Assigned(FOnRemoveEntry) then
 | 
|---|
 | 272 |           FOnRemoveEntry(Url, Cancel);
 | 
|---|
 | 273 |         if not Cancel then
 | 
|---|
 | 274 |           Result := Stg.RemoveEntry(Entry);
 | 
|---|
 | 275 |       end;
 | 
|---|
 | 276 |     end;
 | 
|---|
 | 277 | end;
 | 
|---|
 | 278 | 
 | 
|---|
 | 279 | procedure TIETravelLog.ClearSession;
 | 
|---|
 | 280 | var
 | 
|---|
 | 281 |   Fetched: Cardinal;
 | 
|---|
 | 282 | begin
 | 
|---|
 | 283 |   if FEnabled and Assigned(EmbeddedWB) and Assigned(EmbeddedWB.Document) and
 | 
|---|
 | 284 |     (Stg.EnumEntries(TLEF_ABSOLUTE, Enum) = S_OK) then
 | 
|---|
 | 285 |     while (Enum.Next(1, Entry, Fetched) = S_OK) do
 | 
|---|
 | 286 |       Stg.RemoveEntry(Entry);
 | 
|---|
 | 287 | end;
 | 
|---|
 | 288 | 
 | 
|---|
 | 289 | end.
 | 
|---|