void DviProtocolUpnp::WriteResource(const Brx& aUriTail, TIpAddress aAdapter, std::vector<char*>& aLanguageList, IResourceWriter& aResourceWriter) { if (aUriTail == kDeviceXmlName) { Brh xml; Brn xmlBuf; AutoMutex _(iLock); const TInt index = FindListenerForInterface(aAdapter); if (index == -1) { return; } if (iDevice.IsRoot()) { const Brx& cachedXml = iAdapters[index]->DeviceXml(); if (cachedXml.Bytes() > 0) { xmlBuf.Set(cachedXml); } } if (xmlBuf.Bytes() == 0) { GetDeviceXml(xml, aAdapter); if (iDevice.IsRoot()) { iAdapters[index]->SetDeviceXml(xml); xmlBuf.Set(iAdapters[index]->DeviceXml()); } else { xmlBuf.Set(xml); } } aResourceWriter.WriteResourceBegin(xmlBuf.Bytes(), kOhNetMimeTypeXml); aResourceWriter.WriteResource(xmlBuf.Ptr(), xmlBuf.Bytes()); aResourceWriter.WriteResourceEnd(); } else { Parser parser(aUriTail); Brn buf = parser.Next('/'); Brn rem = parser.Remaining(); if (buf == DviDevice::kResourceDir) { IResourceManager* resMgr = iDevice.ResourceManager(); if (resMgr != NULL) { resMgr->WriteResource(rem, aAdapter, aLanguageList, aResourceWriter); } } else if (rem == kServiceXmlName) { iLock.Wait(); DviService* service = 0; const TUint count = iDevice.ServiceCount(); for (TUint i=0; i<count; i++) { DviService& s = iDevice.Service(i); if (s.ServiceType().PathUpnp() == buf) { service = &s; break; } } iLock.Signal(); if (service == 0) { THROW(ReaderError); } DviProtocolUpnpServiceXmlWriter::Write(*service, *this, aResourceWriter); } } }
void DeviceBasic::WriteResource(const Brx& aUriTail, TIpAddress /*aInterface*/, std::vector<char*>& /*aLanguageList*/, IResourceWriter& aResourceWriter) { const Brn kIndexFile("index.html"); Bwh filePath(iConfigDir); Brn file; if (aUriTail.Bytes() == 0) { file.Set(kIndexFile); } else { file.Set(aUriTail); } const TByte sep = #ifdef _WIN32 '\\'; #else '/'; #endif filePath.Grow(filePath.Bytes() + 1 + file.Bytes()+1); filePath.Append(sep); filePath.Append(file); filePath.PtrZ(); const char* path = (const char*)filePath.Ptr(); FILE* fd = fopen(path, "rb"); if (fd == NULL) { return; } static const TUint kMaxReadSize = 4096; struct stat fileStats; (void)stat(path, &fileStats); TUint bytes = (TUint)fileStats.st_size; const char* mime = NULL; for (TUint i=filePath.Bytes()-1; i>0; i--) { if (filePath[i] == '/' || filePath[i] == '\\') { break; } if (filePath[i] == '.') { const char* ext = (const char*)filePath.Split(i+1, filePath.Bytes()-i-1).Ptr(); if (strcmp(ext, "html") == 0 || strcmp(ext, "htm") == 0) { mime = kOhNetMimeTypeHtml; } break; } } aResourceWriter.WriteResourceBegin(bytes, mime); do { TByte buf[kMaxReadSize]; TUint size = (bytes<kMaxReadSize? bytes : kMaxReadSize); size_t records_read = fread(buf, size, 1, fd); ASSERT(records_read == 1); aResourceWriter.WriteResource(buf, size); bytes -= size; } while (bytes > 0); aResourceWriter.WriteResourceEnd(); (void)fclose(fd); }
void DviProtocolUpnpServiceXmlWriter::Write(const DviService& aService, const DviProtocolUpnp& aDevice, IResourceWriter& aResourceWriter) { WriterBwh writer(1024); WriteServiceXml(writer, aService, aDevice); Brh xml; writer.TransferTo(xml); aResourceWriter.WriteResourceBegin(xml.Bytes(), kOhNetMimeTypeXml); aResourceWriter.WriteResource(xml.Ptr(), xml.Bytes()); aResourceWriter.WriteResourceEnd(); }
int32_t STDCALL DviDeviceC::WriteResourceEnd(void* aPtr) { // static IResourceWriter* writer = reinterpret_cast<IResourceWriter*>(aPtr); ASSERT(writer != NULL); try { writer->WriteResourceEnd(); } catch (...) { return -1; } return 0; }
int32_t STDCALL DviDeviceC::WriteResource(void* aPtr, const uint8_t* aData, uint32_t aBytes) { // static IResourceWriter* writer = reinterpret_cast<IResourceWriter*>(aPtr); ASSERT(writer != NULL); try { writer->WriteResource(aData, aBytes); } catch (...) { return -1; } return 0; }
int32_t STDCALL DviDeviceC::WriteResourceBegin(void* aPtr, uint32_t aTotalBytes, const char* aMimeType) { // static IResourceWriter* writer = reinterpret_cast<IResourceWriter*>(aPtr); ASSERT(writer != NULL); try { writer->WriteResourceBegin(aTotalBytes, aMimeType); } catch (...) { return -1; } return 0; }
void ExampleMediaPlayer::WriteResource(const Brx& aUriTail, TIpAddress /*aInterface*/, std::vector<char*>& /*aLanguageList*/, IResourceWriter& aResourceWriter) { if (aUriTail == kSongcastSenderIconFileName) { aResourceWriter.WriteResourceBegin(sizeof(kIconDriverSongcastSender), kIconDriverSongcastSenderMimeType); aResourceWriter.WriteResource(kIconDriverSongcastSender, sizeof(kIconDriverSongcastSender)); aResourceWriter.WriteResourceEnd(); } }