void PageSerializer::serializeFrame(Frame* frame) { Document* document = frame->document(); URL url = document->url(); if (!url.isValid() || url.isBlankURL()) { // For blank frames we generate a fake URL so they can be referenced by their containing frame. url = urlForBlankFrame(frame); } if (m_resourceURLs.contains(url)) { // FIXME: We could have 2 frame with the same URL but which were dynamically changed and have now // different content. So we should serialize both and somehow rename the frame src in the containing // frame. Arg! return; } Vector<Node*> nodes; SerializerMarkupAccumulator accumulator(*this, *document, &nodes); TextEncoding textEncoding(document->charset()); CString data; if (!textEncoding.isValid()) { // FIXME: iframes used as images trigger this. We should deal with them correctly. return; } String text = accumulator.serializeNodes(*document->documentElement(), 0, IncludeNode); CString frameHTML = textEncoding.encode(text, EntitiesForUnencodables); m_resources->append(Resource(url, document->suggestedMIMEType(), SharedBuffer::create(frameHTML.data(), frameHTML.length()))); m_resourceURLs.add(url); for (Vector<Node*>::iterator iter = nodes.begin(); iter != nodes.end(); ++iter) { Node* node = *iter; if (!is<Element>(*node)) continue; Element& element = downcast<Element>(*node); // We have to process in-line style as it might contain some resources (typically background images). if (is<StyledElement>(element)) retrieveResourcesForProperties(downcast<StyledElement>(element).inlineStyle(), document); if (is<HTMLImageElement>(element)) { HTMLImageElement& imageElement = downcast<HTMLImageElement>(element); URL url = document->completeURL(imageElement.fastGetAttribute(HTMLNames::srcAttr)); CachedImage* cachedImage = imageElement.cachedImage(); addImageToResources(cachedImage, imageElement.renderer(), url); } else if (is<HTMLLinkElement>(element)) { HTMLLinkElement& linkElement = downcast<HTMLLinkElement>(element); if (CSSStyleSheet* sheet = linkElement.sheet()) { URL url = document->completeURL(linkElement.getAttribute(HTMLNames::hrefAttr)); serializeCSSStyleSheet(sheet, url); ASSERT(m_resourceURLs.contains(url)); } } else if (is<HTMLStyleElement>(element)) { if (CSSStyleSheet* sheet = downcast<HTMLStyleElement>(element).sheet()) serializeCSSStyleSheet(sheet, URL()); } } for (Frame* childFrame = frame->tree().firstChild(); childFrame; childFrame = childFrame->tree().nextSibling()) serializeFrame(childFrame); }
void PageSerializer::serialize(Page* page) { serializeFrame(page->mainFrame()); }
void PageSerializer::serializeFrame(Frame* frame) { Document* document = frame->document(); KURL url = document->url(); if (!url.isValid() || url.protocolIs("about")) { // For blank frames we generate a fake URL so they can be referenced by their containing frame. url = urlForBlankFrame(frame); } if (m_resourceURLs.contains(url)) { // FIXME: We could have 2 frame with the same URL but which were dynamically changed and have now // different content. So we should serialize both and somehow rename the frame src in the containing // frame. Arg! return; } Vector<Node*> nodes; SerializerMarkupAccumulator accumulator(this, document, &nodes); TextEncoding textEncoding(document->charset()); CString data; if (!textEncoding.isValid()) { // FIXME: iframes used as images trigger this. We should deal with them correctly. return; } String text = accumulator.serializeNodes(document->documentElement(), 0, IncludeNode); CString frameHTML = textEncoding.encode(text.characters(), text.length(), EntitiesForUnencodables); m_resources->append(Resource(url, document->suggestedMIMEType(), SharedBuffer::create(frameHTML.data(), frameHTML.length()))); m_resourceURLs.add(url); for (Vector<Node*>::iterator iter = nodes.begin(); iter != nodes.end(); ++iter) { Node* node = *iter; if (!node->isElementNode()) continue; Element* element = toElement(node); // We have to process in-line style as it might contain some resources (typically background images). retrieveResourcesForCSSDeclaration(element->style()); if (element->hasTagName(HTMLNames::imgTag)) { HTMLImageElement* imageElement = static_cast<HTMLImageElement*>(element); KURL url = document->completeURL(imageElement->getAttribute(HTMLNames::srcAttr)); CachedImage* cachedImage = imageElement->cachedImage(); addImageToResources(cachedImage, url); } else if (element->hasTagName(HTMLNames::linkTag)) { HTMLLinkElement* linkElement = static_cast<HTMLLinkElement*>(element); StyleSheet* sheet = linkElement->sheet(); if (sheet && sheet->isCSSStyleSheet()) { KURL url = document->completeURL(linkElement->getAttribute(HTMLNames::hrefAttr)); serializeCSSStyleSheet(static_cast<CSSStyleSheet*>(sheet), url); ASSERT(m_resourceURLs.contains(url)); } } else if (element->hasTagName(HTMLNames::styleTag)) { HTMLStyleElement* styleElement = static_cast<HTMLStyleElement*>(element); StyleSheet* sheet = styleElement->sheet(); if (sheet && sheet->isCSSStyleSheet()) serializeCSSStyleSheet(static_cast<CSSStyleSheet*>(sheet), KURL()); } } for (Frame* childFrame = frame->tree()->firstChild(); childFrame; childFrame = childFrame->tree()->nextSibling()) serializeFrame(childFrame); }
int main(int argc, char *argv[]) { pthread_t thread[1]; if (argc < 4) { // case if arguments are less than specified printf("Please use the program with arguments: %s <target-ip> <port> <filename>\n", argv[0]); return 0; } if ((server = gethostbyname(argv[1])) == NULL) error("ERROR: Receiver Address is Unknown or Wrong.\n"); // creating IPv4 data stream socket printf("Creating socket to %s Port %s...\n", argv[1], argv[2]); if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) error("ERROR: Create socket failed.\n"); // flag set to 1 (connection is established) isSocketOpen = 1; // initializing the socket host information memset(&receiverAddr, 0, sizeof(receiverAddr)); receiverAddr.sin_family = AF_INET; bcopy((char *)server->h_addr, (char *)&receiverAddr.sin_addr.s_addr, server->h_length); receiverAddr.sin_port = htons(atoi(argv[2])); // open the text file tFile = fopen(argv[argc-1], "r"); if (tFile == NULL) error("ERROR: File text not Found.\n"); if (pthread_create(&thread[0], NULL, childProcess, 0) != 0) error("ERROR: Failed to create thread for child. Please free some space.\n"); // read all characters from file and put in frameStorage int fcount = 0; int i = 0; char c; do { c = fgetc(tFile); if (i==DATAMAX) { frameStorage[fcount].data[i] = "\0"; i=0; fcount++; frameStorage[fcount] = malloc(sizeof(FRAME)); frameStorage[fcount].data = malloc((DATAMAX+1)*sizeof(Byte)); frameStorage[fcount].frameno = fcount%BUFSIZE; frameStorage[fcount].soh = SOH; frameStorage[fcount].stx = STX; frameStorage[fcount].etx = ETX; } if (c==EOF) { frameStorage[fcount].data[i] = Endfile; frameStorage[fcount].data[i+1] = "\0"; } else { frameStorage[fcount].data[i] = c; i++; } } while (c!=EOF); i=0; int offset; while (i<=fcount) { if (isXON) { if (sendto(sockfd, serializeFrame(i), 15+strlen(frameStorage[i].data), 0, (const struct sockaddr *) &receiverAddr, receiverAddrLen) != 15+strlen(frameStorage[i].data)) error("ERROR: sendto() sent buffer with size more than expected.\n"); printf("Sending frame no. %d: %s\n", i,frameStorage[i].data); i++; } else { while (!isXON) { printf("Waiting for XON...\n"); sleep(1); } } sleep(1); } fclose(tFile); printf("Frame sending done! Closing sockets...\n"); close(sockfd); isSocketOpen = 0; printf("Socket Closed!\n"); // finishing program and closing printf("TRANSMITTER Finished transmitting frames!\n"); printf("TRANSMITTER saying goodbye and thanks!\n"); return 0; }