|
I am trying to retrieve a website's favicon using the following script...
public String FaviconPath(csExWB.cEXWB web)
{
string Host = web.LocationUrl;
IHTMLElementCollection collect = web.GetElementsByTagName(true, "link");
foreach (IHTMLElement element in collect)
{
if (element.getAttribute("rel", 2).ToString().ToLower() == "shortcut icon" ||
element.getAttribute("rel", 2).ToString().ToLower() == "icon" ||
element.getAttribute("type", 2).ToString().ToLower() == "image/x-icon")
{
if (element.getAttribute("href", 2) != null)
{
return element.getAttribute("href", 2).ToString().ToLower();
}
}
}
if (Host.EndsWith(".com/") || Host.EndsWith(".net/"))
{
return Host + "favicon.ico";
}
return null;
}
public Image SiteFavicon(csExWB.cEXWB web)
{
string iconPath = FaviconPath(web);
Stream myStream = null;
WebRequest requestImg = WebRequest.Create(FaviconPath(web));
requestImg.Timeout = 10000;
WebResponse response = requestImg.GetResponse();
if (response.ContentLength > 0)
{
myStream = response.GetResponseStream();
}
Image i;
i = Image.FromStream(myStream);
Program.Cache.Insert(FaviconPath(web), i, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes( 60 ));
if (i != null)
return i;
else
return Phoenix_Explorer.Properties.Resources.defaultpic;
}
and am wondering why i still cannot achieve a website's favicon unless the site URL ends with ".com/" or ".net/". Is this script wrong in any way?
And also, i was wondering how i would get the website's hostname ( like the property in the Microsoft Webbrowser control ) as i am using the CsEXWB control ( http://www.codeproject.com/KB/miscctrl/csEXWB.aspx )
and i currently doesnt have any properties or methods to get the host.
Also, is there a common IHTMLelement used to store the site's homepage?
|
|
|
|
|
Please help!
I keep getting the following error message:
Cannot implicitly convert type XAPI to XAPI. An explicit convertion exists (are you missing a cast?)
I have declared a variable of type XAPI.
My line of code looks like this:
T = AccpacObject.OpenView("SomeValue", "SomeValue");
Illegal Operation
|
|
|
|
|
I'm not sure how you've set up this variable of yours. But did you try to just cast it for now:
T = (XAPI)AccpacObject.OpenView("SomeValue", "SomeValue");
The only way i can see this happening is if you have two classes in two different places with the same name, and it won't convert between them because they're not actually the same class (even if they contain exactly the same stuff).
My current favourite word is: I'm starting to run out of fav. words!
-SK Genius
Game Programming articles start - here[ ^]-
|
|
|
|
|
Do you have more than one XAPI class ? What is AccpacObject ?
Christian Graus
Please read this if you don't understand the answer I've given you
"also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
|
|
|
|
|
I think AccpacObject.OpenView returns a object of type interface and you have to cast it to class type.
|
|
|
|
|
On Pete's recommendation I'm having a play with MoQ. Just for S&G I have an IPerson which defines FirstName, LastName, and DateOfBirth and a Suspect class which implements IPerson.
Now, I want to (for arguments sake) "test" something on this class, namely that if I set FirstName to something, it returns what what it was setup with:
var mockery = new Mock[Suspect]();
mockery.Expect(x => x.FirstName).Returns("Martin");
Assert.AreEqual("Martin", mockery.Object.FirstName);
The test fails because mockery.Object.FirstName returns null.
However this test (based on the interface) passes:
var mockery = new Mock[IPerson]();
mockery.Expect(x => x.FirstName).Returns("Martin");
Assert.AreEqual("Martin", mockery.Object.FirstName);
Why does this pass? What am I missing? Why can't I mock concrete classes, rather than interfaces, especially if a class doesn't implement an interface?
*Note - Ignore the square brackets, they're supposed to be < and > symbols but they ain't working for me!
|
|
|
|
|
martin_hughes wrote: Why can't I mock concrete classes
Try this:
"I've seen better looking asphalt functions!"
Or in a high-pitched whiny voice:
"Look at meeeeee! I'm concreteeeeeete! Neener, neener!"
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
We like to call it tarmac over here :p
|
|
|
|
|
Ahhh!!!
What is this 'var' you speak of?
*SpacixOne runs and hides from the possible JScript.NET*
-Spacix
All your skynet questions[ ^] belong to solved
I dislike the black-and-white voting system on questions/answers.
|
|
|
|
|
In case you're being serious (and for the benefit of anybody who happens on this thread who isn't up on .NET 3.5), the var keyword is used to return a strongly typed object where the compiler infers the object from the type of variable. This allows you to do something like this:
var myClass = from p in something
where p.MyItem == 1
select new { p.MyItem, 1, true, p.IsThisCleverOrNot };
|
|
|
|
|
But it's better to make fun of JScript.NET aka the worlds craziest thing to come from .NET
Well... debatable with J#
-Spacix
All your skynet questions[ ^] belong to solved
I dislike the black-and-white voting system on questions/answers.
|
|
|
|
|
Martin - the whole point of mock objects is to create portions of code that are there for testing purposes using Test Driven Development techniques. Basically this means that the mock object will be replaced by a concrete implementation *at a later stage*. Consequently, you test your object against the interface and not the concrete implementation, i.e. it really makes no sense at this stage.
|
|
|
|
|
Yeahhhhh........ but.
Wouldn't you come across a situation where you have a big old object which is a black box for a whole bunch of other stuff, this thing is great, works brilliantly and you can rely on the results. In a testing environment you want the ability to say ok, I have this super-dooper object, given input x I know it will return y, but I don't want to instantiate it for testing purposes (maybe it really goes and affects a database or contacts a webservice or something) I just want to say here's a simulation (or mock) of that object and use that to test/create new functionality in my app?
|
|
|
|
|
Well - in order to do this, you'd end up mocking the object itself. So, you'd create a public interface that "wrapped" this object and then you call this.
|
|
|
|
|
Ah well that makes sense, and may just come in handy later today...
|
|
|
|
|
You can click the < and > buttons to have CP insert them for you.
Cheers,
Vikram.
The hands that help are holier than the lips that pray.
|
|
|
|
|
It depends on what mocking framework you use.
Some use runtime subclassing + implementing interfaces.
Others are more hardcore and relies on .NET profiling API to intercept the jitter and add their own code to any (sealed / non virtual members) concrete class / static functions etc.
While it is true that it is wise to use interfaces when practising TDD, its not that uncommon that you get a codebase that is not created using TDD and thus you might be forced to create tests that uses those concrete classes.
In such case you are either forced to do some (alot) refactoring of the codebase before you start writing tests, or you can use a mock framework that are able to mock those concrete classes.
And that is just a matter of taste / religion.
Im personally against the concept of altering sealed / non virtual methods because there is a reason they were designed that way in the first place.
However, I can see the benefit of it in cases where you have an existing codebase..
But Im a bit too paranoid to trust that the mangled code will work correctlt just because it wasnt intended to be modified.
---
Also, your example is not how it is intended to be used.
You are supposed to use the mocks when interacting with other, non mocked components.
eg:
//EDIT CP code blocks are crazy today...
var mockery = new Mock[IPerson]();
mockery.Expect(x => x.FirstName).Returns("Martin");
FooComponent foo = new FooComponent();
var res = foo.DoStuff(123,444,55,mockery);
assert.AreEqual(res , 123 , "incorrect value from foo.DoStuff");
//if this fails, then the FooComponent did not interact with the mock as expected
assert.xxxx ( whatever way you test if the mock methods was called );
This way you can see if your test subject interacts correctly with the mock.
In this kind of case, it _can_ be useful to mock concrete classes.
To force it to return something instead of running its own code.
Just so you can see that your test subject interacts with the mock.
modified on Friday, May 23, 2008 6:50 AM
|
|
|
|
|
Thanks -
Roger Alsing wrote: var mockery = new Mock[IPerson]();
mockery.Expect(x => x.FirstName).Returns("Martin");
FooComponent foo = new FooComponent();
var res = foo.DoStuff(123,444,55,mockery);
I basically ripped the example from the MoQ Quick Start to ask the question, so I blame them
|
|
|
|
|
I am printing a line1 but on the next line i want to print Line2 so how can i add blank line/or space so it can print like this. Is there any method in C# I don't want to hardcode the margins
Line1
Line2
Line3
e.Graphics.DrawString("Line1",font,Brushes.Black,e.Margin);
Thanks
|
|
|
|
|
Add a "\n" at the spot in the line where you want it to break.
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
e.Graphics.DrawString("Line1\r\nLine2",font,Brushes.Black,e.Margin);
Should do it, you might want to use Environment.Newline instead of \r\n though. And if you more than a few lines, i suggest you use a StringBuilder to make the string before drawing it it.
And if your string goes beyond the area in e.Margin then it simply won't be drawn (at least it shouldn't)
My current favourite word is: I'm starting to run out of fav. words!
-SK Genius
Game Programming articles start - here[ ^]-
|
|
|
|
|
You need to adjust the value in e.Margin to point to the next line for each item. Use MeasureString to get the size of the string you want to print (and add a bit so that the lines of text don't run together).
|
|
|
|
|
Thanks guys atleast somwhat it works but the problem is after printing text i want to added a horizontal Line so how could i determine to a start a new line now.
Can anymore show me some examples
StringBuilder sb = new StringBuilder();
if (CokeNameChecked)
{
sb.AppendLine("Name: " + CokeName);
}
if (PersonNameChecked)
{
sb.AppendLine("Subtopic: " + Person.Name);
}
e.Graphics.DrawString(sb.ToString(), _headingFont, Brushes.Black, e.MarginBounds);
e.Graphics.DrawLine(Pens.Black,e.MarginBounds);
}
|
|
|
|
|
As I said before - use MeasureString to find out how big your string is, i.e. what's the bounding rectangle.
|
|
|
|
|
instead of \n or \r\n, use Environment.NewLine
Christian Graus
Please read this if you don't understand the answer I've given you
"also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
|
|
|
|