* Added driver specific settings to job data and job

setup dialog.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39191 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Michael Pfeiffer
2010-10-30 06:54:16 +00:00
parent 6e62e74423
commit de18d919e7
6 changed files with 315 additions and 37 deletions
+87 -1
View File
@@ -3,9 +3,13 @@
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
*/
#include "JobData.h"
#include <InterfaceDefs.h>
#include <Message.h>
#include "JobData.h"
#include <sstream>
#include "PrinterCap.h"
#include "DbgMsg.h"
@@ -39,6 +43,9 @@ static const char* kJDMarginUnit = "JJJJ_margin_unit";
static const char* kJDPhysicalRect = "JJJJ_physical_rect";
static const char* kJDScaledPhysicalRect = "JJJJ_scaled_physical_rect";
static const char* kJDResolution = "JJJJ_resolution";
static const char* kJDDriverSpecificSettings = "JJJJ_driverSpecificSettings";
static const char* kDriverSpecificSettingsSeparator = ";";
JobData::JobData(BMessage *msg, const PrinterCap *cap, Settings settings)
@@ -92,6 +99,7 @@ JobData::operator=(const JobData &job_data)
fMarginUnit = job_data.fMarginUnit;
fPhysicalRect = job_data.fPhysicalRect;
fScaledPhysicalRect = job_data.fScaledPhysicalRect;
fDriverSpecificSettings = job_data.fDriverSpecificSettings;
return *this;
}
@@ -288,6 +296,11 @@ JobData::load(BMessage *msg, const PrinterCap *cap, Settings settings)
fMarginUnit = (MarginUnit)msg->FindInt32(kJDMarginUnit);
else
fMarginUnit = kUnitInch;
BString serializedSettings;
if (msg->HasString(kJDDriverSpecificSettings))
msg->FindString(kJDDriverSpecificSettings, &serializedSettings);
DeserializePrinterSpecificSettings(serializedSettings);
}
@@ -406,4 +419,77 @@ JobData::save(BMessage *msg)
msg->RemoveName(kJDPageSelection);
if (fSettings == kJobSettings)
msg->AddInt32(kJDPageSelection, fPageSelection);
msg->RemoveName(kJDDriverSpecificSettings);
if (fSettings == kJobSettings)
{
BString serializedSettings;
SerializePrinterSpecificSettings(serializedSettings);
msg->AddString(kJDDriverSpecificSettings, serializedSettings);
}
}
bool
JobData::HasDriverSpecificSetting(const string& category) const
{
return fDriverSpecificSettings.find(category) !=
fDriverSpecificSettings.end();
}
const string&
JobData::DriverSpecificSetting(const string& category) const
{
return fDriverSpecificSettings.find(category)->second;
}
void
JobData::SetDriverSpecificSetting(const string& category, const string& value)
{
fDriverSpecificSettings[category] = value;
}
void
JobData::SerializePrinterSpecificSettings(BString& serializedSettings)
{
bool first = true;
map<string, string>::iterator it = fDriverSpecificSettings.begin();
for (; it != fDriverSpecificSettings.end(); it++) {
if (first)
first = false;
else
serializedSettings << kDriverSpecificSettingsSeparator;
serializedSettings << it->first.c_str()
<< kDriverSpecificSettingsSeparator
<< it->second.c_str();
}
}
void
JobData::DeserializePrinterSpecificSettings(BString& serializedSettings)
{
// Note: strtok_r terminates the string after the first token
fDriverSpecificSettings.clear();
int length = serializedSettings.Length() + 1;
char* state = NULL;
char* buffer = serializedSettings.LockBuffer(length);
const char* separator = kDriverSpecificSettingsSeparator;
char* token = strtok_r(buffer, separator, &state);
while (token != NULL) {
char* key = token;
token = strtok_r(NULL, separator, &state);
if (token == NULL)
break;
char* value = token;
fDriverSpecificSettings[key] = value;
token = strtok_r(NULL, separator, &state);
}
serializedSettings.UnlockBuffer(0);
}