[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[vidalia-svn] r2449: * ensure that additional service options like excludenodes a (vidalia/branches/hidden-services/src/vidalia/config)



Author: borkdomenik
Date: 2008-03-23 13:59:21 -0400 (Sun, 23 Mar 2008)
New Revision: 2449

Modified:
   vidalia/branches/hidden-services/src/vidalia/config/servicepage.cpp
Log:
* ensure that additional service options like excludenodes are still set after configuring service with Vidalia
* [Directory not found] if the dir of a disabled service has been removed/deleted

Modified: vidalia/branches/hidden-services/src/vidalia/config/servicepage.cpp
===================================================================
--- vidalia/branches/hidden-services/src/vidalia/config/servicepage.cpp	2008-03-23 17:42:51 UTC (rev 2448)
+++ vidalia/branches/hidden-services/src/vidalia/config/servicepage.cpp	2008-03-23 17:59:21 UTC (rev 2449)
@@ -74,6 +74,7 @@
   	QString directoryPath = ui.serviceWidget->item(index,3)->text();
   	bool enabled = _services->value(index).enabled();
   	Service temp(address, virtualPort, physicalAddress, directoryPath, enabled);
+  	temp.setAdditionalServiceOptions(_services->value(ui.serviceWidget->currentRow()).additionalServiceOptions());
     serviceList.push_back(temp);
     if(enabled) {
   	  publishedServices.push_back(temp);	
@@ -132,8 +133,7 @@
 	serviceConfString.append("hiddenservicedir=" + string_escape(temp.serviceDirectory()) + " ");
 	serviceConfString.append("hiddenserviceport=" + string_escape(temp.virtualPort() +
 	  (temp.physicalAddressPort().isEmpty() ? "" : " " + temp.physicalAddressPort()) + " "));
-	/* TODO we promised to _not_ destroy existing advanced configurations
-	* or multiple port configurations. we should better keep that promise. */
+	serviceConfString.append(" "+ temp.additionalServiceOptions());
   }
   _serviceSettings->apply(serviceConfString, &errmsg);
 }
@@ -195,6 +195,31 @@
 Service
 ServicePage::generateService(QString s)
 {
+  QString additionalOptions = s;
+  // remove directory
+  int index = additionalOptions.indexOf("250",1);
+  additionalOptions.remove(0, index+4);
+  // remove the first appearance of the port
+  int startindex = additionalOptions.indexOf("hiddenserviceport", 0, Qt::CaseInsensitive);
+  int endindex = additionalOptions.indexOf("250", startindex)+4;
+  additionalOptions.remove(startindex, (endindex-startindex));
+  //remove all appearances of "250"
+  while(additionalOptions.contains("250")) {
+	  int i = additionalOptions.indexOf("250", 0);
+	  additionalOptions.remove(i, 4);
+  }
+  //quote the values
+  int j = additionalOptions.indexOf("=", 0);
+  while(j != -1) {
+    additionalOptions.insert(j+1, "\"");
+    int end = additionalOptions.indexOf("\n", j);
+    additionalOptions.insert(end, "\"");
+    j = additionalOptions.indexOf("=", end);
+  }
+  additionalOptions.insert(additionalOptions.length(), "\"");
+  //replace the line brakes with a space and create one single line
+  additionalOptions.replace(QString("\n"), QString(" "));
+
   QString address, virtualPort, physAddressPort, serviceDir;
   // service directory
   QStringList strList = s.split("\n");
@@ -233,6 +258,7 @@
       address = hostname;
     }  
   Service service(address, virtualPort, physAddressPort, serviceDir, true);
+  service.setAdditionalServiceOptions(additionalOptions);
   return service;	
 }
 
@@ -269,7 +295,25 @@
     cboxitem->setFlags(Qt::ItemIsSelectable);
     QTableWidgetItem *addressitem = new QTableWidgetItem();
     addressitem->setFlags(Qt::ItemIsSelectable);
-    addressitem->setText(tempService.serviceAddress());
+    if(tempService.serviceAddress().length() < 0) {
+      addressitem->setText(tempService.serviceAddress());
+    } else {
+        QString serviceHostnameDir = tempService.serviceDirectory(); 
+        serviceHostnameDir.append("/");
+        serviceHostnameDir.append("hostname");
+        QFile file(serviceHostnameDir);
+        if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+          addressitem->setText("[Directory not found]");
+        } else {
+            QTextStream in(&file);
+            QString hostname;
+            while (!in.atEnd()) {
+              hostname.append(in.readLine());
+            }
+            addressitem->setText(hostname);
+            tempService.setServiceAddress(hostname);
+          }        
+      }
     QTableWidgetItem *serviceDir = new QTableWidgetItem(tempService.serviceDirectory(),0);
     if(tempService.enabled()) {
       cboxitem->setCheckState(Qt::Checked);